1
1
mirror of https://github.com/github/semantic.git synced 2024-12-24 23:42:31 +03:00

runEffects produces the final result directly.

This commit is contained in:
Rob Rix 2018-03-14 14:02:02 -04:00
parent 8ff194439c
commit a2dffe278c
2 changed files with 8 additions and 9 deletions

View File

@ -13,7 +13,6 @@ module Control.Abstract.Analysis
import Control.Abstract.Evaluator as X
import Control.Effect as X
import qualified Control.Monad.Effect as Effect
import Control.Monad.Effect.Fail as X
import Control.Monad.Effect.Fresh as X
import Control.Monad.Effect.NonDet as X
@ -100,4 +99,4 @@ runAnalysis :: ( Effectful m
)
=> m effects a
-> Final effects a
runAnalysis = Effect.run . runEffects . lower
runAnalysis = runEffects . lower

View File

@ -13,21 +13,21 @@ import Prologue
-- | Run an 'Effectful' computation to completion, interpreting each effect with some sensible defaults, and return the 'Final' result.
run :: (Effectful m, RunEffects effects a) => m effects a -> Final effects a
run = Effect.run . runEffects . lower
run = runEffects . lower
-- | A typeclass to run a computation to completion, interpreting each effect with some sensible defaults.
class RunEffects effects a where
-- | The final result type of the computation, factoring in the results of any effects, e.g. pairing 'State' results with the final state, wrapping 'Fail' results in 'Either', etc.
type Final effects a
runEffects :: Eff effects a -> Eff '[] (Final effects a)
runEffects :: Eff effects a -> Final effects a
instance (RunEffect effect1 a, RunEffects (effect2 ': effects) (Result effect1 a)) => RunEffects (effect1 ': effect2 ': effects) a where
type Final (effect1 ': effect2 ': effects) a = Final (effect2 ': effects) (Result effect1 a)
instance (RunEffect effect1 a, RunEffects effects (Result effect1 a)) => RunEffects (effect1 ': effects) a where
type Final (effect1 ': effects) a = Final effects (Result effect1 a)
runEffects = runEffects . runEffect
instance RunEffect effect a => RunEffects '[effect] a where
type Final '[effect] a = Result effect a
runEffects = runEffect
instance RunEffects '[] a where
type Final '[] a = a
runEffects = Effect.run
-- | A typeclass to interpret a single effect with some sensible defaults (defined per-effect).