module GraphRewriting.Pattern.Internal where import Prelude.Unicode import GraphRewriting.Graph.Types import Control.Monad.Reader newtype Pattern n a = Pattern {pattern ∷ Match → ReaderT (Graph n) [] (Match, a)} type Match = [Node] instance Monad (Pattern n) where return x = Pattern $ \m → return ([],x) p >>= f = Pattern $ \m → do (m1,x) ← pattern p m (m2,y) ← pattern (f x) (m1 ⧺ m) return (m1 ⧺ m2, y) fail str = Pattern $ \m → lift [] instance MonadPlus (Pattern n) where mzero = fail "empty result list" mplus p q = Pattern $ \m → do g ← ask lift $ runReaderT (pattern p m) g ⧺ runReaderT (pattern q m) g liftList ∷ Reader (Graph n) [a] → Pattern n a liftList r = Pattern $ \m → do xs ← liftM (runReader r) ask lift [([],x) | x ← xs] liftMatches ∷ Reader (Graph n) [Node] → Pattern n Node liftMatches r = Pattern $ \m → do ns ← liftM (runReader r) ask lift [([n],n) | n ← ns]