Skip to content

Commit eae2661

Browse files
committed
Add monadic Analysis functions to E.Graph.Monad
1 parent 88e4c52 commit eae2661

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

src/Data/Equality/Graph/Monad.hs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@
44
Monadic interface to e-graph stateful computations
55
-}
66
module Data.Equality.Graph.Monad
7-
( egraph
7+
(
8+
egraph
89
, represent
910
, add
1011
, merge
1112
, rebuild
1213
, EG.canonicalize
1314
, EG.find
1415
, EG.emptyEGraph
16+
, representM, addM, mergeM, rebuildM
1517

1618
-- * E-graph stateful computations
1719
, EGraphM
20+
, EGraphMT
1821
, runEGraphM
22+
, runEGraphMT
1923

2024
-- * E-graph definition re-export
2125
, EG.EGraph
@@ -30,11 +34,13 @@ import Control.Monad.Trans.State.Strict
3034
import Data.Equality.Utils (Fix, cata)
3135

3236
import Data.Equality.Analysis
37+
import qualified Data.Equality.Analysis.Monadic as AM
3338
import Data.Equality.Graph (EGraph, ClassId, Language, ENode(..))
3439
import qualified Data.Equality.Graph as EG
3540

3641
-- | E-graph stateful computation
3742
type EGraphM a l = State (EGraph a l)
43+
type EGraphMT a l = StateT (EGraph a l)
3844

3945
-- | Run EGraph computation on an empty e-graph
4046
--
@@ -84,3 +90,26 @@ runEGraphM :: EGraph anl l -> EGraphM anl l a -> (a, EGraph anl l)
8490
runEGraphM = flip runState
8591
{-# INLINE runEGraphM #-}
8692

93+
--------------------------------------------------------------------------------
94+
-- Monadic Analysis interface
95+
96+
-- | Run 'EGraphM' computation on a given e-graph over a monadic analysis
97+
runEGraphMT :: EGraph anl l -> EGraphMT anl l m a -> m (a, EGraph anl l)
98+
runEGraphMT = flip runStateT
99+
{-# INLINE runEGraphMT #-}
100+
101+
representM :: (AM.Analysis m anl l, Language l) => Fix l -> EGraphMT anl l m ClassId
102+
representM = StateT . EG.representM
103+
{-# INLINE representM #-}
104+
105+
addM :: (AM.Analysis m anl l, Language l) => ENode l -> EGraphMT anl l m ClassId
106+
addM = StateT . EG.addM
107+
{-# INLINE addM #-}
108+
109+
mergeM :: (AM.Analysis m anl l, Language l) => ClassId -> ClassId -> EGraphMT anl l m ClassId
110+
mergeM a b = StateT (EG.mergeM a b)
111+
{-# INLINE mergeM #-}
112+
113+
rebuildM :: (AM.Analysis m anl l, Language l) => EGraphMT anl l m ()
114+
rebuildM = StateT (fmap ((),) . EG.rebuildM)
115+
{-# INLINE rebuildM #-}

0 commit comments

Comments
 (0)