RosettaCodeData/Task/LZW-compression/Haskell/lzw-compression-1.hs
Ingy döt Net db842d013d A-M baby
2013-04-10 21:29:02 -07:00

20 lines
597 B
Haskell

import Data.List
import Data.Char
import Data.Maybe
import Control.Monad
import Control.Arrow
take2 = filter((==2).length). map (take 2). tails
doLZW _ [] = []
doLZW as (x:xs) = lzw (map return as) [x] xs
where lzw a w [] = [fromJust $ elemIndex w a]
lzw a w (x:xs) | w' `elem` a = lzw a w' xs
| otherwise = fromJust (elemIndex w a) : lzw (a++[w']) [x] xs
where w' = w++[x]
undoLZW _ [] = []
undoLZW a cs =
((cs >>=).(!!)) $
foldl (liftM2 (.) (++) (((return. liftM2 (++) head (take 1. last)).). map. (!!)))
(map return a) (take2 cs)