module Data.Registry.RIO where
import Control.Monad.Trans.Resource
import Data.Registry.Make
import Data.Registry.Registry
import Data.Registry.Solver
import Protolude
type RIO = ResourceT IO
withRegistry ::
forall a b ins out m.
(Typeable a, Contains (RIO a) out, Solvable ins out, MonadIO m, MemoizedActions out) =>
Registry ins out ->
(a -> IO b) ->
m b
withRegistry :: forall a b (ins :: [*]) (out :: [*]) (m :: * -> *).
(Typeable a, Contains (RIO a) out, Solvable ins out, MonadIO m,
MemoizedActions out) =>
Registry ins out -> (a -> IO b) -> m b
withRegistry Registry ins out
registry a -> IO b
f = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) a. MonadUnliftIO m => ResourceT m a -> m a
runResourceT (forall a (ins :: [*]) (out :: [*]).
(Typeable a, Contains (RIO a) out, Solvable ins out,
MemoizedActions out) =>
Registry ins out -> RIO a
runRegistryT @a Registry ins out
registry forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> IO b
f)
runRegistryT ::
forall a ins out .
(Typeable a, Contains (RIO a) out, Solvable ins out, MemoizedActions out) =>
Registry ins out ->
ResourceT IO a
runRegistryT :: forall a (ins :: [*]) (out :: [*]).
(Typeable a, Contains (RIO a) out, Solvable ins out,
MemoizedActions out) =>
Registry ins out -> RIO a
runRegistryT Registry ins out
registry =
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall (m :: * -> *) (ins :: [*]) (out :: [*]).
(MonadIO m, MemoizedActions out) =>
Registry ins out -> IO (Registry ins out)
memoizeAll @RIO Registry ins out
registry) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a (ins :: [*]) (out :: [*]).
Typeable a =>
Registry ins out -> a
make @(RIO a)