packages feed

graph-rewriting-trs-0.1.4: Rules.hs

{-# 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