packages feed

snow-white-2009.12.1: src/Codec/SnowWhite.hs

module Codec.SnowWhite (pack, unpack) where

import Data.Binary
import Numeric
import MPS.Env hiding (encode, decode)
import Prelude ()
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Char

c2w, w2c :: Char -> Char
c2w '0' = ' '
c2w '1' = '\t'
c2w _   = error "not 0 or 1"

w2c ' ' = '0'
w2c '\t' = '1'
w2c _ = error "not 0 or 1"

b2s, pack :: (Binary a) => a -> String
b2s = encode > B.unpack > map (ord > (base 2) > rjust 8 '0' > map c2w) > concat

base :: Int -> Int -> String
base p n = showIntAtBase p intToDigit n ""

from_base :: Int -> String -> Int
from_base p = readInt p (const True) digitToInt > first > fst

s2b, unpack :: (Binary a) => String -> a
s2b = select (belongs_to " \t") > in_group_of 8 > map (map w2c > from_base 2 > chr) > B.pack > decode


pack = b2s
unpack = s2b