in-other-words-0.1.0.0: src/Control/Effect/Fix.hs
module Control.Effect.Fix
( -- * Effects
Fix(..)
, module Control.Monad.Fix
-- * Interpretations
, fixToFinal
-- * Threading utilities
, threadFixViaClass
-- * Carriers
, FixToFinalC
) where
import Control.Monad.Fix
import Control.Effect
import Control.Effect.Primitive
import Control.Effect.Type.Fix
data FixToFinalH
instance (Carrier m, MonadFix m)
=> PrimHandler FixToFinalH Fix m where
effPrimHandler (Fix f) = mfix f
{-# INLINEABLE effPrimHandler #-}
type FixToFinalC = InterpretPrimC FixToFinalH Fix
-- | Run a 'Fix' effect if the final monad and
-- all carriers transforming it are 'MonadFix'.
--
-- @'Derivs' (FixToFinalC m) = 'Fix' ': 'Derivs' m@
--
-- @'Prims' (FixToFinalC m) = 'Fix' ': 'Prims' m@
fixToFinal :: ( Carrier m
, MonadFix m
)
=> FixToFinalC m a
-> m a
fixToFinal = interpretPrimViaHandler
{-# INLINEABLE fixToFinal #-}