takeUntilMax :: [Int] -> Int -> (Int, [Int]) takeUntilMax [] m = (m, []) takeUntilMax [x] _ = (x, [x]) takeUntilMax (x:xs) m | x == m = (x, [x]) | otherwise = let (m', xs') = takeUntilMax xs m in (max m' x, x:xs') doTakeUntilMax :: [Int] -> [Int] doTakeUntilMax l = l' where (m, l') = takeUntilMax l m takeUntilMax' :: [Int] -> Int -> (Int, [Int]) takeUntilMax' [] m = (m, []) takeUntilMax' [x] _ = (x, [x]) takeUntilMax' (x:xs) m | x == m = (maximum (x:xs), [x]) | otherwise = let (m', xs') = takeUntilMax' xs m in (max m' x, x:xs')