0 | module BottomUpMergeSort
9 | data MergeSort a = MS Int (Lazy (List (List a)))
11 | mrg : Ord a => List a -> List a -> List a
14 | mrg xs@(x :: xs') ys@(y :: ys') =
15 | if x <= y then x :: mrg xs' ys else y :: mrg xs ys'
17 | addSeg : Ord a => List a -> List (List a) -> Int -> List (List a)
18 | addSeg seg segs size = let size' = size `div` 2
20 | if 0 == r then seg :: segs
21 | else addSeg (mrg seg (head segs {ok = segsNonEmpty}))
22 | (tail segs {ok = segsNonEmpty})
23 | (assert_smaller size size')
25 | segsNonEmpty : NonEmpty segs
26 | segsNonEmpty = believe_me "length segs = ceil lg size"
29 | Sortable MergeSort where
31 | add x (MS size segs) = MS (size + 1) (addSeg [x] segs size)
32 | sort (MS size segs) = foldl mrg [] segs