module GraphRewriting.Pattern.Internal where
import GraphRewriting.Graph.Types
import Control.Monad.Reader
newtype Pattern n a = Pattern {pattern ∷ Match → ReaderT (Graph n) [] (Match, a)}
type Match = [Node]
branch ∷ [a] → Pattern n a
branch xs = Pattern $ \m → lift [([],x) | x ← xs]
visit ∷ Node → Pattern n ()
visit n = Pattern $ \m → lift [([n],())]
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]