% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
%   http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(erlfdb_key).


-export([
    to_selector/1,

    last_less_than/1,
    last_less_or_equal/1,
    first_greater_than/1,
    first_greater_or_equal/1,

    strinc/1
]).


to_selector(<<_/binary>> = Key) ->
    {Key, gteq};
to_selector({<<_/binary>>, _} = Sel) ->
    Sel;
to_selector({<<_/binary>>, _, _} = Sel) ->
    Sel;
to_selector(Else) ->
    erlang:error({invalid_key_selector, Else}).


last_less_than(Key) when is_binary(Key) ->
    {Key, lt}.


last_less_or_equal(Key) when is_binary(Key) ->
    {Key, lteq}.


first_greater_than(Key) when is_binary(Key) ->
    {Key, gt}.


first_greater_or_equal(Key) when is_binary(Key) ->
    {Key, gteq}.


strinc(Key) when is_binary(Key) ->
    Prefix = rstrip_ff(Key),
    PrefixLen = size(Prefix),
    Head = binary:part(Prefix, {0, PrefixLen - 1}),
    Tail = binary:at(Prefix, PrefixLen - 1),
    <<Head/binary, (Tail + 1)>>.


rstrip_ff(<<>>) ->
    erlang:error("Key must contain at least one byte not equal to 0xFF");

rstrip_ff(Key) ->
    KeyLen = size(Key),
    case binary:at(Key, KeyLen - 1) of
        16#FF -> rstrip_ff(binary:part(Key, {0, KeyLen - 1}));
        _ -> Key
    end.
