on master help sign in
Switch testsAtPath to be O(n * log n) rather than O(n^2)
a6568b9Evan Czaplicki
src/Optimize/Patterns/DecisionTree.hs+14−1
@@ -15,6 +15,7 @@ import Control.Arrow (second)
15import Data.Function (on)
15import Data.Function (on)
16import qualified Data.List as List
16import qualified Data.List as List
17import qualified Data.Map as Map
17import qualified Data.Map as Map
18+import qualified Data.Set as Set
18import Data.Map ((!))
19import Data.Map ((!))
19import qualified Data.Maybe as Maybe
20import qualified Data.Maybe as Maybe
20
21
@@ -271,7 +272,19 @@ getSubstitution (path, A.A _ pattern) =
271
272
272testsAtPath :: Path -> [Branch] -> [Test]
273testsAtPath :: Path -> [Branch] -> [Test]
273testsAtPath selectedPath branches =
274testsAtPath selectedPath branches =
275+ let
276+ allTests =
274− List.nub $ Maybe.mapMaybe (testAtPath selectedPath) branches
277+ Maybe.mapMaybe (testAtPath selectedPath) branches
278+
279+ skipVisited test curr@(uniqueTests, visitedTests) =
280+ if Set.member test visitedTests then
281+ curr
282+ else
283+ ( test : uniqueTests
284+ , Set.insert test visitedTests
285+ )
286+ in
287+ fst (foldr skipVisited ([], Set.empty) allTests)
275
288
276
289
277testAtPath :: Path -> Branch -> Maybe Test
290testAtPath :: Path -> Branch -> Maybe Test