module Codec.Container.Ogg.List (
listMerge,
classify
) where
import Data.List
listMerge :: Ord a => [[a]] -> [a]
listMerge ll = listMerge' $ listSort ll
listMerge' :: Ord a => [[a]] -> [a]
listMerge' [] = []
listMerge' (l:ls) = case l of
[] -> listMerge' ls
(x:xs) -> x : listMerge (xs:ls)
listSort :: Ord a => [[a]] -> [[a]]
listSort xs = sortBy listOrd xs
listOrd :: Ord a => [a] -> [a] -> Ordering
listOrd [] _ = LT
listOrd _ [] = GT
listOrd (x:_) (y:_) = compare x y
classify :: (a -> a -> Bool) -> [a] -> [[a]]
classify f xs = classify' f xs []
classify' :: (a -> a -> Bool) -> [a] -> [[a]] -> [[a]]
classify' _ [] ss = ss
classify' f (x:xs) [] = classify' f xs [[x]]
classify' f (x:xs) (s:ss) = case f x (head s) of
True -> classify' f xs ((s++[x]):ss)
False -> classify' f xs (s : classify' f [x] ss)