{-# LANGUAGE UnicodeSyntax, FlexibleContexts #-} module Rules where import Prelude.Unicode import Graph import GraphRewriting import GraphRewriting.Graph.Read import GraphRewriting.Graph.Write import GraphRewriting.Graph.Write.Unsafe as Unsafe import Control.Monad (liftM, replicateM) import Data.Maybe (catMaybes) unshare ∷ (View [Port] n, View Vertex n) ⇒ Rule n unshare = do e ← edge c ← liftReader $ edgeCardinality e require (c > 2) v ← nodeAt e require (e ≡ inp v) rewrite $ \[n] → do es ← deleteEdge e v' ← inspectNode n mapM (copyNode n) [v {inp = i} | i ← es, i ≢ inp v'] deleteNode n eraseRule ∷ (View [Port] n, View Vertex n) ⇒ Rule n eraseRule = do e ← edge c ← liftReader $ edgeCardinality e require (c ≡ 1) nodeAt e ∷ View Vertex n ⇒ Pattern n Vertex erase