@@ -79,33 +79,18 @@ instance functorList :: Functor List where
7979-- https://discuss.ocaml.org/t/a-new-list-map-that-is-both-stack-safe-and-fast/865
8080-- chunk sizes determined through experimentation
8181listMap :: forall a b . (a -> b ) -> List a -> List b
82- listMap f = startUnrolledMap unrollLimit where
83- -- iterate the unrolled map up to 200 times,
84- -- which hits up to 1000 elements
85- unrollLimit = 200
86-
87- startUnrolledMap :: Int -> List a -> List b
88- startUnrolledMap 0 (x : xs) = f x : chunkedRevMap xs
89- startUnrolledMap n (x1 : x2 : x3 : x4 : x5 : xs) =
90- f x1 : f x2 : f x3 : f x4 : f x5 : startUnrolledMap (n - 1 ) xs
91- startUnrolledMap n (x1 : x2 : x3 : x4 : xs) =
92- f x1 : f x2 : f x3 : f x4 : startUnrolledMap (n - 1 ) xs
93- startUnrolledMap n (x1 : x2 : x3 : xs) =
94- f x1 : f x2 : f x3 : startUnrolledMap (n - 1 ) xs
95- startUnrolledMap n (x1 : x2 : xs) =
96- f x1 : f x2 : startUnrolledMap (n - 1 ) xs
97- startUnrolledMap n (x : xs) = f x : startUnrolledMap (n - 1 ) xs
98-
99- startUnrolledMap _ Nil = Nil
100-
101- chunkedRevMap :: List a -> List b
102- chunkedRevMap = go Nil
82+ listMap f = chunkedRevMap Nil
83+ where
84+ chunkedRevMap :: List (List a ) -> List a -> List b
85+ chunkedRevMap chunksAcc chunk@(x1 : x2 : x3 : xs) =
86+ chunkedRevMap (chunk : chunksAcc) xs
87+ chunkedRevMap chunksAcc xs =
88+ reverseUnrolledMap chunksAcc $ unrolledMap xs
10389 where
104- go :: List (List a ) -> List a -> List b
105- go chunksAcc chunk@(x1 : x2 : x3 : xs) =
106- go (chunk : chunksAcc) xs
107- go chunksAcc finalChunk =
108- reverseUnrolledMap chunksAcc $ startUnrolledMap 0 finalChunk
90+ unrolledMap :: List a -> List b
91+ unrolledMap (x1 : x2 : Nil ) = f x1 : f x2 : Nil
92+ unrolledMap (x1 : Nil ) = f x1 : Nil
93+ unrolledMap _ = Nil
10994
11095 reverseUnrolledMap :: List (List a ) -> List b -> List b
11196 reverseUnrolledMap ((x1 : x2 : x3 : _) : cs) acc =
0 commit comments