| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Bluefin.Internal
Synopsis
- data Effects = Union Effects Effects
- type (:&) = 'Union
- newtype Eff (es :: Effects) a = UnsafeMkEff {
- unsafeUnEff :: IO a
- newtype EffReader r (es :: Effects) a = MkEffReader {
- unEffReader :: r -> Eff es a
- effReader :: forall r (es :: Effects) a. (r -> Eff es a) -> EffReader r es a
- runEffReader :: forall r (es :: Effects) a. r -> EffReader r es a -> Eff es a
- withEffToIO :: forall (e2 :: Effects) (es :: Effects) a. e2 :> es => ((forall r. (forall (e1 :: Effects). IOE e1 -> Eff (e1 :& es) r) -> IO r) -> IO a) -> IOE e2 -> Eff es a
- withEffToIO' :: forall (e2 :: Effects) (es :: Effects) a. e2 :> es => IOE e2 -> ((forall r. (forall (e1 :: Effects). IOE e1 -> Eff (e1 :& es) r) -> IO r) -> IO a) -> Eff es a
- withEffToIO_ :: forall (e :: Effects) (es :: Effects) a. e :> es => IOE e -> ((forall r. Eff es r -> IO r) -> IO a) -> Eff es a
- withEffToIO_' :: forall (e2 :: Effects) (es :: Effects) a. e2 :> es => IOE e2 -> ((forall r. (forall (e1 :: Effects). IOE e1 -> Eff (e1 :& es) r) -> IO r) -> IO a) -> Eff es a
- race :: forall (e2 :: Effects) (es :: Effects) a. e2 :> es => (forall (e :: Effects). IOE e -> Eff (e :& es) a) -> (forall (e :: Effects). IOE e -> Eff (e :& es) a) -> IOE e2 -> Eff es a
- connectCoroutines :: forall (es :: Effects) a b r. (forall (e :: Effects). Coroutine a b e -> Eff (e :& es) r) -> (forall (e :: Effects). a -> Coroutine b a e -> Eff (e :& es) r) -> Eff es r
- receiveStream :: forall a (es :: Effects) r. (forall (e :: Effects). Consume a e -> Eff (e :& es) r) -> (forall (e :: Effects). Stream a e -> Eff (e :& es) r) -> Eff es r
- consumeStream :: forall a (es :: Effects) r. (forall (e :: Effects). Consume a e -> Eff (e :& es) r) -> (forall (e :: Effects). Stream a e -> Eff (e :& es) r) -> Eff es r
- zipCoroutines :: forall (e1 :: Effects) (es :: Effects) a1 a2 b r. e1 :> es => Coroutine (a1, a2) b e1 -> (forall (e :: Effects). Coroutine a1 b e -> Eff (e :& es) r) -> (forall (e :: Effects). Coroutine a2 b e -> Eff (e :& es) r) -> Eff es r
- hoistReader :: (forall b. m b -> n b) -> ReaderT r m a -> ReaderT r n a
- withMonadIO :: forall (e :: Effects) (es :: Effects) r. e :> es => IOE e -> (forall (m :: Type -> Type). MonadIO m => m r) -> Eff es r
- withMonadFail :: forall (e :: Effects) (es :: Effects) r. e :> es => Exception String e -> (forall (m :: Type -> Type). MonadFail m => m r) -> Eff es r
- runPureEff :: (forall (es :: Effects). Eff es a) -> a
- unsafeCoerceEff :: forall (t :: Effects) r (t' :: Effects). Eff t r -> Eff t' r
- weakenEff :: forall (t :: Effects) (t' :: Effects) r. In t t' -> Eff t r -> Eff t' r
- insertFirst :: forall (b :: Effects) r (c1 :: Effects). Eff b r -> Eff (c1 :& b) r
- insertSecond :: forall (c1 :: Effects) (b :: Effects) r (c2 :: Effects). Eff (c1 :& b) r -> Eff (c1 :& (c2 :& b)) r
- insertManySecond :: forall (b :: Effects) (c :: Effects) (c1 :: Effects) r. b :> c => Eff (c1 :& b) r -> Eff (c1 :& c) r
- assoc1Eff :: forall (a :: Effects) (b :: Effects) (c :: Effects) r. Eff ((a :& b) :& c) r -> Eff (a :& (b :& c)) r
- pushFirst :: forall (a :: Effects) r (b :: Effects). Eff a r -> Eff (a :& b) r
- mergeEff :: forall (a :: Effects) r. Eff (a :& a) r -> Eff a r
- inContext :: forall (e2 :: Effects) (e1 :: Effects) r. e2 :> e1 => Eff (e1 :& e2) r -> Eff e1 r
- makeOp :: forall (e :: Effects) r. Eff (e :& e) r -> Eff e r
- useImpl :: forall (e :: Effects) (es :: Effects) r. e :> es => Eff e r -> Eff es r
- useImplUnder :: forall (e :: Effects) (es :: Effects) (e1 :: Effects) r. e :> es => Eff (e1 :& e) r -> Eff (e1 :& es) r
- useImplIn :: forall (e :: Effects) (es :: Effects) t r. e :> es => (t -> Eff (es :& e) r) -> t -> Eff es r
- useImplWithin :: forall (e :: Effects) (es :: Effects) t (e1 :: Effects) r. e :> es => (t -> Eff (e1 :& e) r) -> t -> Eff (e1 :& es) r
- data StateSource (e :: Effects) = StateSource
- newtype Exception exn (e :: Effects) = MkException (forall a. exn -> Eff e a)
- newtype State s (e :: Effects) = UnsafeMkState (IORef s)
- newtype Coroutine a b (e :: Effects) = MkCoroutine (a -> Eff e b)
- type Stream a = Coroutine a ()
- type Consume a = Coroutine () a
- class Handle (h :: Effects -> Type) where
- newtype In (a :: Effects) (b :: Effects) :: ZeroBitType = In# (# #)
- merge :: forall (a :: Effects). (# #) -> In (a :& a) a
- eq :: forall (a :: Effects). (# #) -> In a a
- fstI :: forall (a :: Effects) (b :: Effects). (# #) -> In a (a :& b)
- sndI :: forall (a :: Effects) (b :: Effects). (# #) -> In a (b :& a)
- cmp :: forall (a :: Effects) (b :: Effects) (c :: Effects). In a b -> In b c -> In a c
- bimap :: forall (a :: Effects) (b :: Effects) (c :: Effects) (d :: Effects). In a b -> In c d -> In (a :& c) (b :& d)
- assoc1 :: forall (a :: Effects) (b :: Effects) (c :: Effects). (# #) -> In ((a :& b) :& c) (a :& (b :& c))
- drop :: forall (a :: Effects) (b :: Effects) (c :: Effects). In a b -> In a (c :& b)
- here :: forall (a :: Effects) (b :: Effects) (c :: Effects). In a b -> In a (b :& c)
- w :: forall (a :: Effects) (b :: Effects) (c :: Effects). In (a :& b) c -> In a c
- w2 :: forall (b :: Effects) (a :: Effects) (c :: Effects). In (b :& a) c -> In a c
- b2 :: forall (a :: Effects) (b :: Effects) (c :: Effects). In a b -> In (a :& c) (b :& c)
- b :: forall (a :: Effects) (b :: Effects) (c :: Effects). In a b -> In (c :& a) (c :& b)
- subsume1 :: forall (e2 :: Effects) (e1 :: Effects). In e2 e1 -> In (e1 :& e2) e1
- subsume2 :: forall (e1 :: Effects) (e2 :: Effects). In e1 e2 -> In (e1 :& e2) e2
- class (es1 :: Effects) :> (es2 :: Effects)
- throw :: forall (e :: Effects) (es :: Effects) ex a. e :> es => Exception ex e -> ex -> Eff es a
- has :: forall (a :: Effects) (b :: Effects). a :> b => In a b
- data Dict c where
- unsafeCoerceDict :: Dict c -> Dict c'
- have :: forall (a :: Effects) (b :: Effects). In a b -> Dict (a :> b)
- try :: forall exn (es :: Effects) a. (forall (e :: Effects). Exception exn e -> Eff (e :& es) a) -> Eff es (Either exn a)
- handle :: forall exn (es :: Effects) a. (exn -> Eff es a) -> (forall (e :: Effects). Exception exn e -> Eff (e :& es) a) -> Eff es a
- catch :: forall exn (es :: Effects) a. (forall (e :: Effects). Exception exn e -> Eff (e :& es) a) -> (exn -> Eff es a) -> Eff es a
- rethrowIO :: forall ex (es :: Effects) (e1 :: Effects) (e2 :: Effects) r. (e1 :> es, e2 :> es, Exception ex) => IOE e1 -> Exception ex e2 -> Eff es r -> Eff es r
- bracket :: forall (es :: Effects) a b. Eff es a -> (a -> Eff es ()) -> (a -> Eff es b) -> Eff es b
- withStateInIO :: forall (e1 :: Effects) (es :: Effects) (e2 :: Effects) s r. (e1 :> es, e2 :> es) => IOE e1 -> State s e2 -> (IORef s -> IO r) -> Eff es r
- get :: forall (e :: Effects) (es :: Effects) s. e :> es => State s e -> Eff es s
- put :: forall (e :: Effects) (es :: Effects) s. e :> es => State s e -> s -> Eff es ()
- modify :: forall (e :: Effects) (es :: Effects) s. e :> es => State s e -> (s -> s) -> Eff es ()
- withScopedException_ :: ((forall a. e -> IO a) -> IO r) -> IO (Either e r)
- withStateSource :: forall (es :: Effects) a. (forall (e :: Effects). StateSource e -> Eff (e :& es) a) -> Eff es a
- newState :: forall (e :: Effects) (es :: Effects) s. e :> es => StateSource e -> s -> Eff es (State s e)
- runState :: forall s (es :: Effects) a. s -> (forall (e :: Effects). State s e -> Eff (e :& es) a) -> Eff es (a, s)
- yieldCoroutine :: forall (e1 :: Effects) (es :: Effects) a b. e1 :> es => Coroutine a b e1 -> a -> Eff es b
- yield :: forall (e1 :: Effects) (es :: Effects) a. e1 :> es => Stream a e1 -> a -> Eff es ()
- handleCoroutine :: forall a (es :: Effects) b z r. (a -> Eff es b) -> (z -> Eff es r) -> (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) z) -> Eff es r
- forEach :: forall a b (es :: Effects) r. (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r) -> (a -> Eff es b) -> Eff es r
- ignoreStream :: forall a (es :: Effects) r. (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) -> Eff es r
- inFoldable :: forall t (e1 :: Effects) (es :: Effects) a. (Foldable t, e1 :> es) => t a -> Stream a e1 -> Eff es ()
- enumerate :: forall (e2 :: Effects) (es :: Effects) a r. e2 :> es => (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) -> Stream (Int, a) e2 -> Eff es r
- enumerateFrom :: forall (e2 :: Effects) (es :: Effects) a r. e2 :> es => Int -> (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) -> Stream (Int, a) e2 -> Eff es r
- consumeEach :: forall b (es :: Effects) r. (forall (e :: Effects). Consume b e -> Eff (e :& es) r) -> Eff es b -> Eff es r
- await :: forall (e :: Effects) (es :: Effects) a. e :> es => Consume a e -> Eff es a
- type EarlyReturn = Exception
- withEarlyReturn :: forall r (es :: Effects). (forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r) -> Eff es r
- returnEarly :: forall (e :: Effects) (es :: Effects) r a. e :> es => EarlyReturn r e -> r -> Eff es a
- evalState :: forall s (es :: Effects) a. s -> (forall (e :: Effects). State s e -> Eff (e :& es) a) -> Eff es a
- withState :: forall s (es :: Effects) a. s -> (forall (e :: Effects). State s e -> Eff (e :& es) (s -> a)) -> Eff es a
- data Compound (e1 :: Effects -> Type) (e2 :: Effects -> Type) (ss :: Effects) where
- compound :: forall h1 (e1 :: Effects) h2 (e2 :: Effects). h1 e1 -> h2 e2 -> Compound h1 h2 (e1 :& e2)
- inComp :: forall (a :: Effects) (b :: Effects) (c :: Effects) r. (a :> b, b :> c) => (a :> c => r) -> r
- withCompound :: forall h1 h2 (e :: Effects) (es :: Effects) r. e :> es => Compound h1 h2 e -> (forall (e1 :: Effects) (e2 :: Effects). (e1 :> es, e2 :> es) => h1 e1 -> h2 e2 -> Eff es r) -> Eff es r
- withC1 :: forall e1 (e2 :: Effects -> Type) (ss :: Effects) (es :: Effects) r. ss :> es => Compound e1 e2 ss -> (forall (st :: Effects). st :> es => e1 st -> Eff es r) -> Eff es r
- withC2 :: forall (e1 :: Effects -> Type) e2 (ss :: Effects) (es :: Effects) r. ss :> es => Compound e1 e2 ss -> (forall (st :: Effects). st :> es => e2 st -> Eff es r) -> Eff es r
- putC :: forall (ss :: Effects) (es :: Effects) (e :: Effects -> Type). ss :> es => Compound e (State Int) ss -> Int -> Eff es ()
- getC :: forall (ss :: Effects) (es :: Effects) (e :: Effects -> Type). ss :> es => Compound e (State Int) ss -> Eff es Int
- runCompound :: forall e1 (s1 :: Effects) e2 (s2 :: Effects) (es :: Effects) r. e1 s1 -> e2 s2 -> (forall (es' :: Effects). Compound e1 e2 es' -> Eff (es' :& es) r) -> Eff (s1 :& (s2 :& es)) r
- yieldToList :: forall a (es :: Effects) r. (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) -> Eff es ([a], r)
- withYieldToList :: forall a (es :: Effects) r. (forall (e :: Effects). Stream a e -> Eff (e :& es) ([a] -> r)) -> Eff es r
- yieldToReverseList :: forall a (es :: Effects) r. (forall (e :: Effects). Stream a e -> Eff (e :& es) r) -> Eff es ([a], r)
- mapStream :: forall (e2 :: Effects) (es :: Effects) a b r. e2 :> es => (a -> b) -> (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) -> Stream b e2 -> Eff es r
- mapMaybe :: forall (e2 :: Effects) (es :: Effects) a b r. e2 :> es => (a -> Maybe b) -> (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) -> Stream b e2 -> Eff es r
- catMaybes :: forall (e2 :: Effects) (es :: Effects) a r. e2 :> es => (forall (e1 :: Effects). Stream (Maybe a) e1 -> Eff (e1 :& es) r) -> Stream a e2 -> Eff es r
- type Jump = EarlyReturn ()
- withJump :: forall (es :: Effects). (forall (e :: Effects). Jump e -> Eff (e :& es) ()) -> Eff es ()
- jumpTo :: forall (e :: Effects) (es :: Effects) a. e :> es => Jump e -> Eff es a
- unwrap :: forall (e :: Effects) (es :: Effects) a. e :> es => Jump e -> Maybe a -> Eff es a
- data IOE (e :: Effects) = MkIOE
- effIO :: forall (e :: Effects) (es :: Effects) a. e :> es => IOE e -> IO a -> Eff es a
- runEff :: (forall (e :: Effects) (es :: Effects). IOE e -> Eff (e :& es) a) -> IO a
- runEff_ :: (forall (e :: Effects). IOE e -> Eff e a) -> IO a
- unsafeProvideIO :: forall (es :: Effects) a. (forall (e :: Effects). IOE e -> Eff (e :& es) a) -> Eff es a
- connect :: forall a b (es :: Effects) r1 r2. (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r1) -> (forall (e2 :: Effects). a -> Coroutine b a e2 -> Eff (e2 :& es) r2) -> forall (e1 :: Effects) (e2 :: Effects). (e1 :> es, e2 :> es) => Eff es (Either (r1, a -> Coroutine b a e2 -> Eff es r2) (r2, b -> Coroutine a b e1 -> Eff es r1))
- head' :: forall a b r (es :: Effects). (forall (e :: Effects). Coroutine a b e -> Eff (e :& es) r) -> forall (e :: Effects). e :> es => Eff es (Either r (a, b -> Coroutine a b e -> Eff es r))
- newtype Writer w (e :: Effects) = Writer (Stream w e)
- runWriter :: forall w (es :: Effects) r. Monoid w => (forall (e :: Effects). Writer w e -> Eff (e :& es) r) -> Eff es (r, w)
- execWriter :: forall w (es :: Effects) r. Monoid w => (forall (e :: Effects). Writer w e -> Eff (e :& es) r) -> Eff es w
- tell :: forall (e :: Effects) (es :: Effects) w. e :> es => Writer w e -> w -> Eff es ()
- newtype Reader r (e :: Effects) = MkReader (State r e)
- runReader :: forall r (es :: Effects) a. r -> (forall (e :: Effects). Reader r e -> Eff (e :& es) a) -> Eff es a
- ask :: forall (e :: Effects) (es :: Effects) r. e :> es => Reader r e -> Eff es r
- asks :: forall (e :: Effects) (es :: Effects) r a. e :> es => Reader r e -> (r -> a) -> Eff es a
- local :: forall (e1 :: Effects) (es :: Effects) r a. e1 :> es => Reader r e1 -> (r -> r) -> Eff es a -> Eff es a
- newtype HandleReader (h :: Effects -> Type) (e :: Effects) = UnsafeMkHandleReader (State (h e) e)
- mapHandleReader :: forall (h :: Effects -> Type) (e :: Effects) (es :: Effects). (Handle h, e :> es) => HandleReader h e -> HandleReader h es
- localHandle :: forall (e :: Effects) (es :: Effects) h r. (e :> es, Handle h) => HandleReader h e -> (h es -> h es) -> Eff es r -> Eff es r
- askHandle :: forall (e :: Effects) (es :: Effects) h. (e :> es, Handle h) => HandleReader h e -> Eff es (h es)
- runHandleReader :: forall (e1 :: Effects) (es :: Effects) h r. (e1 :> es, Handle h) => h e1 -> (forall (e :: Effects). HandleReader h e -> Eff (e :& es) r) -> Eff es r
- newtype ConstEffect r (e :: k) = MkConstEffect r
- runConstEffect :: forall r (es :: Effects) a. r -> (forall (e :: Effects). ConstEffect r e -> Eff (e :& es) a) -> Eff es a
Documentation
Instances
| Handle (ConstEffect r :: Effects -> Type) Source # | |
Defined in Bluefin.Internal Methods mapHandle :: forall (e :: Effects) (es :: Effects). e :> es => ConstEffect r e -> ConstEffect r es Source # | |
newtype Eff (es :: Effects) a Source #
Constructors
| UnsafeMkEff | |
Fields
| |
newtype EffReader r (es :: Effects) a Source #
Because doing IO operations inside Eff requires a value-level
argument we can't give IO-related instances to Eff directly.
Instead we wrap it in EffReader.
Constructors
| MkEffReader | |
Fields
| |
Instances
| e :> es => MonadBaseControl IO (EffReader (IOE e) es) Source # | |
| e :> es => MonadBase IO (EffReader (IOE e) es) Source # | |
| e :> es => MonadFail (EffReader (Exception String e) es) Source # | |
| e :> es => MonadIO (EffReader (IOE e) es) Source # | |
| Applicative (EffReader r es) Source # | |
Defined in Bluefin.Internal Methods pure :: a -> EffReader r es a # (<*>) :: EffReader r es (a -> b) -> EffReader r es a -> EffReader r es b # liftA2 :: (a -> b -> c) -> EffReader r es a -> EffReader r es b -> EffReader r es c # (*>) :: EffReader r es a -> EffReader r es b -> EffReader r es b # (<*) :: EffReader r es a -> EffReader r es b -> EffReader r es a # | |
| Functor (EffReader r es) Source # | |
| Monad (EffReader r es) Source # | |
| e :> es => MonadUnliftIO (EffReader (IOE e) es) Source # | You probably want to use |
Defined in Bluefin.Internal | |
| type StM (EffReader (IOE e) es) a Source # | |
Defined in Bluefin.Internal | |
Arguments
| :: forall (e2 :: Effects) (es :: Effects) a. e2 :> es | |
| => ((forall r. (forall (e1 :: Effects). IOE e1 -> Eff (e1 :& es) r) -> IO r) -> IO a) | Continuation with the unlifting function in scope. |
| -> IOE e2 | |
| -> Eff es a |
Deprecated. Use withEffToIO_ instead.
Arguments
| :: forall (e :: Effects) (es :: Effects) a. e :> es | |
| => IOE e | |
| -> ((forall r. Eff es r -> IO r) -> IO a) | Continuation with the unlifting function in scope. |
| -> Eff es a |
This is equivalent to the withRunInIO method of
MonadUnliftIO, but written in Bluefin-style.
race :: forall (e2 :: Effects) (es :: Effects) a. e2 :> es => (forall (e :: Effects). IOE e -> Eff (e :& es) a) -> (forall (e :: Effects). IOE e -> Eff (e :& es) a) -> IOE e2 -> Eff es a Source #
Arguments
| :: forall (es :: Effects) a b r. (forall (e :: Effects). Coroutine a b e -> Eff (e :& es) r) | |
| -> (forall (e :: Effects). a -> Coroutine b a e -> Eff (e :& es) r) | |
| -> Eff es r | ͘ |
Connect two coroutines. Their execution is interleaved by
exchanging as and bs. When the first yields its first a it
starts the second (which is awaiting an a).
receiveStream :: forall a (es :: Effects) r. (forall (e :: Effects). Consume a e -> Eff (e :& es) r) -> (forall (e :: Effects). Stream a e -> Eff (e :& es) r) -> Eff es r Source #
Old name for consumeStream. receiveStream will be deprecated
in a future version.
hoistReader :: (forall b. m b -> n b) -> ReaderT r m a -> ReaderT r n a Source #
runPureEff :: (forall (es :: Effects). Eff es a) -> a Source #
Run an Eff that doesn't contain any unhandled effects.
insertSecond :: forall (c1 :: Effects) (b :: Effects) r (c2 :: Effects). Eff (c1 :& b) r -> Eff (c1 :& (c2 :& b)) r Source #
insertManySecond :: forall (b :: Effects) (c :: Effects) (c1 :: Effects) r. b :> c => Eff (c1 :& b) r -> Eff (c1 :& c) r Source #
assoc1Eff :: forall (a :: Effects) (b :: Effects) (c :: Effects) r. Eff ((a :& b) :& c) r -> Eff (a :& (b :& c)) r Source #
inContext :: forall (e2 :: Effects) (e1 :: Effects) r. e2 :> e1 => Eff (e1 :& e2) r -> Eff e1 r Source #
makeOp :: forall (e :: Effects) r. Eff (e :& e) r -> Eff e r Source #
Used to define dynamic effects.
useImpl :: forall (e :: Effects) (es :: Effects) r. e :> es => Eff e r -> Eff es r Source #
Used to define dynamic effects.
Arguments
| :: forall (e :: Effects) (es :: Effects) (e1 :: Effects) r. e :> es | |
| => Eff (e1 :& e) r | |
| -> Eff (e1 :& es) r | ͘ |
Like useImpl
Arguments
| :: forall (e :: Effects) (es :: Effects) t r. e :> es | |
| => (t -> Eff (es :& e) r) | |
| -> t | |
| -> Eff es r | ͘ |
Used to define handlers of compound effects.
Arguments
| :: forall (e :: Effects) (es :: Effects) t (e1 :: Effects) r. e :> es | |
| => (t -> Eff (e1 :& e) r) | |
| -> t | |
| -> Eff (e1 :& es) r | ͘ |
Deprecated. Use useImplUnder instead.
data StateSource (e :: Effects) Source #
Handle to a capability to create strict mutable state handles
Constructors
| StateSource |
newtype Exception exn (e :: Effects) Source #
Handle to an exception of type exn
Constructors
| MkException (forall a. exn -> Eff e a) |
newtype State s (e :: Effects) Source #
A handle to a strict mutable state of type s
Constructors
| UnsafeMkState (IORef s) |
newtype Coroutine a b (e :: Effects) Source #
A handle to a coroutine that yields values of type a and then
expects values of type b.
Constructors
| MkCoroutine (a -> Eff e b) |
type Stream a = Coroutine a () Source #
A handle to a stream that yields values of type a. It is
implemented as a handle to a coroutine that yields values of type
a and then expects values of type ().
class Handle (h :: Effects -> Type) where Source #
You can define a Handle instance for your compound handles. As
an example, an "application" handle with a dynamic effect for
database queries, a concrete effect for application state and a
concrete effect for a logging effect might look like this:
data Application e = MkApplication
{ queryDatabase :: forall e'. String -> Int -> Eff (e' :& e) [String],
applicationState :: State (Int, Bool) e,
logger :: Stream String e
}
To define mapHandle for Application you should apply
mapHandle to all the fields that are themeselves handles and
apply useImplUnder to all the fields that are dynamic effects:
instance Handle Application where
mapHandle
MkApplication
{ queryDatabase = q,
applicationState = a,
logger = l
} =
MkApplication
{ queryDatabase = s i -> useImplUnder (q s i),
applicationState = mapHandle a,
logger = mapHandle l
}
Methods
mapHandle :: forall (e :: Effects) (es :: Effects). e :> es => h e -> h es Source #
Used to create compound effects, i.e. handles that contain other handles.
Instances
bimap :: forall (a :: Effects) (b :: Effects) (c :: Effects) (d :: Effects). In a b -> In c d -> In (a :& c) (b :& d) Source #
assoc1 :: forall (a :: Effects) (b :: Effects) (c :: Effects). (# #) -> In ((a :& b) :& c) (a :& (b :& c)) Source #
class (es1 :: Effects) :> (es2 :: Effects) Source #
Effect subset constraint
Instances
| e :> e Source # | A set of effects |
Defined in Bluefin.Internal | |
| e :> (e :& es) Source # |
|
Defined in Bluefin.Internal | |
| e :> es => e :> (x :& es) Source # | If |
Defined in Bluefin.Internal | |
Arguments
| :: forall (e :: Effects) (es :: Effects) ex a. e :> es | |
| => Exception ex e | |
| -> ex | Value to throw |
| -> Eff es a |
>>> runPureEff $ try $ \e -> do
throw e 42
pure "No exception thrown"
Left 42
>>> runPureEff $ try $ \e -> do
pure "No exception thrown"
Right "No exception thrown"
unsafeCoerceDict :: Dict c -> Dict c' Source #
Arguments
| :: forall exn (es :: Effects) a. (forall (e :: Effects). Exception exn e -> Eff (e :& es) a) | |
| -> Eff es (Either exn a) |
|
>>> runPureEff $ try $ \e -> do
throw e 42
pure "No exception thrown"
Left 42
Arguments
| :: forall exn (es :: Effects) a. (exn -> Eff es a) | If the exception is thrown, apply this handler |
| -> (forall (e :: Effects). Exception exn e -> Eff (e :& es) a) | |
| -> Eff es a |
handle, but with the argument order swapped
>>> runPureEff $ handle (pure . show) $ \e -> do
throw e 42
pure "No exception thrown"
"42"
Arguments
| :: forall ex (es :: Effects) (e1 :: Effects) (e2 :: Effects) r. (e1 :> es, e2 :> es, Exception ex) | |
| => IOE e1 | |
| -> Exception ex e2 | |
| -> Eff es r | |
| -> Eff es r | ͘ |
Rethrow an exception raised by an IO action as a Bluefin
exception.
runEff$ \io -> do r <-try$ \ex -> do rethrowIO @IOExceptionio ex $ do effIO io (readFile"/tmp/doesnt-exist")effIOio $ putStrLn $ case r of Left e -> "Caught IOException:\n" ++ show e Right contents -> contents
Caught IOException: /tmp/doesnt-exist: openFile: does not exist (No such file or directory)
Arguments
| :: forall (es :: Effects) a b. Eff es a | Acquire the resource |
| -> (a -> Eff es ()) | Release the resource |
| -> (a -> Eff es b) | Run the body |
| -> Eff es b |
bracket acquire release body: acquire a resource, perform the
body with it, and release the resource even if body threw an
exception. This is essentially the same as
Control.Exception., whose
documentation you can inspect for further details.bracket
bracket has a very general type that does not require es to
contain an exception or IO effect. The reason that this is safe is:
- While
bracketdoes catch exceptions, this is unobservable, since the exception is re-thrown; the cleanup action happens unconditionally; and no part of it gets access to the thrown exception. Effitself is able to guarantee that any exceptions thrown in the body will be actually thrown beforebracketexits. This is inherited from the fact thatEffis a wrapper aroundIO.
While it is usually the case that the cleanup action will in fact
want to use IO effects, this is not universally true, see the
polymorphicBracket example for an example.
withStateInIO :: forall (e1 :: Effects) (es :: Effects) (e2 :: Effects) s r. (e1 :> es, e2 :> es) => IOE e1 -> State s e2 -> (IORef s -> IO r) -> Eff es r Source #
Arguments
| :: forall (e :: Effects) (es :: Effects) s. e :> es | |
| => State s e | |
| -> Eff es s | The current value of the state |
>>> runPureEff $ runState 10 $ \st -> do
n <- get st
pure (2 * n)
(20,10)
Arguments
| :: forall (e :: Effects) (es :: Effects) s. e :> es | |
| => State s e | |
| -> s | The new value of the state. The new value is forced before writing it to the state. |
| -> Eff es () |
Set the value of the state
>>> runPureEff $ runState 10 $ \st -> do
put st 30
((), 30)
Arguments
| :: forall (e :: Effects) (es :: Effects) s. e :> es | |
| => State s e | |
| -> (s -> s) | Apply this function to the state. The new value of the state is forced before writing it to the state. |
| -> Eff es () |
>>> runPureEff $ runState 10 $ \st -> do
modify st (* 2)
((), 20)
Arguments
| :: forall (es :: Effects) a. (forall (e :: Effects). StateSource e -> Eff (e :& es) a) | |
| -> Eff es a | ͘ |
runPureEff$withStateSource$ \source -> do n <-newStatesource 5 total <- newState source 0withJump$ \done -> forever $ do n' <-getnmodifytotal (+ n') when (n' == 0) $jumpTodone modify n (subtract 1) get total 15
Arguments
| :: forall s (es :: Effects) a. s | Initial state |
| -> (forall (e :: Effects). State s e -> Eff (e :& es) a) | Stateful computation |
| -> Eff es (a, s) | Result and final state |
>>> runPureEff $ runState 10 $ \st -> do
n <- get st
pure (2 * n)
(20,10)
Arguments
| :: forall (e1 :: Effects) (es :: Effects) a. e1 :> es | |
| => Stream a e1 | |
| -> a | Yield this value from the stream |
| -> Eff es () |
Yield an element to the stream.
>>> runPureEff $ yieldToList $ \y -> do
yield y 1
yield y 2
yield y 100
([1,2,100], ())
handleCoroutine :: forall a (es :: Effects) b z r. (a -> Eff es b) -> (z -> Eff es r) -> (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) z) -> Eff es r Source #
Arguments
| :: forall a b (es :: Effects) r. (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r) | |
| -> (a -> Eff es b) | Apply this effectful function for each element of the coroutine |
| -> Eff es r |
Apply an effectful function to each element yielded to the stream.
>>> runPureEff $ yieldToList $ \y -> do
for_ [0 .. 4] $ \i -> do
yield y i
yield y (i * 10)
([0, 0, 1, 10, 2, 20, 3, 30], ())
Arguments
| :: forall a (es :: Effects) r. (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) | |
| -> Eff es r | ͘ |
Ignore all elements yielded to the stream.
>>> runPureEff $ ignoreStream $ \y -> do
for_ [0 .. 4] $ \i -> do
yield y i
yield y (i * 10)
pure 42
42
Arguments
| :: forall t (e1 :: Effects) (es :: Effects) a. (Foldable t, e1 :> es) | |
| => t a | Yield all these values from the stream |
| -> Stream a e1 | |
| -> Eff es () |
>>> runPureEff $ yieldToList $ inFoldable [1, 2, 100] ([1, 2, 100], ())
Arguments
| :: forall (e2 :: Effects) (es :: Effects) a r. e2 :> es | |
| => (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) | ͘ |
| -> Stream (Int, a) e2 | |
| -> Eff es r |
Pair each element in the stream with an increasing index, starting from 0.
>>> runPureEff $ yieldToList $ enumerate (inFoldable ["A", "B", "C"]) ([(0, "A"), (1, "B"), (2, "C")], ())
Arguments
| :: forall (e2 :: Effects) (es :: Effects) a r. e2 :> es | |
| => Int | Initial value |
| -> (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) | |
| -> Stream (Int, a) e2 | |
| -> Eff es r |
Pair each element in the stream with an increasing index, starting from an inital value.
>>> runPureEff $ yieldToList $ enumerateFrom1 (inFoldable ["A", "B", "C"]) ([(1, "A"), (2, "B"), (3, "C")], ())
type EarlyReturn = Exception Source #
Arguments
| :: forall r (es :: Effects). (forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r) | |
| -> Eff es r | ͘ |
Run an Eff action with the ability to return early to this
point. In the language of exceptions, withEarlyReturn installs
an exception handler for an exception of type r.
>>> runPureEff $ withEarlyReturn $ \e -> do
for_ [1 .. 10] $ \i -> do
when (i >= 5) $
returnEarly e ("Returned early with " ++ show i)
pure "End of loop"
"Returned early with 5"
Arguments
| :: forall (e :: Effects) (es :: Effects) r a. e :> es | |
| => EarlyReturn r e | |
| -> r | Return early to the handler, with this value. |
| -> Eff es a |
>>> runPureEff $ withEarlyReturn $ \e -> do
for_ [1 .. 10] $ \i -> do
when (i >= 5) $
returnEarly e ("Returned early with " ++ show i)
pure "End of loop"
"Returned early with 5"
Arguments
| :: forall s (es :: Effects) a. s | Initial state |
| -> (forall (e :: Effects). State s e -> Eff (e :& es) a) | Stateful computation |
| -> Eff es a | Result |
>>> runPureEff $ evalState 10 $ \st -> do
n <- get st
pure (2 * n)
20
Arguments
| :: forall s (es :: Effects) a. s | Initial state |
| -> (forall (e :: Effects). State s e -> Eff (e :& es) (s -> a)) | Stateful computation |
| -> Eff es a | Result |
>>> runPureEff $ withState 10 $ \st -> do
n <- get st
pure (s -> (2 * n, s))
(20,10)
inComp :: forall (a :: Effects) (b :: Effects) (c :: Effects) r. (a :> b, b :> c) => (a :> c => r) -> r Source #
withC1 :: forall e1 (e2 :: Effects -> Type) (ss :: Effects) (es :: Effects) r. ss :> es => Compound e1 e2 ss -> (forall (st :: Effects). st :> es => e1 st -> Eff es r) -> Eff es r Source #
withC2 :: forall (e1 :: Effects -> Type) e2 (ss :: Effects) (es :: Effects) r. ss :> es => Compound e1 e2 ss -> (forall (st :: Effects). st :> es => e2 st -> Eff es r) -> Eff es r Source #
putC :: forall (ss :: Effects) (es :: Effects) (e :: Effects -> Type). ss :> es => Compound e (State Int) ss -> Int -> Eff es () Source #
getC :: forall (ss :: Effects) (es :: Effects) (e :: Effects -> Type). ss :> es => Compound e (State Int) ss -> Eff es Int Source #
Arguments
| :: forall a (es :: Effects) r. (forall (e1 :: Effects). Stream a e1 -> Eff (e1 :& es) r) | |
| -> Eff es ([a], r) | Yielded elements and final result |
Gather all yielded elements into a list.
>>> runPureEff $ yieldToList $ \y -> do
yield y 1
yield y 2
yield y 100
([1,2,100], ())
Arguments
| :: forall a (es :: Effects) r. (forall (e :: Effects). Stream a e -> Eff (e :& es) ([a] -> r)) | Stream computation |
| -> Eff es r | Result |
>>> runPureEff $ withYieldToList $ \y -> do yield y 1 yield y 2 yield y 100 pure length 3
Arguments
| :: forall a (es :: Effects) r. (forall (e :: Effects). Stream a e -> Eff (e :& es) r) | |
| -> Eff es ([a], r) | Yielded elements in reverse order, and final result |
This is more efficient than yieldToList because it gathers the
elements into a stack in reverse order. yieldToList then reverses
that stack.
>>> runPureEff $ yieldToReverseList $ \y -> do
yield y 1
yield y 2
yield y 100
([100,2,1], ())
Arguments
| :: forall (e2 :: Effects) (es :: Effects) a r. e2 :> es | |
| => (forall (e1 :: Effects). Stream (Maybe a) e1 -> Eff (e1 :& es) r) | Input stream |
| -> Stream a e2 | |
| -> Eff es r |
Remove Nothing elements from a stream.
type Jump = EarlyReturn () Source #
unwrap :: forall (e :: Effects) (es :: Effects) a. e :> es => Jump e -> Maybe a -> Eff es a Source #
data IOE (e :: Effects) Source #
Handle that allows you to run IO operations
Constructors
| MkIOE |
Instances
| Handle IOE Source # | |
| e :> es => MonadBaseControl IO (EffReader (IOE e) es) Source # | |
| e :> es => MonadBase IO (EffReader (IOE e) es) Source # | |
| e :> es => MonadIO (EffReader (IOE e) es) Source # | |
| e :> es => MonadUnliftIO (EffReader (IOE e) es) Source # | You probably want to use |
Defined in Bluefin.Internal | |
| type StM (EffReader (IOE e) es) a Source # | |
Defined in Bluefin.Internal | |
connect :: forall a b (es :: Effects) r1 r2. (forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r1) -> (forall (e2 :: Effects). a -> Coroutine b a e2 -> Eff (e2 :& es) r2) -> forall (e1 :: Effects) (e2 :: Effects). (e1 :> es, e2 :> es) => Eff es (Either (r1, a -> Coroutine b a e2 -> Eff es r2) (r2, b -> Coroutine a b e1 -> Eff es r1)) Source #
head' :: forall a b r (es :: Effects). (forall (e :: Effects). Coroutine a b e -> Eff (e :& es) r) -> forall (e :: Effects). e :> es => Eff es (Either r (a, b -> Coroutine a b e -> Eff es r)) Source #
Read the value. Note that ask has the property that these two
operations are always equivalent:
do r1 <- ask re r2 <- ask re pure (r1, r2)
do r <- ask re pure (r, r)
Arguments
| :: forall (e :: Effects) (es :: Effects) r a. e :> es | |
| => Reader r e | |
| -> (r -> a) | Read the value modified by this function |
| -> Eff es a |
Read the value modified by a function
newtype HandleReader (h :: Effects -> Type) (e :: Effects) Source #
Constructors
| UnsafeMkHandleReader (State (h e) e) |
Instances
| Handle h => Handle (HandleReader h) Source # | |
Defined in Bluefin.Internal Methods mapHandle :: forall (e :: Effects) (es :: Effects). e :> es => HandleReader h e -> HandleReader h es Source # | |
Arguments
| :: forall (h :: Effects -> Type) (e :: Effects) (es :: Effects). (Handle h, e :> es) | |
| => HandleReader h e | |
| -> HandleReader h es | ͘ |
newtype ConstEffect r (e :: k) Source #
Constructors
| MkConstEffect r |
Instances
| Handle (ConstEffect r :: Effects -> Type) Source # | |
Defined in Bluefin.Internal Methods mapHandle :: forall (e :: Effects) (es :: Effects). e :> es => ConstEffect r e -> ConstEffect r es Source # | |