content: -- | Defines a capability for computations that produce a stream of values
  -- as part of their execution.
  --
  -- Programs producing streams of data are common. Examples: emitting events on
  -- input, or emitting events whenever certain conditions are observed. streams
  -- are similar to Python generators.
  --
  -- The 'HasSink' capability enables separating the logic responsible for
  -- emitting events from that responsible for collecting or handling them.
  -- The name is because a sink is needed to consume the locally produced stream.
  --
  -- This can be thought of as a writer capability of a list of values @HasWriter
  -- tag [v]@ with @\\x -> tell \@tag [x]@ as a primitive operation. However, that
  -- implementation would be inefficient.
  --
  -- For example using the 'Streaming.Prelude.Stream' instance, a producer defined
  -- using this capability can be consumed efficiently in a streaming fashion.
  
  {-# LANGUAGE ConstraintKinds #-}
  {-# LANGUAGE KindSignatures #-}
  {-# LANGUAGE MagicHash #-}
  {-# LANGUAGE PolyKinds #-}
  
  module Capability.Sink
    ( -- * Relational capability
      module Capability.Sink.Internal.Class
      -- * Functional capability
    , HasSink'
    , TypeOf
      -- * Strategies
    , module Capability.Sink.Internal.Strategies
      -- ** Modifiers
    , module Capability.Accessors
    ) where
  
  import Capability.Sink.Internal.Class
  import Capability.Sink.Internal.Strategies
  import Capability.Accessors
  import Capability.TypeOf
  
  -- | Type synonym using the 'TypeOf' type family to specify 'HasSink'
  -- constraints without having to specify the type associated to a tag.
  type HasSink' (tag :: k) = HasSink tag (TypeOf k tag)
  