Skip to content

Commit cf71717

Browse files
fix exponential implementation of transitiveDependencies
1 parent bac841d commit cf71717

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

src/Constrained/Graph.hs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,12 @@ irreflexiveDependencyOn xs ys =
128128

129129
-- | Get all down-stream dependencies of a node
130130
transitiveDependencies :: Ord node => node -> Graph node -> Set node
131-
transitiveDependencies x (Graph e _) = go (Set.singleton x) x
131+
transitiveDependencies x (Graph e _) = go mempty (Set.toList $ fromMaybe mempty $ Map.lookup x e)
132132
where
133-
go seen y = ys <> foldMap (go $ Set.insert y seen) (Set.difference ys seen)
134-
where
135-
ys = fromMaybe mempty (Map.lookup y e)
133+
go deps [] = deps
134+
go deps (y:ys)
135+
| y `Set.member` deps = go deps ys
136+
| otherwise = go (Set.insert y deps) (ys ++ Set.toList (fromMaybe mempty $ Map.lookup y e))
136137

137138
-- | Take the transitive closure of the graph
138139
transitiveClosure :: Ord node => Graph node -> Graph node

0 commit comments

Comments
 (0)