2 | module Huffman.WayStep
4 | import Data.Fin as Fin
5 | import Data.Vect as V
8 | import Decidable.Equality
10 | import Data.Array.Indexed
11 | import Data.Array.Core
13 | import Huffman.HTree
14 | import Huffman.Table
17 | data Pin = EndOfString
27 | show EndOfString = "EndOfString"
28 | show (Forward n) = "Forward " ++ show (finToNat n)
29 | show (GoBack n v) = "GoBack " ++ show (finToNat n) ++ " " ++ show v
30 | show (GoBack2 n v w) = "GoBack2 " ++ show (finToNat n) ++ " " ++ show v ++ " " ++ show w
33 | data WayStep = MkWayStep (Maybe Nat) (V.Vect 256 Pin)
37 | show (MkWayStep a b) = "WayStep " ++ show a ++ " " ++ show b
44 | inc : Chara -> Bits8 -> Chara
46 | inc (One v) w = Two v w
47 | inc _ _ = idris_crash "inc"
50 | step : HTree -> HTree -> Chara -> Nat -> Bits8 -> Pin
51 | step root (Tip _ v) x ctr bss =
53 | Nothing => EndOfString
56 | in step root root x' ctr bss
57 | step _ (Bin _ n _ _) Non 0 _ = Forward n
58 | step _ (Bin _ n _ _) (One w) 0 _ = GoBack n w
59 | step _ (Bin _ n _ _) (Two w z) 0 _ = GoBack2 n w z
60 | step root (Bin _ _ l r) mx (S ctrMinusOne) b =
61 | step root (if b .&. (1 `shiftL` 7) == 0 then l else r) mx ctrMinusOne (b `shiftL` 1)
62 | step _ (Bin _ _ _ _) _ Z _ =
63 | idris_crash "counter reached zero"
65 | eosInfo : HTree -> Maybe Nat
66 | eosInfo (Tip mx _) = mx
67 | eosInfo (Bin mx _ _ _) = mx
70 | flatten : HTree -> List HTree
71 | flatten (Tip _ _) = []
72 | flatten t@(Bin _ _ l r) = t :: (flatten l ++ flatten r)
75 | construct : HTree -> List WayStep
78 | to16ways : HTree -> WayStep
82 | a16 : V.Vect 256 Pin
83 | a16 = map (step decoder x Non 8) allBits8
87 | map to16ways $
flatten decoder
91 | bigTree = toHTree 256 huffmanTable
94 | way256L : List WayStep
95 | way256L = construct bigTree
98 | fromListOfLength : (n : Nat) -> (xs : List a) -> Maybe (Vect n a)
99 | fromListOfLength n xs with (decEq (length xs) n)
100 | fromListOfLength n xs | (Yes prf) = rewrite (sym prf) in Just (fromList xs)
101 | fromListOfLength n xs | (No _) = Nothing
104 | way256 : IArray 256 WayStep
108 | vect : V.Vect 256 WayStep
109 | vect = assert_total $
fromJustPartial $
fromListOfLength 256 way256L