;; mapgraph.hs — adjacency-list using Data.Map (BFS-style traversal).
;;
;; Exercises Phase 11: `import qualified Data.Map as Map`, `Map.empty`,
;; `Map.insert`, `Map.lookup`, `Map.findWithDefault`. Adjacency lists are
;; stored as `Map Int [Int]`; `neighbors` does a default-empty lookup.

(define
  hk-mapgraph-source
  "import qualified Data.Map as Map\n\nemptyG = Map.empty\n\naddEdge u v g = Map.insertWith add u [v] g\n  where add new old = new ++ old\n\nbuild = addEdge 1 2 (addEdge 1 3 (addEdge 2 4 (addEdge 3 4 (addEdge 4 5 emptyG))))\n\nneighbors n g = Map.findWithDefault [] n g\n")

(hk-test
  "mapgraph.hs — neighbors of 1"
  (hk-deep-force
    (hk-run (str hk-mapgraph-source "main = neighbors 1 build\n")))
  (list ":" 2 (list ":" 3 (list "[]"))))

(hk-test
  "mapgraph.hs — neighbors of 4"
  (hk-deep-force
    (hk-run (str hk-mapgraph-source "main = neighbors 4 build\n")))
  (list ":" 5 (list "[]")))

(hk-test
  "mapgraph.hs — neighbors of 5 (leaf, no entry) defaults to []"
  (hk-deep-force
    (hk-run (str hk-mapgraph-source "main = neighbors 5 build\n")))
  (list "[]"))

(hk-test
  "mapgraph.hs — neighbors of 99 (absent) defaults to []"
  (hk-deep-force
    (hk-run (str hk-mapgraph-source "main = neighbors 99 build\n")))
  (list "[]"))

(hk-test
  "mapgraph.hs — Map.member 1"
  (hk-deep-force
    (hk-run (str hk-mapgraph-source "main = Map.member 1 build\n")))
  (list "True"))

(hk-test
  "mapgraph.hs — Map.size = 4 source nodes"
  (hk-deep-force (hk-run (str hk-mapgraph-source "main = Map.size build\n")))
  4)

{:fails hk-test-fails :pass hk-test-pass :fail hk-test-fail}
