update' :: Input a => a -> StGNG a ()
update' input = do
    (n1, n2) <- neighborNodes input
    case headMay (intersect (n1^.edgeIds) (n2^.edgeIds)) of
        Nothing  -> (^.edgeId) <$> newEdge n1 n2 >> return ()
        Just eid -> modifyEdge (&age .~ 0) eid
    moveNodes input n1
    splitNodes
    aging n1
update' :: Input a => a -> StGNG a ()
update' input = do
    (n1, n2) <- neighborNodes input
    case headMay (intersect (n1^.edgeIds) (n2^.edgeIds)) of
        Nothing  -> (^.edgeId) <$> newEdge n1 n2 >> return ()
        Just eid -> modifyEdge (&age .~ 0) eid
    moveNodes input n1
    splitNodes
    aging n1
update' input = do
    (n1, n2) <- neighborNodes input
    case headMay (intersect (n1^.edgeIds) (n2^.edgeIds)) of
        Nothing  -> (^.edgeId) <$> newEdge n1 n2 >> return ()
        Just eid -> modifyEdge (&age .~ 0) eid
    moveNodes input n1
    splitNodes
    aging n1