anchor.diff:  encode_cell({_ColumnType, []}) ->
       #tscell{}.
   
  +%% @doc Only for encoding rows for PUTs on the erlang client,
  +%%      and Key cells for get / delete requests.
  +%%      Will not properly encode timestamp #tscell{} records,
  +%%      but this is OK for these use cases since the values
  +%%      get cast in the order of:
  +%%      lvldbvalue() -> #tscell{} -> lvldbvalue().
  +%%      THEREFORE no info is lost for these cases.
  +%% @end
  +-spec encode_cell_non_strict(ldbvalue()) -> #tscell{}.
  +encode_cell_non_strict(V) when is_binary(V) ->
  +    #tscell{varchar_value = V};
  +encode_cell_non_strict(V) when is_integer(V) ->
  +    #tscell{sint64_value = V};
  +encode_cell_non_strict(V) when is_float(V) ->
  +    #tscell{double_value = V};
  +encode_cell_non_strict(V) when is_boolean(V) ->
  +    #tscell{boolean_value = V};
  +encode_cell_non_strict(undefined) ->
  +    #tscell{};
  +%% NULL Cell
  +%% TODO: represent null cells by something other than an empty list. emptyTsCell atom maybe?
  +encode_cell_non_strict([]) ->
  +    #tscell{}.
  +
   -spec decode_cells([#tscell{}], list(ldbvalue())) -> list(ldbvalue()).
   decode_cells([], Acc) ->
       lists:reverse(Acc);
  
positive.code: encode_rows(ColumnTypes, Rows) ->
      [encode_row(ColumnTypes, Row) || Row <- Rows].
  
  %% @doc Decode a list of timeseries #tsrow{} to a list of tuples.
  %% Each row is converted through `decode_cells/1`, and the list
  %% of ldbvalue() is converted to a tuple of ldbvalue().
  
negative.code: -spec encode_row(list(tscolumntype()), list(ldbvalue())) -> #tsrow{}.
  encode_row(ColumnTypes, RowCells) when length(ColumnTypes) =:= length(RowCells) ->
      #tsrow{cells = [encode_cell(ColumnTypeCell) || ColumnTypeCell <- lists:zip(ColumnTypes, RowCells)]}.
  
  %% @doc Only for encoding rows for PUTs on the erlang client.
  %%      Will not properly encode timestamp #tscell{} records,
  %%      but this is OK for these use cases since the values
  %%      get cast in the order of:
  %%      lvldbvalue() -> #tscell{} -> lvldbvalue().
  %%      THEREFORE no info is lost for these cases.
  %% @end
  -spec encode_row_non_strict(list(ldbvalue())) -> #tsrow{}.
  encode_row_non_strict(RowCells) ->
      #tsrow{cells = encode_cells_non_strict(RowCells)}.
  
  %% @doc Only for encoding cells for PUTs on the erlang client,
  %%      and Key cells for get / delete requests.
  %%      Will not properly encode timestamp #tscell{} records,
  %%      but this is OK for these use cases since the values
  %%      get cast in the order of:
  %%      lvldbvalue() -> #tscell{} -> lvldbvalue().
  %%      THEREFORE no info is lost for these cases.
  %% @end
  -spec encode_cells_non_strict(list(ldbvalue())) -> list(#tscell{}).
  encode_cells_non_strict(Cells) ->
      [encode_cell_non_strict(Cell) || Cell <- Cells].
  
  -spec encode_cell({tscolumntype(), ldbvalue()}) -> #tscell{}.
  encode_cell({varchar, V}) when is_binary(V) ->
  