on master help sign in
Switch testsAtPath to be O(n * log n) rather than O(n^2)
commita6568b97bc0ff45ef380db2163e1f0ba2c97424d authorEvan Czaplicki <info@elm-lang.org> dateSun 6 Sep 2015, 01:10 (11 years ago) parentdbf97e2
1 file changed+14−1
src/Optimize/Patterns/DecisionTree.hs+14−1
src/Optimize/Patterns/DecisionTree.hs+14−1
@@ -15,6 +15,7 @@ import Control.Arrow (second)
1515import Data.Function (on)
1616import qualified Data.List as List
1717import qualified Data.Map as Map
18+import qualified Data.Set as Set
1819import Data.Map ((!))
1920import qualified Data.Maybe as Maybe
2021
@@ -271,7 +272,19 @@ getSubstitution (path, A.A _ pattern) =
271272
272273testsAtPath :: Path -> [Branch] -> [Test]
273274testsAtPath selectedPath branches =
274− List.nub $ Maybe.mapMaybe (testAtPath selectedPath) branches
275+ let
276+ allTests =
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)
275288
276289
277290testAtPath :: Path -> Branch -> Maybe Test