ribosome-0.9.9.9: lib/Ribosome/Final.hs
{-# options_haddock prune, hide #-}
-- |Combinators for using 'Final', used internally.
module Ribosome.Final where
import Polysemy.Final (withWeavingToFinal)
inFinal ::
∀ r a .
Member (Final IO) r =>
(∀ f . Functor f => f () -> (∀ x . Sem r x -> IO (f x)) -> (∀ x . x -> IO (f x)) -> (∀ x . f x -> Maybe x) -> IO (f a)) ->
Sem r a
inFinal f =
withWeavingToFinal \ s wv ex ->
f s (\ ma -> wv (ma <$ s)) (\ a -> pure (a <$ s)) ex
inFinal_ ::
∀ r a .
Member (Final IO) r =>
(∀ f . Functor f => (∀ x . Sem r x -> IO (Maybe x)) -> (Sem r () -> IO ()) -> (∀ x . x -> IO (f x)) -> IO (f a)) ->
Sem r a
inFinal_ f =
withWeavingToFinal \ s wv ex ->
let
lowerMaybe :: ∀ x . Sem r x -> IO (Maybe x)
lowerMaybe sem =
ex <$> wv (sem <$ s)
lowerUnit :: ∀ x . Sem r x -> IO ()
lowerUnit =
fmap (fromMaybe ()) . lowerMaybe . void
in f lowerMaybe lowerUnit (\ a -> pure (a <$ s))