{-# LANGUAGE Trustworthy #-}
module Cleff.Input
(
Input (..)
, input
, inputs
, runInputConst
, inputToListState
, inputToReader
, runInputEff
, mapInput
, bindInput
) where
import Cleff
import Cleff.Reader
import Cleff.State
data Input i :: Effect where
Input :: Input i m i
makeEffect_ ''Input
input :: Input i :> es => Eff es i
inputs :: Input i :> es => (i -> i') -> Eff es i'
inputs :: (i -> i') -> Eff es i'
inputs i -> i'
f = i -> i'
f (i -> i') -> Eff es i -> Eff es i'
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Eff es i
forall i (es :: [(Type -> Type) -> Type -> Type]).
(Input i :> es) =>
Eff es i
input
runInputConst :: i -> Eff (Input i ': es) ~> Eff es
runInputConst :: i -> Eff (Input i : es) ~> Eff es
runInputConst i
x = Handler (Input i) es -> Eff (Input i : es) ~> Eff es
forall (e :: (Type -> Type) -> Type -> Type)
(es :: [(Type -> Type) -> Type -> Type]).
Handler e es -> Eff (e : es) ~> Eff es
interpret \case
Input i (Eff esSend) a
Input -> i -> Eff es i
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure i
x
{-# INLINE runInputConst #-}
inputToListState :: Eff (Input (Maybe i) ': es) ~> Eff (State [i] ': es)
inputToListState :: Eff (Input (Maybe i) : es) a -> Eff (State [i] : es) a
inputToListState = Handler (Input (Maybe i)) (State [i] : es)
-> Eff (Input (Maybe i) : es) ~> Eff (State [i] : es)
forall (e' :: (Type -> Type) -> Type -> Type)
(e :: (Type -> Type) -> Type -> Type)
(es :: [(Type -> Type) -> Type -> Type]).
Handler e (e' : es) -> Eff (e : es) ~> Eff (e' : es)
reinterpret \case
Input (Maybe i) (Eff esSend) a
Input -> ([i] -> (Maybe i, [i])) -> Eff (State [i] : es) (Maybe i)
forall s (es :: [(Type -> Type) -> Type -> Type]) a.
(State s :> es) =>
(s -> (a, s)) -> Eff es a
state \case
[] -> (Maybe i
forall a. Maybe a
Nothing, [])
i
x : [i]
xs -> (i -> Maybe i
forall a. a -> Maybe a
Just i
x, [i]
xs)
{-# INLINE inputToListState #-}
inputToReader :: Eff (Input i ': es) ~> Eff (Reader i ': es)
inputToReader :: Eff (Input i : es) a -> Eff (Reader i : es) a
inputToReader = Handler (Input i) (Reader i : es)
-> Eff (Input i : es) ~> Eff (Reader i : es)
forall (e' :: (Type -> Type) -> Type -> Type)
(e :: (Type -> Type) -> Type -> Type)
(es :: [(Type -> Type) -> Type -> Type]).
Handler e (e' : es) -> Eff (e : es) ~> Eff (e' : es)
reinterpret \case
Input i (Eff esSend) a
Input -> Eff (Reader i : es) a
forall r (es :: [(Type -> Type) -> Type -> Type]).
(Reader r :> es) =>
Eff es r
ask
{-# INLINE inputToReader #-}
runInputEff :: Eff es i -> Eff (Input i ': es) ~> Eff es
runInputEff :: Eff es i -> Eff (Input i : es) ~> Eff es
runInputEff Eff es i
m = Handler (Input i) es -> Eff (Input i : es) ~> Eff es
forall (e :: (Type -> Type) -> Type -> Type)
(es :: [(Type -> Type) -> Type -> Type]).
Handler e es -> Eff (e : es) ~> Eff es
interpret \case
Input i (Eff esSend) a
Input -> Eff es i
Eff es a
m
{-# INLINE runInputEff #-}
mapInput :: Input i' :> es => (i' -> i) -> Eff (Input i ': es) ~> Eff es
mapInput :: (i' -> i) -> Eff (Input i : es) ~> Eff es
mapInput i' -> i
f = Handler (Input i) es -> Eff (Input i : es) ~> Eff es
forall (e :: (Type -> Type) -> Type -> Type)
(es :: [(Type -> Type) -> Type -> Type]).
Handler e es -> Eff (e : es) ~> Eff es
interpret \case
Input i (Eff esSend) a
Input -> i' -> i
f (i' -> i) -> Eff es i' -> Eff es i
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Eff es i'
forall i (es :: [(Type -> Type) -> Type -> Type]).
(Input i :> es) =>
Eff es i
input
{-# INLINE mapInput #-}
bindInput :: Input i' :> es => (i' -> Eff es i) -> Eff (Input i ': es) ~> Eff es
bindInput :: (i' -> Eff es i) -> Eff (Input i : es) ~> Eff es
bindInput i' -> Eff es i
f = Handler (Input i) es -> Eff (Input i : es) ~> Eff es
forall (e :: (Type -> Type) -> Type -> Type)
(es :: [(Type -> Type) -> Type -> Type]).
Handler e es -> Eff (e : es) ~> Eff es
interpret \case
Input i (Eff esSend) a
Input -> i' -> Eff es i
f (i' -> Eff es i) -> Eff es i' -> Eff es i
forall (m :: Type -> Type) a b. Monad m => (a -> m b) -> m a -> m b
=<< Eff es i'
forall i (es :: [(Type -> Type) -> Type -> Type]).
(Input i :> es) =>
Eff es i
input
{-# INLINE bindInput #-}