-
Notifications
You must be signed in to change notification settings - Fork 50
Open
Labels
type: enhancementA new feature or addition.A new feature or addition.
Description
sort $ range 1 1000000/home/miles/projects/purescript/lists/output/Data.List/index.js:287
return as(new Data_List_Types.Cons(a, ys));
^
RangeError: Maximum call stack size exceeded
at $tco_var_as (/home/miles/projects/purescript/lists/output/Data.List/index.js:287:39)
Should we swap out this current version (which I assume depends on Haskell's laziness) for something that just reuses Array's sortBy? I think that might end up being faster even in situations where we're not having stack issues.
purescript-lists/src/Data/List.purs
Lines 447 to 482 in 6d8e30e
| -- | Sort the elements of a list in increasing order, where elements are | |
| -- | compared using the specified ordering. | |
| sortBy :: forall a. (a -> a -> Ordering) -> List a -> List a | |
| sortBy cmp = mergeAll <<< sequences | |
| -- implementation lifted from http://hackage.haskell.org/package/base-4.8.0.0/docs/src/Data-OldList.html#sort | |
| where | |
| sequences :: List a -> List (List a) | |
| sequences (a : b : xs) | |
| | a `cmp` b == GT = descending b (singleton a) xs | |
| | otherwise = ascending b (a : _) xs | |
| sequences xs = singleton xs | |
| descending :: a -> List a -> List a -> List (List a) | |
| descending a as (b : bs) | |
| | a `cmp` b == GT = descending b (a : as) bs | |
| descending a as bs = (a : as) : sequences bs | |
| ascending :: a -> (List a -> List a) -> List a -> List (List a) | |
| ascending a as (b : bs) | |
| | a `cmp` b /= GT = ascending b (\ys -> as (a : ys)) bs | |
| ascending a as bs = ((as $ singleton a) : sequences bs) | |
| mergeAll :: List (List a) -> List a | |
| mergeAll (x : Nil) = x | |
| mergeAll xs = mergeAll (mergePairs xs) | |
| mergePairs :: List (List a) -> List (List a) | |
| mergePairs (a : b : xs) = merge a b : mergePairs xs | |
| mergePairs xs = xs | |
| merge :: List a -> List a -> List a | |
| merge as@(a : as') bs@(b : bs') | |
| | a `cmp` b == GT = b : merge as bs' | |
| | otherwise = a : merge as' bs | |
| merge Nil bs = bs | |
| merge as Nil = as |
elldritch
Metadata
Metadata
Assignees
Labels
type: enhancementA new feature or addition.A new feature or addition.