private void i8ReadWrite <TEncoder, TDecoder>()
            where TEncoder : struct, ICompression <RawBitWriter <u32ArrayMemory> >
            where TDecoder : struct, IDecompression <RawBitReader <u32ArrayMemory> >
        {
            var writer = new BitBufferWriter <TEncoder>();

            writer.i8(i8.MinValue);
            i8 half = i8.MaxValue / 2;

            writer.i8(half);
            writer.i8(i8.MaxValue);
            var data   = writer.ToArray();
            var reader = new BitBufferReader <TDecoder>();

            reader.CopyFrom(data);
            Assert.AreEqual(i8.MinValue, reader.i8());
            Assert.AreEqual(half, reader.i8Peek());
            Assert.AreEqual(half, reader.i8());
            Assert.AreEqual(i8.MaxValue, reader.i8());
        }