packages feed

calamity-0.1.8.0: src/Calamity/Internal/RunIntoIO.hs

{-# LANGUAGE TemplateHaskell #-}

-- | Something for converting polysemy actions into IO actions
module Calamity.Internal.RunIntoIO
    ( IntoIO(..)
    , runIntoIOFinal
    , intoIO ) where

import           Control.Monad

import           Data.Functor

import qualified Polysemy                         as P
import qualified Polysemy.Final                   as P

data IntoIO p m a where
  IntoIO :: (p -> m ()) -> IntoIO p m (p -> IO ())

runIntoIOFinal :: forall r p a. P.Member (P.Final IO) r => P.Sem (IntoIO p ': r) a -> P.Sem r a
runIntoIOFinal = P.interpretFinal $ \case
  IntoIO m -> do
    istate <- P.getInitialStateS
    m' <- P.bindS m
    P.liftS $ pure (\x -> void (m' $ istate $> x))

P.makeSem ''IntoIO