Skip to content

Commit 39ab01e

Browse files
committed
Merge pull request #55 from rgrempel/master
Make unfoldr stack-safe.
2 parents 25cf9dc + 230c4b6 commit 39ab01e

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/Data/List.purs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -733,10 +733,11 @@ instance foldableList :: Foldable List where
733733

734734

735735
instance unfoldableList :: Unfoldable List where
736-
unfoldr f b = go (f b)
736+
unfoldr f b = go b Nil
737737
where
738-
go Nothing = Nil
739-
go (Just (Tuple a b)) = Cons a (go (f b))
738+
go source memo = case f source of
739+
Nothing -> reverse memo
740+
Just (Tuple one rest) -> go rest (Cons one memo)
740741

741742
instance traversableList :: Traversable List where
742743
traverse _ Nil = pure Nil

test/Test/Data/List.purs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ testList = do
287287
log "foldMap should be left-to-right"
288288
assert $ foldMap show (range 1 5) == "12345"
289289

290+
log "unfoldr should be stack-safe"
291+
void $ pure $ length $ Data.Unfoldable.replicate 100000 1
292+
293+
log "unfoldr should maintain order"
294+
assert $ (1..5) == Data.Unfoldable.unfoldr step 1
295+
290296
-- log "can find the first 10 primes using lazy lists"
291297
-- let eratos :: L.List Number -> L.List Number
292298
-- eratos xs = Control.Lazy.defer \_ ->
@@ -299,6 +305,10 @@ testList = do
299305
-- primes = eratos $ upFrom 2
300306
-- assert $ L.fromList (L.take 10 primes) == [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
301307

308+
step :: Int -> Maybe (Tuple Int Int)
309+
step 6 = Nothing
310+
step n = Just (Tuple n (n + 1))
311+
302312
nil :: List Int
303313
nil = Nil
304314

0 commit comments

Comments
 (0)