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 ()

-- | @pipe@'s 'next' doesn't exist in Bluefin
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)