private Dictionary <DefaultableSymbol <byte>, Dictionary <byte, int> > createSymbolDictionary()
        {
            var perSymbolDictionary = new Dictionary <DefaultableSymbol <byte>, Dictionary <byte, int> >();
            DefaultableSymbol <byte> previousSymbol;

            perSymbolDictionary.Add(new DefaultableSymbol <byte>(true), new Dictionary <byte, int>()
            {
                { inputReader.Current, 1 }
            });
            previousSymbol = new DefaultableSymbol <byte>(inputReader.Current);
            while (inputReader.MoveNext())
            {
                if (!perSymbolDictionary.ContainsKey(previousSymbol))
                {
                    perSymbolDictionary.Add(previousSymbol, new Dictionary <byte, int>());
                }
                if (perSymbolDictionary[previousSymbol].ContainsKey(inputReader.Current))
                {
                    ++perSymbolDictionary[previousSymbol][inputReader.Current];
                }
                else
                {
                    perSymbolDictionary[previousSymbol].Add(inputReader.Current, 1);
                }
                previousSymbol = new DefaultableSymbol <byte>(inputReader.Current);
            }
            ;
            inputReader.Reset();
            this.symbolDictionary = perSymbolDictionary;
            return(perSymbolDictionary);
        }
        public void Encode()
        {
            DefaultableSymbol <byte> previousSymbol;
            Dictionary <DefaultableSymbol <byte>, ICoder <byte> > coderDictionary = createCoderDictionary();

            coderDictionary[new DefaultableSymbol <byte>(true)].Encode(new MarkowHuffmanCoderInput(inputReader.Current), new HuffmanCoderOutput(coderOutputWriter));
            previousSymbol = new DefaultableSymbol <byte>(inputReader.Current);
            while (inputReader.MoveNext())
            {
                coderDictionary[previousSymbol].Encode(new MarkowHuffmanCoderInput(inputReader.Current), new HuffmanCoderOutput(coderOutputWriter));
                previousSymbol = new DefaultableSymbol <byte>(inputReader.Current);
            }
            coderOutputWriter.CreateFileBytes(HuffmanEncodeModel.Markov, true, SymbolQuantityMapConverter.MarkowIntToExtConvert(this.symbolDictionary, CreateEncodingDictionaries(coderDictionary)));
        }
        public void Decode()
        {
            DefaultableSymbol <byte> previousSymbol;
            Dictionary <DefaultableSymbol <byte>, IDecoder <byte> > decoderDictionary = createDecoderDictionary();
            MarkowHuffmanDecoderOutput markowHuffmanDecoderOutput = new MarkowHuffmanDecoderOutput(decoderFileWriter);

            decoderDictionary[new DefaultableSymbol <byte>(true)].Decode(new HuffmanDecoderInput(decoderReader), markowHuffmanDecoderOutput);
            previousSymbol = new DefaultableSymbol <byte>(markowHuffmanDecoderOutput.DecodedSymbol);
            int symbolsDecoded = 1;

            while (symbolsDecoded < symbolsCount)
            {
                markowHuffmanDecoderOutput = new MarkowHuffmanDecoderOutput(decoderFileWriter);
                decoderDictionary[previousSymbol].Decode(new HuffmanDecoderInput(decoderReader), markowHuffmanDecoderOutput);
                previousSymbol = new DefaultableSymbol <byte>(markowHuffmanDecoderOutput.DecodedSymbol);
                ++symbolsDecoded;
            }
        }