Hát... ennyivel:
Before:
breakEdgeApart :: Graph -> Edge -> Edge -> Position -> Graph
After:
breakEdgeApart (Graph ns es) e e1 p =
Graph (replace [oldStart, oldEnd]
[newStart, newEnd, newNode] ns)
(replace [e]
[newEdge1, newEdge2, newIntersectingEdge] es)
where
oldStart = start e
oldEnd = end e
newStart = Node (pos oldStart)
(replace [e] [newEdge1] (neighbours
oldStart)) Full
newEnd = Node (pos oldEnd)
(replace [e] [newEdge2] (neighbours
oldEnd)) Full
newEdge1 = Edge newStart newNode (isHighway e)
newEdge2 = Edge newNode newEnd (isHighway e)
newNode = Node p [newEdge1, newEdge2,
newIntersectingEdge] Full
-- This is the edge that broke the observed edge.
newIntersectingEdge =
Edge (start e1) newNode (isHighway e1)
breakEdgeWith :: Edge -> Edge -> Node -> State Graph ()
Még mondjuk nem ellenőriztem le, de az alfüggvények tuti jól működnek, mert megnéztem. Ugye, hogy mennyivel rövidebb? :D
breakEdgeWith edgeToBreak edgeWith newNode = do
g <- get
let
n1 = start edgeToBreak
n2 = end edgeToBreak
disconnect (n1, n2)
connect (n1, newNode)
connect (n2, newNode)