{-# LANGUAGE UnicodeSyntax, FlexibleContexts, ScopedTypeVariables #-} module Rules where import Prelude.Unicode import Graph import GraphRewriting unshare ∷ (View [Port] n, View Vertex n) ⇒ Rule n unshare = do e ← edge c ← liftReader $ edgeCardinality e require (c > 2) v ← nodeWith 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 requireM $ liftReader $ dangling e _ ∷ [Port] ← nodeWith e erase