-- | Defines a capability for computations that consume a stream of values -- as part of their execution. -- -- Programs comsuming streams of data are common. Examples: rolling up input -- events. Sources are similar to Python generators. -- -- This can be thought of as a reader capability where there's no guarantee that -- one reads the same value each time. -- -- The 'HasSource' capability enables separating the logic responsible for -- emitting events from that responsible for collecting or handling them. -- The name is because a source is needed to produce the locally consumed stream. -- {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeInType #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE UndecidableInstances #-} module Capability.Source ( -- * Relational capability module Capability.Source.Internal.Class -- * Functional capability , HasSource' , TypeOf -- * Strategies , module Capability.Source.Internal.Strategies -- ** Modifiers , module Capability.Accessors ) where import Capability.Accessors import Capability.Source.Internal.Class import Capability.Source.Internal.Strategies import Capability.TypeOf -- | Type synonym using the 'TypeOf' type family to specify 'HasSource' -- constraints without having to specify the type associated to a tag. type HasSource' (tag :: k) = HasSource tag (TypeOf k tag)