Skip to content

Commit 9c364ce

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

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/Data/Equality/Graph/Monad.hs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@
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
1820
, runEGraphM
21+
, runEGraphMT
1922

2023
-- * E-graph definition re-export
2124
, EG.EGraph
@@ -30,11 +33,13 @@ import Control.Monad.Trans.State.Strict
3033
import Data.Equality.Utils (Fix, cata)
3134

3235
import Data.Equality.Analysis
36+
import qualified Data.Equality.Analysis.Monadic as AM
3337
import Data.Equality.Graph (EGraph, ClassId, Language, ENode(..))
3438
import qualified Data.Equality.Graph as EG
3539

3640
-- | E-graph stateful computation
3741
type EGraphM a l = State (EGraph a l)
42+
type EGraphMT a l = StateT (EGraph a l)
3843

3944
-- | Run EGraph computation on an empty e-graph
4045
--
@@ -84,3 +89,26 @@ runEGraphM :: EGraph anl l -> EGraphM anl l a -> (a, EGraph anl l)
8489
runEGraphM = flip runState
8590
{-# INLINE runEGraphM #-}
8691

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

0 commit comments

Comments
 (0)