module Bluefin.Internal.Pipes where
import Bluefin.Internal hiding (yield, await)
import qualified Bluefin.Internal
import Control.Monad (forever)
import Data.Foldable (for_)
import Data.Void (Void, absurd)
import Prelude hiding (break, print, takeWhile)
import qualified Prelude
data Proxy a' a b' b e = MkProxy (Coroutine a' a e) (Coroutine b b' e)
type Pipe a = Proxy () a ()
type Producer = Proxy Void () ()
type Consumer a = Pipe a Void
type Effect = Producer Void
infixl 7 >->
(>->) ::
(e1 :> es) =>
(forall e. Proxy a' a () b e -> Eff (e :& es) r) ->
(forall e. Proxy () b c' c e -> Eff (e :& es) r) ->
Proxy a' a c' c e1 ->
Eff es r
>-> :: forall (e1 :: Effects) (es :: Effects) a' a b r c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r)
-> (forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r)
-> Proxy a' a c' c e1
-> Eff es r
(>->) forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r
k1 forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r
k2 (MkProxy Coroutine a' a e1
c1 Coroutine c c' e1
c2) =
(forall (e :: Effects). Consume b e -> Eff (e :& es) r)
-> (forall (e :: Effects). Stream b e -> Eff (e :& es) r)
-> Eff es r
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
receiveStream
(\Consume b e
c -> (Proxy () b c' c (e :& es) -> Eff ((e :& es) :& es) r)
-> Proxy () b c' c (e :& es) -> Eff (e :& es) r
forall (e :: Effects) (es :: Effects) t r.
(e :> es) =>
(t -> Eff (es :& e) r) -> t -> Eff es r
useImplIn Proxy () b c' c (e :& es) -> Eff ((e :& es) :& es) r
forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r
k2 (Coroutine () b (e :& es)
-> Coroutine c c' (e :& es) -> Proxy () b c' c (e :& es)
forall a' a b' b (e :: Effects).
Coroutine a' a e -> Coroutine b b' e -> Proxy a' a b' b e
MkProxy (Consume b e -> Coroutine () b (e :& es)
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine () b e -> Coroutine () b es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Consume b e
c) (Coroutine c c' e1 -> Coroutine c c' (e :& es)
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine c c' e -> Coroutine c c' es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine c c' e1
c2)))
(\Stream b e
s -> (Proxy a' a () b (e :& es) -> Eff ((e :& es) :& es) r)
-> Proxy a' a () b (e :& es) -> Eff (e :& es) r
forall (e :: Effects) (es :: Effects) t r.
(e :> es) =>
(t -> Eff (es :& e) r) -> t -> Eff es r
useImplIn Proxy a' a () b (e :& es) -> Eff ((e :& es) :& es) r
forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r
k1 (Coroutine a' a (e :& es)
-> Coroutine b () (e :& es) -> Proxy a' a () b (e :& es)
forall a' a b' b (e :: Effects).
Coroutine a' a e -> Coroutine b b' e -> Proxy a' a b' b e
MkProxy (Coroutine a' a e1 -> Coroutine a' a (e :& es)
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine a' a e -> Coroutine a' a es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine a' a e1
c1) (Stream b e -> Coroutine b () (e :& es)
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine b () e -> Coroutine b () es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Stream b e
s)))
infixr 7 <-<
(<-<) ::
(e1 :> es) =>
(forall e. Proxy () b c' c e -> Eff (e :& es) r) ->
(forall e. Proxy a' a () b e -> Eff (e :& es) r) ->
Proxy a' a c' c e1 ->
Eff es r
forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r
k1 <-< :: forall (e1 :: Effects) (es :: Effects) b c' c r a' a.
(e1 :> es) =>
(forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r)
-> (forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r)
-> Proxy a' a c' c e1
-> Eff es r
<-< forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r
k2 = Proxy a' a () b e -> Eff (e :& es) r
forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r
k2 (forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r)
-> (forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r)
-> Proxy a' a c' c e1
-> Eff es r
forall (e1 :: Effects) (es :: Effects) a' a b r c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy a' a () b e -> Eff (e :& es) r)
-> (forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r)
-> Proxy a' a c' c e1
-> Eff es r
>-> Proxy () b c' c e -> Eff (e :& es) r
forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) r
k1
for ::
(e1 :> es) =>
(forall e. Proxy x' x b' b e -> Eff (e :& es) a') ->
(b -> forall e. Proxy x' x c' c e -> Eff (e :& es) b') ->
Proxy x' x c' c e1 ->
Eff es a'
for :: forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a'
k1 b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b'
k2 (MkProxy Coroutine x' x e1
c1 Coroutine c c' e1
c2) =
(forall (e1 :: Effects). Coroutine b b' e1 -> Eff (e1 :& es) a')
-> (b -> Eff es b') -> Eff es a'
forall a b (es :: Effects) r.
(forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r)
-> (a -> Eff es b) -> Eff es r
forEach (\Coroutine b b' e1
bk -> (Proxy x' x b' b (e1 :& es) -> Eff ((e1 :& es) :& es) a')
-> Proxy x' x b' b (e1 :& es) -> Eff (e1 :& es) a'
forall (e :: Effects) (es :: Effects) t r.
(e :> es) =>
(t -> Eff (es :& e) r) -> t -> Eff es r
useImplIn Proxy x' x b' b (e1 :& es) -> Eff ((e1 :& es) :& es) a'
forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a'
k1 (Coroutine x' x (e1 :& es)
-> Coroutine b b' (e1 :& es) -> Proxy x' x b' b (e1 :& es)
forall a' a b' b (e :: Effects).
Coroutine a' a e -> Coroutine b b' e -> Proxy a' a b' b e
MkProxy (Coroutine x' x e1 -> Coroutine x' x (e1 :& es)
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine x' x e -> Coroutine x' x es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine x' x e1
c1) (Coroutine b b' e1 -> Coroutine b b' (e1 :& es)
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine b b' e -> Coroutine b b' es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine b b' e1
bk))) ((b -> Eff es b') -> Eff es a') -> (b -> Eff es b') -> Eff es a'
forall a b. (a -> b) -> a -> b
$ \b
b_ ->
(Proxy x' x c' c es -> Eff (es :& es) b')
-> Proxy x' x c' c es -> Eff es b'
forall (e :: Effects) (es :: Effects) t r.
(e :> es) =>
(t -> Eff (es :& e) r) -> t -> Eff es r
useImplIn (b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b'
k2 b
b_) (Coroutine x' x es -> Coroutine c c' es -> Proxy x' x c' c es
forall a' a b' b (e :: Effects).
Coroutine a' a e -> Coroutine b b' e -> Proxy a' a b' b e
MkProxy (Coroutine x' x e1 -> Coroutine x' x es
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine x' x e -> Coroutine x' x es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine x' x e1
c1) (Coroutine c c' e1 -> Coroutine c c' es
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine c c' e -> Coroutine c c' es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine c c' e1
c2))
infixr 4 ~>
(~>) ::
(e1 :> es) =>
(a -> forall e. Proxy x' x b' b e -> Eff (e :& es) a') ->
(b -> forall e. Proxy x' x c' c e -> Eff (e :& es) b') ->
a ->
Proxy x' x c' c e1 ->
Eff es a'
(a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a'
k1 ~> :: forall (e1 :: Effects) (es :: Effects) a x' x b' b a' c' c.
(e1 :> es) =>
(a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> a
-> Proxy x' x c' c e1
-> Eff es a'
~> b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b'
k2) a
a = (forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for (a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a'
k1 a
a) b -> Proxy x' x c' c e -> Eff ('Union e es) b'
b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b'
k2
infixl 4 <~
(<~) ::
(e1 :> es) =>
(b -> forall e. Proxy x' x c' c e -> Eff (e :& es) b') ->
(a -> forall e. Proxy x' x b' b e -> Eff (e :& es) a') ->
a ->
Proxy x' x c' c e1 ->
Eff es a'
b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b'
k2 <~ :: forall (e1 :: Effects) (es :: Effects) b x' x c' c b' a a'.
(e1 :> es) =>
(b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> (a
-> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> a
-> Proxy x' x c' c e1
-> Eff es a'
<~ a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a'
k1 = a -> Proxy x' x b' b e -> Eff ('Union e es) a'
a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a'
k1 (a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> a
-> Proxy x' x c' c e1
-> Eff es a'
forall (e1 :: Effects) (es :: Effects) a x' x b' b a' c' c.
(e1 :> es) =>
(a -> forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> a
-> Proxy x' x c' c e1
-> Eff es a'
~> b -> Proxy x' x c' c e -> Eff ('Union e es) b'
b -> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b'
k2
reverseProxy :: Proxy a' a b' b e -> Proxy b b' a a' e
reverseProxy :: forall a' a b' b (e :: Effects).
Proxy a' a b' b e -> Proxy b b' a a' e
reverseProxy (MkProxy Coroutine a' a e
c1 Coroutine b b' e
c2) = Coroutine b b' e -> Coroutine a' a e -> Proxy b b' a a' e
forall a' a b' b (e :: Effects).
Coroutine a' a e -> Coroutine b b' e -> Proxy a' a b' b e
MkProxy Coroutine b b' e
c2 Coroutine a' a e
c1
infixl 5 >~
(>~) ::
(e1 :> es) =>
(forall e. Proxy a' a y' y e -> Eff (e :& es) b) ->
(forall e. Proxy () b y' y e -> Eff (e :& es) c) ->
Proxy a' a y' y e1 ->
Eff es c
>~ :: forall (e1 :: Effects) (es :: Effects) a' a y' y b c.
(e1 :> es) =>
(forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b)
-> (forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c)
-> Proxy a' a y' y e1
-> Eff es c
(>~) forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b
k1 forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c
k2 Proxy a' a y' y e1
p =
(forall (e :: Effects). Proxy y y' b () e -> Eff (e :& es) c)
-> (()
-> forall (e :: Effects). Proxy y y' a a' e -> Eff (e :& es) b)
-> Proxy y y' a a' e1
-> Eff es c
forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for
( \Proxy y y' b () e
p1 ->
Proxy () b y' y e -> Eff (e :& es) c
forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c
k2 (Proxy y y' b () e -> Proxy () b y' y e
forall a' a b' b (e :: Effects).
Proxy a' a b' b e -> Proxy b b' a a' e
reverseProxy Proxy y y' b () e
p1)
)
(\() Proxy y y' a a' e
p1 -> Proxy a' a y' y e -> Eff (e :& es) b
forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b
k1 (Proxy y y' a a' e -> Proxy a' a y' y e
forall a' a b' b (e :: Effects).
Proxy a' a b' b e -> Proxy b b' a a' e
reverseProxy Proxy y y' a a' e
p1))
(Proxy a' a y' y e1 -> Proxy y y' a a' e1
forall a' a b' b (e :: Effects).
Proxy a' a b' b e -> Proxy b b' a a' e
reverseProxy Proxy a' a y' y e1
p)
infixr 5 ~<
(~<) ::
(e1 :> es) =>
(forall e. Proxy () b y' y e -> Eff (e :& es) c) ->
(forall e. Proxy a' a y' y e -> Eff (e :& es) b) ->
Proxy a' a y' y e1 ->
Eff es c
~< :: forall (e1 :: Effects) (es :: Effects) b y' y c a' a.
(e1 :> es) =>
(forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c)
-> (forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b)
-> Proxy a' a y' y e1
-> Eff es c
(~<) forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c
k1 forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b
k2 = (forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b)
-> (forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c)
-> Proxy a' a y' y e1
-> Eff es c
forall (e1 :: Effects) (es :: Effects) a' a y' y b c.
(e1 :> es) =>
(forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b)
-> (forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c)
-> Proxy a' a y' y e1
-> Eff es c
(>~) Proxy a' a y' y e -> Eff (e :& es) b
forall (e :: Effects). Proxy a' a y' y e -> Eff (e :& es) b
k2 Proxy () b y' y e -> Eff (e :& es) c
forall (e :: Effects). Proxy () b y' y e -> Eff (e :& es) c
k1
cat :: Pipe a a e -> Eff (e :& es) r
cat :: forall a (e :: Effects) (es :: Effects) r.
Pipe a a e -> Eff (e :& es) r
cat (MkProxy Coroutine () a e
c1 Coroutine a () e
c2) = Eff (e :& es) () -> Eff (e :& es) r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff (e :& es) () -> Eff (e :& es) r)
-> Eff (e :& es) () -> Eff (e :& es) r
forall a b. (a -> b) -> a -> b
$ do
a
a <- Coroutine () a e -> () -> Eff (e :& es) a
forall (e1 :: Effects) (es :: Effects) a b.
(e1 :> es) =>
Coroutine a b e1 -> a -> Eff es b
yieldCoroutine Coroutine () a e
c1 ()
Coroutine a () e -> a -> Eff (e :& es) ()
forall (e1 :: Effects) (es :: Effects) a b.
(e1 :> es) =>
Coroutine a b e1 -> a -> Eff es b
yieldCoroutine Coroutine a () e
c2 a
a
runEffect ::
(forall e. Effect e -> Eff (e :& es) r) ->
Eff es r
runEffect :: forall (es :: Effects) r.
(forall (e :: Effects). Effect e -> Eff (e :& es) r) -> Eff es r
runEffect forall (e :: Effects). Effect e -> Eff (e :& es) r
k =
(forall (e1 :: Effects). Coroutine Void () e1 -> Eff (e1 :& es) r)
-> (Void -> Eff es ()) -> Eff es r
forall a b (es :: Effects) r.
(forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r)
-> (a -> Eff es b) -> Eff es r
forEach
( \Coroutine Void () e1
c1 ->
(forall (e1 :: Effects).
Coroutine Void () e1 -> Eff (e1 :& (e1 :& es)) r)
-> (Void -> Eff (e1 :& es) ()) -> Eff (e1 :& es) r
forall a b (es :: Effects) r.
(forall (e1 :: Effects). Coroutine a b e1 -> Eff (e1 :& es) r)
-> (a -> Eff es b) -> Eff es r
forEach
( \Coroutine Void () e1
c2 ->
(Effect (e1 :& (e1 :& es)) -> Eff ((e1 :& (e1 :& es)) :& es) r)
-> Effect (e1 :& (e1 :& es)) -> Eff (e1 :& (e1 :& es)) r
forall (e :: Effects) (es :: Effects) t r.
(e :> es) =>
(t -> Eff (es :& e) r) -> t -> Eff es r
useImplIn
Effect (e1 :& (e1 :& es)) -> Eff ((e1 :& (e1 :& es)) :& es) r
forall (e :: Effects). Effect e -> Eff (e :& es) r
k
(Coroutine Void () (e1 :& (e1 :& es))
-> Coroutine Void () (e1 :& (e1 :& es))
-> Effect (e1 :& (e1 :& es))
forall a' a b' b (e :: Effects).
Coroutine a' a e -> Coroutine b b' e -> Proxy a' a b' b e
MkProxy (Coroutine Void () e1 -> Coroutine Void () (e1 :& (e1 :& es))
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine Void () e -> Coroutine Void () es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine Void () e1
c1) (Coroutine Void () e1 -> Coroutine Void () (e1 :& (e1 :& es))
forall (e :: Effects) (es :: Effects).
(e :> es) =>
Coroutine Void () e -> Coroutine Void () es
forall (h :: Effects -> *) (e :: Effects) (es :: Effects).
(Handle h, e :> es) =>
h e -> h es
mapHandle Coroutine Void () e1
c2))
)
Void -> Eff (e1 :& es) ()
forall a. Void -> a
absurd
)
Void -> Eff es ()
forall a. Void -> a
absurd
yield ::
(e :> es) =>
Proxy x1 x () a e ->
a ->
Eff es ()
yield :: forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield (MkProxy Coroutine x1 x e
_ Coroutine a () e
c) = Coroutine a () e -> a -> Eff es ()
forall (e1 :: Effects) (es :: Effects) a.
(e1 :> es) =>
Stream a e1 -> a -> Eff es ()
Bluefin.Internal.yield Coroutine a () e
c
await :: (e :> es) => Proxy () a y' y e -> Eff es a
await :: forall (e :: Effects) (es :: Effects) a y' y.
(e :> es) =>
Proxy () a y' y e -> Eff es a
await (MkProxy Coroutine () a e
c Coroutine y y' e
_) = Coroutine () a e -> () -> Eff es a
forall (e1 :: Effects) (es :: Effects) a b.
(e1 :> es) =>
Coroutine a b e1 -> a -> Eff es b
yieldCoroutine Coroutine () a e
c ()
next :: ()
next :: ()
next = ()
each ::
(Foldable f) =>
f a ->
Proxy x' x () a e ->
Eff (e :& es) ()
each :: forall (f :: * -> *) a x' x (e :: Effects) (es :: Effects).
Foldable f =>
f a -> Proxy x' x () a e -> Eff (e :& es) ()
each f a
f Proxy x' x () a e
p = f a -> (a -> Eff (e :& es) ()) -> Eff (e :& es) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ f a
f (Proxy x' x () a e -> a -> Eff (e :& es) ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Proxy x' x () a e
p)
repeatM ::
(e :> es) =>
Eff es a ->
Proxy x' x () a e ->
Eff es r
repeatM :: forall (e :: Effects) (es :: Effects) a x' x r.
(e :> es) =>
Eff es a -> Proxy x' x () a e -> Eff es r
repeatM Eff es a
e Proxy x' x () a e
p = Eff es () -> Eff es r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff es () -> Eff es r) -> Eff es () -> Eff es r
forall a b. (a -> b) -> a -> b
$ do
a
a <- Eff es a
e
Proxy x' x () a e -> a -> Eff es ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Proxy x' x () a e
p a
a
replicateM ::
(e :> es) =>
Int ->
Eff es a ->
Proxy x' x () a e ->
Eff es ()
replicateM :: forall (e :: Effects) (es :: Effects) a x' x.
(e :> es) =>
Int -> Eff es a -> Proxy x' x () a e -> Eff es ()
replicateM Int
n Eff es a
e Proxy x' x () a e
p = [Int] -> (Int -> Eff es ()) -> Eff es ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Int
0 .. Int
n] ((Int -> Eff es ()) -> Eff es ())
-> (Int -> Eff es ()) -> Eff es ()
forall a b. (a -> b) -> a -> b
$ \Int
_ -> do
a
a <- Eff es a
e
Proxy x' x () a e -> a -> Eff es ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Proxy x' x () a e
p a
a
print ::
(e2 :> es, e1 :> es, Show a) =>
IOE e1 ->
Consumer a e2 ->
Eff es r
print :: forall (e2 :: Effects) (es :: Effects) (e1 :: Effects) a r.
(e2 :> es, e1 :> es, Show a) =>
IOE e1 -> Consumer a e2 -> Eff es r
print IOE e1
io Consumer a e2
p = Eff es () -> Eff es r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff es () -> Eff es r) -> Eff es () -> Eff es r
forall a b. (a -> b) -> a -> b
$ do
a
a <- Consumer a e2 -> Eff es a
forall (e :: Effects) (es :: Effects) a y' y.
(e :> es) =>
Proxy () a y' y e -> Eff es a
await Consumer a e2
p
IOE e1 -> IO () -> Eff es ()
forall (e :: Effects) (es :: Effects) a.
(e :> es) =>
IOE e -> IO a -> Eff es a
effIO IOE e1
io (a -> IO ()
forall a. Show a => a -> IO ()
Prelude.print a
a)
unfoldr ::
(e :> es) =>
(s -> Eff es (Either r (a, s))) ->
s ->
Proxy x1 x () a e ->
Eff es r
unfoldr :: forall (e :: Effects) (es :: Effects) s r a x1 x.
(e :> es) =>
(s -> Eff es (Either r (a, s)))
-> s -> Proxy x1 x () a e -> Eff es r
unfoldr s -> Eff es (Either r (a, s))
next_ s
sInit Proxy x1 x () a e
p =
(forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r
forall r (es :: Effects).
(forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r
withEarlyReturn ((forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r)
-> (forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r
forall a b. (a -> b) -> a -> b
$ \EarlyReturn r e
break -> s
-> (forall {e :: Effects}. State s e -> Eff (e :& (e :& es)) r)
-> Eff (e :& es) r
forall s (es :: Effects) a.
s
-> (forall (e :: Effects). State s e -> Eff (e :& es) a)
-> Eff es a
evalState s
sInit ((forall {e :: Effects}. State s e -> Eff (e :& (e :& es)) r)
-> Eff (e :& es) r)
-> (forall {e :: Effects}. State s e -> Eff (e :& (e :& es)) r)
-> Eff (e :& es) r
forall a b. (a -> b) -> a -> b
$ \State s e
ss -> Eff (e :& (e :& es)) () -> Eff (e :& (e :& es)) r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff (e :& (e :& es)) () -> Eff (e :& (e :& es)) r)
-> Eff (e :& (e :& es)) () -> Eff (e :& (e :& es)) r
forall a b. (a -> b) -> a -> b
$ do
s
s <- State s e -> Eff (e :& (e :& es)) s
forall (e :: Effects) (es :: Effects) s.
(e :> es) =>
State s e -> Eff es s
get State s e
ss
Eff es (Either r (a, s)) -> Eff (e :& (e :& es)) (Either r (a, s))
forall (e :: Effects) (es :: Effects) r.
(e :> es) =>
Eff e r -> Eff es r
useImpl (s -> Eff es (Either r (a, s))
next_ s
s) Eff (e :& (e :& es)) (Either r (a, s))
-> (Either r (a, s) -> Eff (e :& (e :& es)) ())
-> Eff (e :& (e :& es)) ()
forall a b.
Eff (e :& (e :& es)) a
-> (a -> Eff (e :& (e :& es)) b) -> Eff (e :& (e :& es)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Left r
r -> EarlyReturn r e -> r -> Eff (e :& (e :& es)) ()
forall (e :: Effects) (es :: Effects) r a.
(e :> es) =>
EarlyReturn r e -> r -> Eff es a
returnEarly EarlyReturn r e
break r
r
Right (a
a, s
s') -> do
State s e -> s -> Eff (e :& (e :& es)) ()
forall (e :: Effects) (es :: Effects) s.
(e :> es) =>
State s e -> s -> Eff es ()
put State s e
ss s
s'
Proxy x1 x () a e -> a -> Eff (e :& (e :& es)) ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Proxy x1 x () a e
p a
a
mapM_ ::
(e :> es) =>
(a -> Eff es ()) ->
Proxy () a b b' e ->
Eff es r
mapM_ :: forall (e :: Effects) (es :: Effects) a b b' r.
(e :> es) =>
(a -> Eff es ()) -> Proxy () a b b' e -> Eff es r
mapM_ a -> Eff es ()
f = (forall (e :: Effects). Proxy () a () a e -> Eff (e :& es) r)
-> (a
-> forall (e :: Effects). Proxy () a b b' e -> Eff (e :& es) ())
-> Proxy () a b b' e
-> Eff es r
forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for Pipe a a e -> Eff (e :& es) r
forall a (e :: Effects) (es :: Effects) r.
Pipe a a e -> Eff (e :& es) r
forall (e :: Effects). Proxy () a () a e -> Eff (e :& es) r
cat (\a
a Proxy () a b b' e
_ -> Eff es () -> Eff (e :& es) ()
forall (e :: Effects) (es :: Effects) r.
(e :> es) =>
Eff e r -> Eff es r
useImpl (a -> Eff es ()
f a
a))
drain ::
(e :> es) =>
Proxy () b c' c e ->
Eff es r
drain :: forall (e :: Effects) (es :: Effects) b c' c r.
(e :> es) =>
Proxy () b c' c e -> Eff es r
drain = (forall (e :: Effects). Proxy () b () b e -> Eff (e :& es) r)
-> (b
-> forall (e :: Effects). Proxy () b c' c e -> Eff (e :& es) ())
-> Proxy () b c' c e
-> Eff es r
forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for Pipe b b e -> Eff (e :& es) r
forall a (e :: Effects) (es :: Effects) r.
Pipe a a e -> Eff (e :& es) r
forall (e :: Effects). Proxy () b () b e -> Eff (e :& es) r
cat (\b
_ Proxy () b c' c e
_ -> () -> Eff (e :& es) ()
forall a. a -> Eff (e :& es) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
map ::
(e :> es) =>
(a -> b) ->
Pipe a b e ->
Eff es r
map :: forall (e :: Effects) (es :: Effects) a b r.
(e :> es) =>
(a -> b) -> Pipe a b e -> Eff es r
map a -> b
f = (forall (e :: Effects). Proxy () a () a e -> Eff (e :& es) r)
-> (a
-> forall (e :: Effects). Proxy () a () b e -> Eff (e :& es) ())
-> Proxy () a () b e
-> Eff es r
forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for Pipe a a e -> Eff (e :& es) r
forall a (e :: Effects) (es :: Effects) r.
Pipe a a e -> Eff (e :& es) r
forall (e :: Effects). Proxy () a () a e -> Eff (e :& es) r
cat (\a
a Proxy () a () b e
p1 -> Proxy () a () b e -> b -> Eff (e :& es) ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Proxy () a () b e
p1 (a -> b
f a
a))
mapM ::
(e :> es) =>
(a -> Eff es b) ->
Pipe a b e ->
Eff es r
mapM :: forall (e :: Effects) (es :: Effects) a b r.
(e :> es) =>
(a -> Eff es b) -> Pipe a b e -> Eff es r
mapM a -> Eff es b
f = (forall (e :: Effects). Proxy () a () a e -> Eff (e :& es) r)
-> (a
-> forall {e :: Effects}. Proxy () a () b e -> Eff (e :& es) ())
-> Proxy () a () b e
-> Eff es r
forall (e1 :: Effects) (es :: Effects) x' x b' b a' c' c.
(e1 :> es) =>
(forall (e :: Effects). Proxy x' x b' b e -> Eff (e :& es) a')
-> (b
-> forall (e :: Effects). Proxy x' x c' c e -> Eff (e :& es) b')
-> Proxy x' x c' c e1
-> Eff es a'
for Pipe a a e -> Eff (e :& es) r
forall a (e :: Effects) (es :: Effects) r.
Pipe a a e -> Eff (e :& es) r
forall (e :: Effects). Proxy () a () a e -> Eff (e :& es) r
cat ((a
-> forall {e :: Effects}. Proxy () a () b e -> Eff (e :& es) ())
-> Proxy () a () b e -> Eff es r)
-> (a
-> forall {e :: Effects}. Proxy () a () b e -> Eff (e :& es) ())
-> Proxy () a () b e
-> Eff es r
forall a b. (a -> b) -> a -> b
$ \a
a Proxy () a () b e
p -> do
b
b_ <- Eff es b -> Eff (e :& es) b
forall (e :: Effects) (es :: Effects) r.
(e :> es) =>
Eff e r -> Eff es r
useImpl (a -> Eff es b
f a
a)
Proxy () a () b e -> b -> Eff (e :& es) ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Proxy () a () b e
p b
b_
takeWhile' ::
(e :> es) =>
(r -> Bool) ->
Pipe r r e ->
Eff es r
takeWhile' :: forall (e :: Effects) (es :: Effects) r.
(e :> es) =>
(r -> Bool) -> Pipe r r e -> Eff es r
takeWhile' r -> Bool
predicate Pipe r r e
p = (forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r
forall r (es :: Effects).
(forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r
withEarlyReturn ((forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r)
-> (forall (e :: Effects). EarlyReturn r e -> Eff (e :& es) r)
-> Eff es r
forall a b. (a -> b) -> a -> b
$ \EarlyReturn r e
early -> Eff (e :& es) () -> Eff (e :& es) r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff (e :& es) () -> Eff (e :& es) r)
-> Eff (e :& es) () -> Eff (e :& es) r
forall a b. (a -> b) -> a -> b
$ do
r
a <- Pipe r r e -> Eff (e :& es) r
forall (e :: Effects) (es :: Effects) a y' y.
(e :> es) =>
Proxy () a y' y e -> Eff es a
await Pipe r r e
p
if r -> Bool
predicate r
a
then Pipe r r e -> r -> Eff (e :& es) ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Pipe r r e
p r
a
else EarlyReturn r e -> r -> Eff (e :& es) ()
forall (e :: Effects) (es :: Effects) r a.
(e :> es) =>
EarlyReturn r e -> r -> Eff es a
returnEarly EarlyReturn r e
early r
a
stdinLn ::
(e1 :> es, e2 :> es) =>
IOE e1 ->
Producer String e2 ->
Eff es r
stdinLn :: forall (e1 :: Effects) (es :: Effects) (e2 :: Effects) r.
(e1 :> es, e2 :> es) =>
IOE e1 -> Producer String e2 -> Eff es r
stdinLn IOE e1
io Producer String e2
c = Eff es () -> Eff es r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff es () -> Eff es r) -> Eff es () -> Eff es r
forall a b. (a -> b) -> a -> b
$ do
String
line <- IOE e1 -> IO String -> Eff es String
forall (e :: Effects) (es :: Effects) a.
(e :> es) =>
IOE e -> IO a -> Eff es a
effIO IOE e1
io IO String
getLine
Producer String e2 -> String -> Eff es ()
forall (e :: Effects) (es :: Effects) x1 x a.
(e :> es) =>
Proxy x1 x () a e -> a -> Eff es ()
yield Producer String e2
c String
line
stdoutLn ::
(e1 :> es, e2 :> es) =>
IOE e1 ->
Consumer String e2 ->
Eff es r
stdoutLn :: forall (e1 :: Effects) (es :: Effects) (e2 :: Effects) r.
(e1 :> es, e2 :> es) =>
IOE e1 -> Consumer String e2 -> Eff es r
stdoutLn IOE e1
io Consumer String e2
c = Eff es () -> Eff es r
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Eff es () -> Eff es r) -> Eff es () -> Eff es r
forall a b. (a -> b) -> a -> b
$ do
String
line <- Consumer String e2 -> Eff es String
forall (e :: Effects) (es :: Effects) a y' y.
(e :> es) =>
Proxy () a y' y e -> Eff es a
await Consumer String e2
c
IOE e1 -> IO () -> Eff es ()
forall (e :: Effects) (es :: Effects) a.
(e :> es) =>
IOE e -> IO a -> Eff es a
effIO IOE e1
io (String -> IO ()
putStrLn String
line)