-- SPDX-License-Identifier: MPL-2.0

{- |
Copyright   :  (c) 2024 Sayo Koyoneda
License     :  MPL-2.0 (see the LICENSE file)
Maintainer  :  ymdfield@outlook.jp

Interpreters for the [Unlift]("Data.Effect.Unlift") effects.
-}
module Control.Monad.Hefty.Unlift (
    module Control.Monad.Hefty.Unlift,
    module Data.Effect.Unlift,
)
where

import Control.Monad.Hefty (Eff, interpretH, runEff, send0, type (~>))
import Data.Effect.Unlift
import UnliftIO (MonadUnliftIO)
import UnliftIO qualified as IO

runUnliftBase :: forall b. (Monad b) => Eff '[UnliftBase b] '[b] ~> b
runUnliftBase :: forall (b :: * -> *). Monad b => Eff '[UnliftBase b] '[b] ~> b
runUnliftBase =
    Eff '[] '[b] x -> b x
Eff '[] '[b] ~> b
forall (m :: * -> *). Monad m => Eff '[] '[m] ~> m
runEff (Eff '[] '[b] x -> b x)
-> (Eff '[UnliftBase b] '[b] x -> Eff '[] '[b] x)
-> Eff '[UnliftBase b] '[b] x
-> b x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnliftBase b ~~> Eff '[] '[b])
-> Eff '[UnliftBase b] '[b] ~> Eff '[] '[b]
forall (e :: (* -> *) -> * -> *) (eh :: [(* -> *) -> * -> *])
       (ef :: [* -> *]).
HFunctor e =>
(e ~~> Eff eh ef) -> Eff (e : eh) ef ~> Eff eh ef
interpretH \(WithRunInBase (Eff '[] '[b] ~> b) -> b x
f) ->
        b x -> Eff '[] '[b] x
forall (e :: * -> *) (eh :: [(* -> *) -> * -> *]) (ef :: [* -> *])
       x.
e x -> Eff eh (e : ef) x
send0 (b x -> Eff '[] '[b] x) -> b x -> Eff '[] '[b] x
forall a b. (a -> b) -> a -> b
$ (Eff '[] '[b] ~> b) -> b x
f Eff '[] '[b] x -> b x
Eff '[] '[b] ~> b
forall (m :: * -> *). Monad m => Eff '[] '[m] ~> m
runEff

runUnliftIO :: (MonadUnliftIO m) => Eff '[UnliftIO] '[m] ~> m
runUnliftIO :: forall (m :: * -> *). MonadUnliftIO m => Eff '[UnliftIO] '[m] ~> m
runUnliftIO =
    Eff '[] '[m] x -> m x
Eff '[] '[m] ~> m
forall (m :: * -> *). Monad m => Eff '[] '[m] ~> m
runEff (Eff '[] '[m] x -> m x)
-> (Eff '[UnliftIO] '[m] x -> Eff '[] '[m] x)
-> Eff '[UnliftIO] '[m] x
-> m x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UnliftIO ~~> Eff '[] '[m]) -> Eff '[UnliftIO] '[m] ~> Eff '[] '[m]
forall (e :: (* -> *) -> * -> *) (eh :: [(* -> *) -> * -> *])
       (ef :: [* -> *]).
HFunctor e =>
(e ~~> Eff eh ef) -> Eff (e : eh) ef ~> Eff eh ef
interpretH \(WithRunInBase (forall x. Eff '[] '[m] x -> IO x) -> IO x
f) ->
        m x -> Eff '[] '[m] x
forall (e :: * -> *) (eh :: [(* -> *) -> * -> *]) (ef :: [* -> *])
       x.
e x -> Eff eh (e : ef) x
send0 (m x -> Eff '[] '[m] x) -> m x -> Eff '[] '[m] x
forall a b. (a -> b) -> a -> b
$ ((forall a. m a -> IO a) -> IO x) -> m x
forall b. ((forall a. m a -> IO a) -> IO b) -> m b
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
IO.withRunInIO \forall a. m a -> IO a
run -> (forall x. Eff '[] '[m] x -> IO x) -> IO x
f ((forall x. Eff '[] '[m] x -> IO x) -> IO x)
-> (forall x. Eff '[] '[m] x -> IO x) -> IO x
forall a b. (a -> b) -> a -> b
$ m x -> IO x
forall a. m a -> IO a
run (m x -> IO x) -> (Eff '[] '[m] x -> m x) -> Eff '[] '[m] x -> IO x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Eff '[] '[m] x -> m x
Eff '[] '[m] ~> m
forall (m :: * -> *). Monad m => Eff '[] '[m] ~> m
runEff