somme ex2 and ex3 text
[tt2015.git] / a3 / code / Generics / GenCompress.icl
diff --git a/a3/code/Generics/GenCompress.icl b/a3/code/Generics/GenCompress.icl
deleted file mode 100644 (file)
index 1797ae4..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-implementation module GenCompress\r
-\r
-import StdGeneric, StdEnv, StdMaybe, _Array\r
-\r
-//--------------------------------------------------\r
-// uncompressor monad\r
-\r
-ret :: !.a !u:CompressSt -> (!Maybe .a,!u:CompressSt)\r
-ret a st = (Just a, st)\r
-(>>=) infixl 5 \r
-(>>=) pa pb = bind pa pb\r
-where\r
-       bind pa pb st \r
-               #! (ma, st) = pa st\r
-               = case ma of\r
-                       Nothing -> (Nothing, st)\r
-                       Just x  -> pb x st\r
-\r
-//--------------------------------------------------\r
-\r
-:: BitVector :== {#Int}\r
-:: BitPos :== Int\r
-\r
-:: CompressSt = { cs_pos :: !Int, cs_bits :: !.{#Int} }\r
-mkCompressSt arr = { cs_pos = 0, cs_bits = arr}\r
-\r
-\r
-:: Compress a :== a -> *CompressSt -> *CompressSt\r
-:: Uncompress a :== .CompressSt -> .(.(Maybe a), .CompressSt)\r
-\r
-compressBool :: !Bool !*CompressSt -> *CompressSt\r
-compressBool bit {cs_pos = pos, cs_bits = bits}\r
-       #! s = size bits\r
-       #! int_pos = pos >> (IF_INT_64_OR_32 6 5)\r
-       #! bit_pos = pos bitand (IF_INT_64_OR_32 63 31)\r
-       | s == int_pos\r
-               = abort "reallocate" \r
-               #! int = bits.[int_pos]\r
-               #! bit_mask = 1 << bit_pos\r
-               #! new_int = if bit (int bitor bit_mask) (int bitand (bitnot bit_mask))\r
-               = {cs_pos = inc pos, cs_bits = {bits & [int_pos] = new_int}}\r
-\r
-uncompressBool :: !u:CompressSt -> (.(Maybe Bool),v:CompressSt), [u <= v]\r
-uncompressBool cs=:{cs_pos = pos, cs_bits = bits}\r
-       #! s = size bits\r
-       #! int_pos = pos >> (IF_INT_64_OR_32 6 5)\r
-       #! bit_pos = pos bitand (IF_INT_64_OR_32 63 31)\r
-       | s == int_pos\r
-               = (Nothing, cs) \r
-               #! int = bits.[int_pos]\r
-               #! bit_mask = 1 << bit_pos\r
-               #! bit = (bit_mask bitand int) <> 0\r
-               = (Just bit, {cs & cs_pos = inc pos})\r
-\r
-compressIntB :: !.Int !.Int -> .(*CompressSt -> .CompressSt)\r
-compressIntB num_bits int\r
-       = compress 0 num_bits int\r
-where\r
-       compress i n int\r
-               | i == n\r
-                       = id\r
-               | otherwise\r
-                       = compress (inc i) n (int >> 1) \r
-                       o compressBool ((int bitand 1) == 1)\r
-\r
-\r
-compressInt = compressIntB (IF_INT_64_OR_32 64 32)\r
-compressChar c = compressIntB 8 (toInt c)\r
-\r
-uncompressIntB :: !.Int -> u:CompressSt -> (.(Maybe Int),v:CompressSt), [u <= v]\r
-uncompressIntB num_bits\r
-       = uncompress 0 num_bits 0\r
-where\r
-       uncompress i n int\r
-               | i == n\r
-                       = ret int\r
-               | otherwise\r
-                       =       uncompressBool\r
-                       >>=     \bit -> uncompress (inc i) n int \r
-                       >>=     \x -> ret ((if bit 1 0) + (x << 1))\r
-\r
-uncompressInt :: (u:CompressSt -> (.(Maybe Int),v:CompressSt)), [u <= v]\r
-uncompressInt = uncompressIntB (IF_INT_64_OR_32 64 32)\r
-\r
-uncompressChar :: (u:CompressSt -> (.(Maybe Char),v:CompressSt)), [u <= v]\r
-uncompressChar = uncompressIntB 8 >>= ret o toChar \r
-\r
-realToBinary32 :: !Real -> (!Int,!Int);\r
-realToBinary32 _ = code {\r
-    pop_b 0\r
-    };\r
-\r
-realToBinary64 :: !Real -> Int;\r
-realToBinary64 _ = code {\r
-    pop_b 0\r
-    };\r
-\r
-binaryToReal32 :: !(!Int,!Int) -> Real;\r
-binaryToReal32 _ = code {\r
-    pop_b 0\r
-    };\r
-\r
-binaryToReal64 :: !Int -> Real;\r
-binaryToReal64 _ = code {\r
-    pop_b 0\r
-    };\r
-\r
-compressReal real\r
-       = IF_INT_64_OR_32\r
-               (compressInt (realToBinary64 real))\r
-               (let (i1, i2) = realToBinary32 real in compressInt i2 o compressInt i1)\r
-\r
-uncompressReal :: (u:CompressSt -> (.(Maybe Real),v:CompressSt)), [u <= v]\r
-uncompressReal\r
-       = IF_INT_64_OR_32\r
-               (uncompressInt\r
-               >>= \i -> ret (binaryToReal64 i))\r
-               (uncompressInt \r
-               >>= \i1 -> uncompressInt \r
-               >>= \i2 -> ret (binaryToReal32 (i1,i2)))\r
-\r
-compressArray :: (a -> u:(v:CompressSt -> w:CompressSt)) !.(b a) -> x:(*CompressSt -> y:CompressSt) | Array b a, [x <= u,w <= v,w <= y]\r
-compressArray f xs \r
-       = foldSt f [x \\ x <-: xs] o compressInt (size xs)\r
-\r
-foldSt f [] = id\r
-foldSt f [x:xs] = foldSt f xs o f x\r
-\r
-uncompressArray :: (u:CompressSt -> ((Maybe v:a),w:CompressSt)) -> .(x:CompressSt -> ((Maybe y:(b v:a)),z:CompressSt)) | Array b a, [x w <= u,y <= v,x w <= z]\r
-uncompressArray f \r
-       =       uncompressInt >>= \s -> uncompress_array 0 s (createArrayUnsafe s) \r
-where \r
-       uncompress_array i s arr\r
-               | i == s\r
-                       = ret arr\r
-                       = f >>= \x -> uncompress_array (inc i) s {arr & [i] = x} \r
-\r
-compressList :: (a *CompressSt -> *CompressSt) ![a] -> *CompressSt -> *CompressSt\r
-compressList c xs = compressArray c (list_to_arr xs)\r
-where\r
-       list_to_arr :: [b] -> {b} | Array {} b\r
-       list_to_arr xs = {x \\ x <- xs}\r
-\r
-\r
-uncompressList xs = uncompressArray xs >>= ret o arr_to_list\r
-where\r
-       arr_to_list :: {b} -> [b] | Array {} b\r
-       arr_to_list xs = [x \\ x <-: xs] \r
\r
-//--------------------------------------------------------------------------------------\r
-\r
-generic gCompress a :: !a -> *CompressSt -> *CompressSt\r
-gCompress{|Int|} x = compressInt x \r
-gCompress{|Real|} x = compressReal x \r
-gCompress{|Char|} x = compressChar x\r
-gCompress{|Bool|} x = compressBool x\r
-gCompress{|UNIT|} x = id\r
-gCompress{|PAIR|} cx cy (PAIR x y) = cy y o cx x\r
-gCompress{|EITHER|} cl cr (LEFT x) = cl x o compressBool False\r
-gCompress{|EITHER|} cl cr (RIGHT x) = cr x o compressBool True\r
-gCompress{|CONS|} c (CONS x) = c x\r
-gCompress{|FIELD|} c (FIELD x) = c x\r
-gCompress{|OBJECT|} c (OBJECT x) = c x\r
-gCompress{|{}|} c xs = compressArray c xs\r
-gCompress{|{!}|} c xs = compressArray c xs\r
-gCompress{|String|} xs = compressArray compressChar xs\r
-gCompress{|[]|} c xs = compressList c xs\r
-\r
-\r
-generic gCompressedSize a :: a -> Int\r
-gCompressedSize{|Int|} _ = IF_INT_64_OR_32 64 32\r
-gCompressedSize{|Real|} _ = 64\r
-gCompressedSize{|Char|} _ = 8\r
-gCompressedSize{|Bool|} _ = 1\r
-gCompressedSize{|UNIT|} _ = 0\r
-gCompressedSize{|PAIR|} cx cy (PAIR x y) = cx x + cy y\r
-gCompressedSize{|EITHER|} cl cr (LEFT x) = 1 + cl x\r
-gCompressedSize{|EITHER|} cl cr (RIGHT x) = 1 + cr x\r
-gCompressedSize{|CONS|} c (CONS x) = c x\r
-gCompressedSize{|FIELD|} c (FIELD x) = c x\r
-gCompressedSize{|OBJECT|} c (OBJECT x) = c x\r
-gCompressedSize{|[]|} c xs = foldSt (\x st -> c x + st) xs (IF_INT_64_OR_32 64 32) \r
-gCompressedSize{|{}|} c xs = foldSt (\x st -> c x + st) [x\\x<-:xs] (IF_INT_64_OR_32 64 32) \r
-gCompressedSize{|{!}|} c xs = foldSt (\x st -> c x + st) [x\\x<-:xs] (IF_INT_64_OR_32 64 32) \r
-gCompressedSize{|String|} xs = (IF_INT_64_OR_32 64 32) + size xs * 8\r
-\r
-generic gUncompress a :: (u:CompressSt -> ((Maybe a),u:CompressSt))\r
-gUncompress{|Int|} = uncompressInt\r
-gUncompress{|Real|} = uncompressReal\r
-gUncompress{|Char|} = uncompressChar\r
-gUncompress{|Bool|} = uncompressBool\r
-gUncompress{|UNIT|} = ret UNIT\r
-gUncompress{|PAIR|} fx fy = fx >>= \x -> fy >>= \y -> ret (PAIR x y)\r
-gUncompress{|EITHER|} fl fr = uncompressBool >>= either\r
-where\r
-       either is_right \r
-               | is_right\r
-                       = fr >>= ret o RIGHT\r
-                       = fl >>= ret o LEFT\r
-gUncompress{|CONS|} f = f >>= ret o CONS\r
-gUncompress{|FIELD|} f = f >>= ret o FIELD\r
-gUncompress{|OBJECT|} f = f >>= ret o OBJECT\r
-gUncompress{|[]|} f = uncompressList f \r
-gUncompress{|{}|} f = uncompressArray f \r
-gUncompress{|{!}|} f = uncompressArray f \r
-gUncompress{|String|} = uncompressArray uncompressChar \r
-\r
-\r
-//-------------------------------------------------------------------------------------\r
-\r
-uncompress :: (BitVector -> Maybe a) | gUncompress{|*|} a\r
-uncompress = fst o gUncompress{|*|} o mkCompressSt\r
-\r
-compress :: !a -> BitVector | gCompressedSize{|*|} a & gCompress{|*|} a\r
-compress x \r
-       #! compressed_size = gCompressedSize{|*|} x\r
-       #! arr_size = (compressed_size + (IF_INT_64_OR_32 63 31)) >> (IF_INT_64_OR_32 6 5)\r
-       #! bits = createArray arr_size 0\r
-       = (gCompress{|*|} x (mkCompressSt bits)).cs_bits\r
\r
-//-------------------------------------------------------------------------------------\r
-\r
-/*\r
-:: Tree a b = Tip a | Bin b (Tree a b) (Tree a b)\r
-:: Color = Red | Green | Blue\r
-\r
-derive bimap (,), (,,), Maybe\r
-derive gCompress Tree, Color\r
-derive gUncompress Tree, Color\r
-derive gCompressedSize Tree, Color\r
-               \r
-//Start :: Maybe (Tree Color Color)\r
-//Start = uncompress (compress (Bin Red (Bin Green (Tip Blue) (Tip Red)) (Tip Green)))\r
-//Start = gCompressedSize{|*|} (Bin Red (Bin Green (Tip Blue) (Tip Red)) (Tip Green))\r
-\r
-Start \r
-       = gCompressedSize{|*|} xs\r
-*/
\ No newline at end of file