{-# LANGUAGE AllowAmbiguousTypes #-}
module Data.Registry.State where
import Control.Monad.Morph
import Data.Registry.Internal.Types
import Data.Registry.Lift
import Data.Registry.Registry
import Data.Registry.Solver
import Protolude
runS :: (MFunctor m, Monad n) => Registry ins out -> m (StateT (Registry ins out) n) a -> m n a
runS :: forall {k} (m :: (* -> *) -> k -> *) (n :: * -> *) (ins :: [*])
(out :: [*]) (a :: k).
(MFunctor m, Monad n) =>
Registry ins out -> m (StateT (Registry ins out) n) a -> m n a
runS Registry ins out
r = forall {k} (t :: (* -> *) -> k -> *) (m :: * -> *) (n :: * -> *)
(b :: k).
(MFunctor t, Monad m) =>
(forall a. m a -> n a) -> t m b -> t n b
hoist (forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
`evalStateT` Registry ins out
r)
addFunTo :: forall m a b ins out. (ApplyVariadic m a b, Typeable a, Typeable b, IsSubset (Inputs b) out b) => a -> Registry ins out -> Registry ins out
addFunTo :: forall (m :: * -> *) a b (ins :: [*]) (out :: [*]).
(ApplyVariadic m a b, Typeable a, Typeable b,
IsSubset (Inputs b) out b) =>
a -> Registry ins out -> Registry ins out
addFunTo = forall a (out :: [*]) (ins :: [*]).
(Typeable a, IsSubset (Inputs a) out a) =>
Typed a -> Registry ins out -> Registry ins out
addToRegistry @b forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b.
(ApplyVariadic m a b, Typeable a, Typeable b) =>
a -> Typed b
funTo @m
addFunToUnsafe :: forall m a b ins out. (ApplyVariadic m a b, Typeable a, Typeable b) => a -> Registry ins out -> Registry ins out
addFunToUnsafe :: forall (m :: * -> *) a b (ins :: [*]) (out :: [*]).
(ApplyVariadic m a b, Typeable a, Typeable b) =>
a -> Registry ins out -> Registry ins out
addFunToUnsafe = forall {k} (a :: k) (ins :: [*]) (out :: [*]).
Typeable a =>
Typed a -> Registry ins out -> Registry ins out
addToRegistryUnsafe @b forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b.
(ApplyVariadic m a b, Typeable a, Typeable b) =>
a -> Typed b
funTo @m
addFunS :: (Typeable a, IsSubset (Inputs a) out a, MonadState (Registry ins out) m) => a -> m ()
addFunS :: forall a (out :: [*]) (ins :: [*]) (m :: * -> *).
(Typeable a, IsSubset (Inputs a) out a,
MonadState (Registry ins out) m) =>
a -> m ()
addFunS = forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (out :: [*]) (ins :: [*]).
(Typeable a, IsSubset (Inputs a) out a) =>
a -> Registry ins out -> Registry ins out
addFun
addFunUnsafeS :: (Typeable a, MonadState (Registry ins out) m) => a -> m ()
addFunUnsafeS :: forall a (ins :: [*]) (out :: [*]) (m :: * -> *).
(Typeable a, MonadState (Registry ins out) m) =>
a -> m ()
addFunUnsafeS = forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (ins :: [*]) (out :: [*]).
Typeable a =>
a -> Registry ins out -> Registry ins out
addFunUnsafe
addToS :: forall n a b m ins out. (ApplyVariadic n a b, Typeable a, Typeable b, Typeable a, IsSubset (Inputs b) out b, MonadState (Registry ins out) m) => a -> m ()
addToS :: forall (n :: * -> *) a b (m :: * -> *) (ins :: [*]) (out :: [*]).
(ApplyVariadic n a b, Typeable a, Typeable b, Typeable a,
IsSubset (Inputs b) out b, MonadState (Registry ins out) m) =>
a -> m ()
addToS = forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b (ins :: [*]) (out :: [*]).
(ApplyVariadic m a b, Typeable a, Typeable b,
IsSubset (Inputs b) out b) =>
a -> Registry ins out -> Registry ins out
addFunTo @n @a @b
addToUnsafeS :: forall n a b m ins out. (ApplyVariadic n a b, Typeable a, Typeable b, Typeable a, MonadState (Registry ins out) m) => a -> m ()
addToUnsafeS :: forall (n :: * -> *) a b (m :: * -> *) (ins :: [*]) (out :: [*]).
(ApplyVariadic n a b, Typeable a, Typeable b, Typeable a,
MonadState (Registry ins out) m) =>
a -> m ()
addToUnsafeS = forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a b (ins :: [*]) (out :: [*]).
(ApplyVariadic m a b, Typeable a, Typeable b) =>
a -> Registry ins out -> Registry ins out
addFunToUnsafe @n @a @b
addFun :: (Typeable a, IsSubset (Inputs a) out a) => a -> Registry ins out -> Registry ins out
addFun :: forall a (out :: [*]) (ins :: [*]).
(Typeable a, IsSubset (Inputs a) out a) =>
a -> Registry ins out -> Registry ins out
addFun = forall a (out :: [*]) (ins :: [*]).
(Typeable a, IsSubset (Inputs a) out a) =>
Typed a -> Registry ins out -> Registry ins out
addToRegistry forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Typeable a => a -> Typed a
fun
addFunUnsafe :: (Typeable a) => a -> Registry ins out -> Registry ins out
addFunUnsafe :: forall a (ins :: [*]) (out :: [*]).
Typeable a =>
a -> Registry ins out -> Registry ins out
addFunUnsafe = forall {k} (a :: k) (ins :: [*]) (out :: [*]).
Typeable a =>
Typed a -> Registry ins out -> Registry ins out
addToRegistryUnsafe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Typeable a => a -> Typed a
fun
addToRegistry :: (Typeable a, IsSubset (Inputs a) out a) => Typed a -> Registry ins out -> Registry ins out
addToRegistry :: forall a (out :: [*]) (ins :: [*]).
(Typeable a, IsSubset (Inputs a) out a) =>
Typed a -> Registry ins out -> Registry ins out
addToRegistry (TypedValue Value
v) (Registry (Values [Value]
vs) Functions
functions Specializations
specializations Modifiers
modifiers) =
forall (inputs :: [*]) (outputs :: [*]).
Values
-> Functions
-> Specializations
-> Modifiers
-> Registry inputs outputs
Registry ([Value] -> Values
Values (Value
v forall a. a -> [a] -> [a]
: [Value]
vs)) Functions
functions Specializations
specializations Modifiers
modifiers
addToRegistry (TypedFunction Function
f) (Registry (Values [Value]
vs) (Functions [Function]
fs) Specializations
specializations Modifiers
modifiers) =
forall (inputs :: [*]) (outputs :: [*]).
Values
-> Functions
-> Specializations
-> Modifiers
-> Registry inputs outputs
Registry ([Value] -> Values
Values [Value]
vs) ([Function] -> Functions
Functions (Function
f forall a. a -> [a] -> [a]
: [Function]
fs)) Specializations
specializations Modifiers
modifiers
concatUnsafeS :: (MonadState (Registry ins out) m) => Registry ins' out' -> m ()
concatUnsafeS :: forall (ins :: [*]) (out :: [*]) (m :: * -> *) (ins' :: [*])
(out' :: [*]).
MonadState (Registry ins out) m =>
Registry ins' out' -> m ()
concatUnsafeS Registry ins' out'
r = forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (forall (ins :: [*]) (out :: [*]) (ins' :: [*]) (out' :: [*]).
Registry ins out -> Registry ins' out' -> Registry ins' out'
concatRegistryUnsafe Registry ins' out'
r)
addToRegistryUnsafe :: (Typeable a) => Typed a -> Registry ins out -> Registry ins out
addToRegistryUnsafe :: forall {k} (a :: k) (ins :: [*]) (out :: [*]).
Typeable a =>
Typed a -> Registry ins out -> Registry ins out
addToRegistryUnsafe (TypedValue Value
v) (Registry (Values [Value]
vs) Functions
functions Specializations
specializations Modifiers
modifiers) =
forall (inputs :: [*]) (outputs :: [*]).
Values
-> Functions
-> Specializations
-> Modifiers
-> Registry inputs outputs
Registry ([Value] -> Values
Values (Value
v forall a. a -> [a] -> [a]
: [Value]
vs)) Functions
functions Specializations
specializations Modifiers
modifiers
addToRegistryUnsafe (TypedFunction Function
f) (Registry (Values [Value]
vs) (Functions [Function]
fs) Specializations
specializations Modifiers
modifiers) =
forall (inputs :: [*]) (outputs :: [*]).
Values
-> Functions
-> Specializations
-> Modifiers
-> Registry inputs outputs
Registry ([Value] -> Values
Values [Value]
vs) ([Function] -> Functions
Functions (Function
f forall a. a -> [a] -> [a]
: [Function]
fs)) Specializations
specializations Modifiers
modifiers
concatRegistryUnsafe :: Registry ins out -> Registry ins' out' -> Registry ins' out'
concatRegistryUnsafe :: forall (ins :: [*]) (out :: [*]) (ins' :: [*]) (out' :: [*]).
Registry ins out -> Registry ins' out' -> Registry ins' out'
concatRegistryUnsafe
(Registry (Values [Value]
vs1) (Functions [Function]
fs1) (Specializations [Specialization]
ss1) (Modifiers [(SomeTypeRep, ModifierFunction)]
ms1))
(Registry (Values [Value]
vs2) (Functions [Function]
fs2) (Specializations [Specialization]
ss2) (Modifiers [(SomeTypeRep, ModifierFunction)]
ms2)) =
forall (inputs :: [*]) (outputs :: [*]).
Values
-> Functions
-> Specializations
-> Modifiers
-> Registry inputs outputs
Registry ([Value] -> Values
Values ([Value]
vs1 forall a. Semigroup a => a -> a -> a
<> [Value]
vs2)) ([Function] -> Functions
Functions ([Function]
fs1 forall a. Semigroup a => a -> a -> a
<> [Function]
fs2)) ([Specialization] -> Specializations
Specializations ([Specialization]
ss1 forall a. Semigroup a => a -> a -> a
<> [Specialization]
ss2)) ([(SomeTypeRep, ModifierFunction)] -> Modifiers
Modifiers ([(SomeTypeRep, ModifierFunction)]
ms1 forall a. Semigroup a => a -> a -> a
<> [(SomeTypeRep, ModifierFunction)]
ms2))