diff --git a/src/Search/EpsilonElimination.hs b/src/Search/EpsilonElimination.hs index 11771d22d47f3f6c95fbd6df597e2b416d9e779b..a7a7c08151f4b9f21fa9caffcbcb48dc2794e8c8 100644 --- a/src/Search/EpsilonElimination.hs +++ b/src/Search/EpsilonElimination.hs @@ -84,7 +84,7 @@ removeUnreachableNodes start graph = | node `S.member` visited = visited | otherwise = S.foldr (\succ visited' -> getReachable visited' succ) (S.insert node visited) (successors node) - successors node = S.map edgeTo $ graph M.! node + successors node = S.map edgeTo $ M.findWithDefault S.empty node graph -- | Return true iff the edge is an ɛ-transition isEpsilon :: Edge -> Bool diff --git a/test/Search/EpsilonEliminationSpec.hs b/test/Search/EpsilonEliminationSpec.hs index e68691dda1dd25b4f3ceaa0a95d4033ac95a263e..6006f1476f2e64b2a2267c5cf0b9da96c105128f 100644 --- a/test/Search/EpsilonEliminationSpec.hs +++ b/test/Search/EpsilonEliminationSpec.hs @@ -54,6 +54,15 @@ eliminateEpsilonsSpec = do ] in eliminateEpsilons (mkVertex "A") graph1 `shouldBe` graph2 + it "Works when not all vertices are keys in the map" $ + let + graph1 = mkGraph [ ("A", edges [(Nothing, "B"), (Just "c", "C")]) + , ("B", edges [(Just "b", "C")]) + ] + graph2 = mkGraph [ ("A", edges [(Just "b", "C"), (Just "c", "C")]) + ] + in eliminateEpsilons (mkVertex "A") graph1 `shouldBe` graph2 + epsilonClosureSpec :: Spec epsilonClosureSpec = do it "Returns the identity map for a graph without epsilons" $