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
1820 , runEGraphM
21+ , runEGraphMT
1922
2023 -- * E-graph definition re-export
2124 , EG. EGraph
@@ -30,11 +33,13 @@ import Control.Monad.Trans.State.Strict
3033import Data.Equality.Utils (Fix , cata )
3134
3235import Data.Equality.Analysis
36+ import qualified Data.Equality.Analysis.Monadic as AM
3337import Data.Equality.Graph (EGraph , ClassId , Language , ENode (.. ))
3438import qualified Data.Equality.Graph as EG
3539
3640-- | E-graph stateful computation
3741type 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)
8489runEGraphM = 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