Skip to content

Commit 5e653a9

Browse files
committed
make map stack safe(r) again
begin with reverse unrolled map
1 parent e510520 commit 5e653a9

File tree

1 file changed

+11
-26
lines changed

1 file changed

+11
-26
lines changed

src/Data/List/Types.purs

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
8181
listMap :: 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

Comments
 (0)