module Canopy.Graph where import Prelude import Data.Array as Array import Data.List (List(..)) newtype Node v = Node { adjacentTo :: Array Index , value :: v } type Graph v = List (Node v) type Index = Int adjacentTo :: forall v. Node v -> Array Index adjacentTo (Node {adjacentTo}) = adjacentTo areAdjacent :: forall v. Index -> Index -> Graph v -> Boolean areAdjacent first second Nil = false areAdjacent first second whole@(Cons node graph) | first == second = false | first > second = areAdjacent second first whole | first == 0 = Array.elem second (adjacentTo node) | otherwise = areAdjacent (first - 1) (second - 1) graph