public Codeword encode(int symbol) {
   switch (state) {
     case LiteralLengthState:
       if (symbol > 255) {
         state = State.OffsetNibble0State;
       }
       return literalLengthModel.encode(symbol);
     case OffsetNibble0State:
       state = State.OffsetNibble1State;
       return offsetNibble0Model.encode(symbol);
     case OffsetNibble1State:
       state = State.OffsetNibble2State;
       return offsetNibble1Model.encode(symbol);
     case OffsetNibble2State:
       state = State.OffsetNibble3State;
       return offsetNibble2Model.encode(symbol);
     case OffsetNibble3State:
       state = State.LiteralLengthState;
       return offsetNibble3Model.encode(symbol);
     default:
       throw new RuntimeException();
   }
 }