HORIZON HASKELLDocslts/ghc-9.14.xd82dee82026-10-12Search names, modules, packages, or :: a typeCtrl K

GHC 9.14.1 · lts/ghc-9.14.x · d82dee8 · 2026-10-12

Modulecapability-0.5.0.1Haskell2010

Capability.Sink.Internal.Strategies

  • 3 types
  • Packagecapability-0.5.0.1
  • Exports3
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceStrategies.hs
newtypenewtype SinkStack (m :: Type -> Type) a
#

Accumulate sunk values in a reverse order list.

Constructors

  • SinkStack (m a)
Instances7HasSink, Monad, Functor, Applicative, MonadIO, PrimMonad, …
  • HasState tag [a] m => HasSink tag a (SinkStack m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • Monad m => Monad (SinkStack m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • Functor m => Functor (SinkStack m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • Applicative m => Applicative (SinkStack m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • MonadIO m => MonadIO (SinkStack m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • PrimMonad m => PrimMonad (SinkStack m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • type PrimState (SinkStack m) = PrimState mDefined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
newtypenewtype SinkDList (m :: Type -> Type) a
#

Accumulate sunk values in forward order in a difference list.

Constructors

  • SinkDList (m a)
Instances7HasSink, Monad, Functor, Applicative, MonadIO, PrimMonad, …
  • HasSink tag (DList a) m => HasSink tag a (SinkDList m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies

    This instance may seem a bit odd at first. All it does is wrap each yielded value in a single element difference list. How does re-yielding something else constitute a strategy for implementing HasSink in the first place? The answer is that difference lists form a monoid, which allows a second stragegy to be used which accumulates all yields in a single value, actually eliminating the HasSink constraint this time.

    SinkLog below in fact does this, so the easiest way to fully eliminate the HasSink constraint as described above is:

    deriving (HasSink tag w) via
      SinkDList (SinkLog (MonadState SomeStateMonad))
  • Monad m => Monad (SinkDList m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • Functor m => Functor (SinkDList m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • Applicative m => Applicative (SinkDList m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • MonadIO m => MonadIO (SinkDList m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • PrimMonad m => PrimMonad (SinkDList m)Defined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
  • type PrimState (SinkDList m) = PrimState mDefined in capability-0.5.0.1 · Capability.Sink.Internal.Strategies
newtypenewtype SinkLog (m :: Type -> Type) a
#

Accumulate sunk values with their own monoid.

Constructors

Instances8HasSink, HasWriter, Monad, Functor, Applicative, MonadIO, …

Orphan instances

10 instances
  • MonadState s m => HasSink tag s (MonadState m)
  • (HasSink tag a m, MonadTrans t, Monad (t m)) => HasSink tag a (Lift (t m))

    Lift one layer in a monad transformer stack.

    Note, that if the HasSink instance is based on HasState, then it is more efficient to apply Lift to the underlying state capability. E.g. you should favour

    deriving (HasSink tag w) via
      SinkLog (Lift (SomeTrans (MonadState SomeStateMonad)))

    over

    deriving (HasSink tag w) via
      Lift (SomeTrans (SinkLog (MonadState SomeStateMonad)))
  • (MutableRef ref, RefElement ref ~ s, HasSource tag ref m, PrimMonad m, PrimState m ~ MCState ref) => HasSink tag s (ReaderRef m)
  • Monad m => HasSink tag a (Stream (Of a) m)
  • (HasSource tag (IORef s) m, MonadIO m) => HasSink tag s (ReaderIORef m)
  • (Coercible from to, HasSink tag from m) => HasSink tag to (Coerce to m)

    Convert the state using safe coercion.

  • HasSink oldtag s m => HasSink newtag s (Rename oldtag m)

    Rename the tag.

  • (forall x. Coercible (m x) (t2 (t1 m) x), Monad m, HasSink tag a (t2 (t1 m))) => HasSink tag a ((:.:) t2 t1 m)

    Compose two accessors.

  • (tag ~ field, HasField' field record v, HasState oldtag record m) => HasSink tag v (Field field oldtag m)

    Zoom in on the record field field of type v in the state record.

  • (tag ~ pos, HasPosition' pos struct v, HasState oldtag struct m) => HasSink tag v (Pos pos oldtag m)

    Zoom in on the field at position pos of type v in the state struct.