module MakeTree ( makeTree ) where
import Types ( Tree(Leaf,Node), Bit(L,R), HCode, Table )
makeTree :: [ (Char,Int) ] -> Tree
makeTree :: [(Char, Int)] -> Tree
makeTree = [Tree] -> Tree
makeCodes ([Tree] -> Tree)
-> ([(Char, Int)] -> [Tree]) -> [(Char, Int)] -> Tree
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Char, Int)] -> [Tree]
toTreeList
toTreeList :: [ (Char,Int) ] -> [ Tree ]
toTreeList :: [(Char, Int)] -> [Tree]
toTreeList = ((Char, Int) -> Tree) -> [(Char, Int)] -> [Tree]
forall a b. (a -> b) -> [a] -> [b]
map ((Char -> Int -> Tree) -> (Char, Int) -> Tree
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Char -> Int -> Tree
Leaf)
value :: Tree -> Int
value :: Tree -> Int
value (Leaf Char
_ Int
n) = Int
n
value (Node Int
n Tree
_ Tree
_) = Int
n
pair :: Tree -> Tree -> Tree
pair :: Tree -> Tree -> Tree
pair Tree
t1 Tree
t2 = Int -> Tree -> Tree -> Tree
Node (Int
v1Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
v2) Tree
t1 Tree
t2
where
v1 :: Int
v1 = Tree -> Int
value Tree
t1
v2 :: Int
v2 = Tree -> Int
value Tree
t2
insTree :: Tree -> [Tree] -> [Tree]
insTree :: Tree -> [Tree] -> [Tree]
insTree Tree
t [] = [Tree
t]
insTree Tree
t (Tree
t1:[Tree]
ts)
| (Tree -> Int
value Tree
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Tree -> Int
value Tree
t1) = Tree
tTree -> [Tree] -> [Tree]
forall a. a -> [a] -> [a]
:Tree
t1Tree -> [Tree] -> [Tree]
forall a. a -> [a] -> [a]
:[Tree]
ts
| Bool
otherwise = Tree
t1 Tree -> [Tree] -> [Tree]
forall a. a -> [a] -> [a]
: Tree -> [Tree] -> [Tree]
insTree Tree
t [Tree]
ts
amalgamate :: [ Tree ] -> [ Tree ]
amalgamate :: [Tree] -> [Tree]
amalgamate ( Tree
t1 : Tree
t2 : [Tree]
ts )
= Tree -> [Tree] -> [Tree]
insTree (Tree -> Tree -> Tree
pair Tree
t1 Tree
t2) [Tree]
ts
makeCodes :: [Tree] -> Tree
makeCodes :: [Tree] -> Tree
makeCodes [Tree
t] = Tree
t
makeCodes [Tree]
ts = [Tree] -> Tree
makeCodes ([Tree] -> [Tree]
amalgamate [Tree]
ts)