summaryrefslogtreecommitdiff
path: root/h28n.hs
blob: bf584c74f0b86150d126b116ec154328f277c320 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Control.Arrow ((>>>), (&&&), second)
import GHC.Exts (sortWith)

lfsort :: [[a]] -> [[a]]
lfsort = zip [1..] >>> map (second (length &&& id)) >>> sortWith (snd>>>fst)
            >>> cntDupLength undefined [] >>> sortWith (snd>>>fst) 
            >>> sortWith fst >>> map (\(_,(_,(_,a))) -> a)
    where 
        cntDupLength :: Int -> [(Int,(Int,a))] -> [(Int,(Int,a))] -> [(Int,(Int,(Int,a)))]
        cntDupLength _ lls [] = map ((,) (length lls)) $ reverse lls
        cntDupLength _ [] (x@(_,(l,_)):xs) = cntDupLength l [x] xs
        cntDupLength l lls ys@(x@(_,(l1,_)):xs)
            | l == l1   = cntDupLength l (x:lls) xs
            | otherwise = (map ((,) (length lls)) $ reverse lls) ++ cntDupLength undefined [] ys