This repository contains an implementation of the Huffman algorithm in Elixir.
A blog post series describing the implementation of the algorithm can be found on my blog:
You can run the program in an iex shell:
iex -S mixOnce you are in an iex shell, you can interact with the program as follows:
iex(1)> gophers = Huffman.compress("go go gophers")
[
<<0, 0, 0, 53>>,
<<131, 80, 0, 0, 0, 77, 120, 218, 43, 97, 96, 96, 224, 204, 5, 18, 140, 10,
137, 76, 96, 58, 53, 145, 17, 76, 167, 39, 50, 131, 233, 12, 40, 63, 31,
202, 47, 128, 242, 139, 160, 116, 49, 148, 254, 159, 200, 8, ...>>,
[[[[[], 26], 52], 122], 99],
<<243, 64>>
]
iex(2)> Huffman.decompress(gophers) |> IO.iodata_to_binary()
"go go gophers"There are also some sample text files included in test_data/. They can be compressed/decompressed as follows:
iex(1)> Huffman.compress_file("test_data/hamlet")
:ok
iex(2)> Huffman.decompress_file("test_data/hamlet.hf")
:okLet's compare the file sizes of the original and compressed files:
ls -lh test_data/hamlet*
-rw-r--r-- 1 ndichev 688605420 175K May 1 23:04 test_data/hamlet
-rw-r--r-- 1 ndichev 688605420 102K May 4 16:29 test_data/hamlet.hf
-rw-r--r-- 1 ndichev 688605420 175K May 4 16:29 test_data/hamlet.hf.orig
diff test_data/hamlet test_data/hamlet.hf.orig
<no output>There are some unit tests in tests/. The unit test suite can be run with mix test. Additionally, excoveralls is configured and can be run with mix coveralls or mix coveralls.html.