{-# LANGUAGE NoImplicitPrelude #-}

module Control.Syntax.DataFlow ((>>=), (>>), (*>), pure, return, (<*>), (<*)) where

import Prelude.Linear qualified as PL

(>>=) :: a %1 -> (a %1 -> b) %1 -> b
a
a >>= :: forall a b. a %1 -> (a %1 -> b) %1 -> b
>>= a %1 -> b
b = a %1 -> b
b a
a

(>>) :: (PL.Consumable a) => a %1 -> b %1 -> b
a
a >> :: forall a b. Consumable a => a %1 -> b %1 -> b
>> b
b = a %1 -> ()
forall a. Consumable a => a %1 -> ()
PL.consume a
a () %1 -> (() %1 -> b) %1 -> b
forall a b (p :: Multiplicity) (q :: Multiplicity).
a %p -> (a %p -> b) %q -> b
PL.& \() -> b
b

(*>) :: (PL.Consumable a) => a %1 -> b %1 -> b
*> :: forall a b. Consumable a => a %1 -> b %1 -> b
(*>) = a %1 -> b %1 -> b
forall a b. Consumable a => a %1 -> b %1 -> b
(>>)

(<*) :: (PL.Consumable b) => a %1 -> b %1 -> a
a
a <* :: forall b a. Consumable b => a %1 -> b %1 -> a
<* b
b = b %1 -> ()
forall a. Consumable a => a %1 -> ()
PL.consume b
b () %1 -> (() %1 -> a) %1 -> a
forall a b (p :: Multiplicity) (q :: Multiplicity).
a %p -> (a %p -> b) %q -> b
PL.& \() -> a
a

pure :: a %1 -> a
pure :: forall a. a %1 -> a
pure = a %1 -> a
forall a (q :: Multiplicity). a %q -> a
PL.id

return :: a %1 -> a
return :: forall a. a %1 -> a
return = a %1 -> a
forall a (q :: Multiplicity). a %q -> a
PL.id

(<*>) :: (a %1 -> b) %1 -> a %1 -> b
a %1 -> b
f <*> :: forall a b. (a %1 -> b) %1 -> a %1 -> b
<*> a
a = a %1 -> b
f a
a