pancakeSort :: Ord a => [a] -> [a] pancakeSort [] = [] pancakeSort cakeStack = let selectedCake = indexOfLargest cakeStack cakeStack' = (doFlip (length cakeStack)) . (doFlip selectedCake) $ cakeStack in (pancakeSort (init cakeStack')) ++ [last cakeStack'] indexOfLargest :: Ord a => [a] -> Int indexOfLargest (x:xs) = let f m i j y = if length y == 0 then i else if (head y) > m then f (head y) j (j+1) (tail y) else f m i (j+1) (tail y) in f x 0 1 xs doFlip :: Int -> [a] -> [a] doFlip depth list = let prefix = take (depth + 1) list rest = drop (depth + 1) list in (reverse prefix) ++ rest