44 Monadic interface to e-graph stateful computations
55 -}
66module 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
3034import Data.Equality.Utils (Fix , cata )
3135
3236import Data.Equality.Analysis
37+ import qualified Data.Equality.Analysis.Monadic as AM
3338import Data.Equality.Graph (EGraph , ClassId , Language , ENode (.. ))
3439import qualified Data.Equality.Graph as EG
3540
3641-- | E-graph stateful computation
3742type 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)
8490runEGraphM = 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