```/**
* Template for mini project 2: Huffman trees
*
* This is a code template for the second mini project.
* solve the given problems.
*
* @author Philipp Haller
* @version 1.1, 10/10/2007
*/
package project2

object huffman extends Application {

abstract class CodeTree
case class Fork(left: CodeTree, right: CodeTree,
chars: List[Char], weight: Int)
extends CodeTree
case class Leaf(char: Char, weight: Int) extends CodeTree

//// Part 0: Basics ////

//def weight(tree: CodeTree) = tree match ...

//def chars(tree: CodeTree): List[Char] = tree match ...

/*
def makeCodeTree(left: CodeTree, right: CodeTree) =
Fork(left, right, chars(left) ::: chars(right), weight(left) + weight(right))
*/

//// Part 1: Generating Huffman trees ////

def string2Chars(str: String): List[Char] =
str.toList

/**
* Returns a list of the unique characters in a list of characters together with
* the number of times they occur.
*/
//def times(chars: List[Char]): List[(Char, Int)] = ...

//def makeLeafList(freqs: List[(Char, Int)]): List[CodeTree] = ...

/**
* Checks whether <code>trees</code> contains only a single tree.
*/
//def singleton(trees: List[CodeTree]): Boolean = ...

//def combine(trees: List[CodeTree]): List[CodeTree] = ...

//def until(??)(??): ?? = ...

//def createCodeTree(chars: List[Char]): CodeTree = ...

//// Part 2: Decoding ////

type Bit = Int

//def decode(tree: CodeTree, bits: List[Bit]): List[Char] = ...

// A Huffman coding tree for the French language.
// Generated from the data given at
// http://fr.wikipedia.org/wiki/Fr%C3%A9quence_d%27apparition_des_lettres_en_fran%C3%A7ais

val frenchCode = Fork(Fork(Fork(Leaf('s',121895),Fork(Leaf('d',56269),Fork(Fork(Fork(Leaf('x',5928),Leaf('j',8351),List('x','j'),14279),Leaf('f',16351),List('x','j','f'),30630),Fork(Fork(Fork(Fork(Leaf('z',2093),Fork(Leaf('k',745),Leaf('w',1747),List('k','w'),2492),List('z','k','w'),4585),Leaf('y',4725),List('z','k','w','y'),9310),Leaf('h',11298),List('z','k','w','y','h'),20608),Leaf('q',20889),List('z','k','w','y','h','q'),41497),List('x','j','f','z','k','w','y','h','q'),72127),List('d','x','j','f','z','k','w','y','h','q'),128396),List('s','d','x','j','f','z','k','w','y','h','q'),250291),Fork(Fork(Leaf('o',82762),Leaf('l',83668),List('o','l'),166430),Fork(Fork(Leaf('m',45521),Leaf('p',46335),List('m','p'),91856),Leaf('u',96785),List('m','p','u'),188641),List('o','l','m','p','u'),355071),List('s','d','x','j','f','z','k','w','y','h','q','o','l','m','p','u'),605362),Fork(Fork(Fork(Leaf('r',100500),Fork(Leaf('c',50003),Fork(Leaf('v',24975),Fork(Leaf('g',13288),Leaf('b',13822),List('g','b'),27110),List('v','g','b'),52085),List('c','v','g','b'),102088),List('r','c','v','g','b'),202588),Fork(Leaf('n',108812),Leaf('t',111103),List('n','t'),219915),List('r','c','v','g','b','n','t'),422503),Fork(Leaf('e',225947),Fork(Leaf('i',115465),Leaf('a',117110),List('i','a'),232575),List('e','i','a'),458522),List('r','c','v','g','b','n','t','e','i','a'),881025),List('s','d','x','j','f','z','k','w','y','h','q','o','l','m','p','u','r','c','v','g','b','n','t','e','i','a'),1486387)

// What does the secret message say? Can you decode it?
//
// Hint: for the decoding use the `frenchCode' Huffman tree
// defined above.

val secret = List(0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,0,1,1,0,1,0,1,1,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,1,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,1)

//// Part 3a: Encoding using Huffman tree ////

//def encode(tree: CodeTree)(chars: List[Char]): List[Bit] = ...

//// Part 3b: Encoding using code table ////

type CodeTable = List[(Char, List[Bit])]

//def codeBits(table: CodeTable)(char: Char): List[Bit] = ...

//def convert(t: CodeTree): CodeTable = ...

//def mergeCodeTables(a: CodeTable, b: CodeTable): CodeTable = ...

//def quickEncode(tree: CodeTree)(chars: List[Char]): List[Bit] = ...
}
```