// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package nosql

type RowRange interface {
	Start() string
	Limit() string
}

type PrefixRange interface {
	RowRange
	Prefix() string
}

type rowRange struct {
	start string
	limit string
}

func (r *rowRange) Start() string {
	return r.start
}

func (r *rowRange) Limit() string {
	return r.limit
}

func SingleRow(row string) RowRange {
	return &rowRange{start: row, limit: row + "\x00"}
}

func Range(start, limit string) RowRange {
	return &rowRange{start: start, limit: limit}
}

// prefixRange implements the PrefixRange interface (and thus also the RowRange
// interface). We do not represent a prefix as a rowRange because we want to be
// able to distinguish prefixes from ranges (e.g. syncgroups work with prefixes,
// not ranges).
type prefixRange struct {
	prefix string
}

func (r *prefixRange) Start() string {
	return r.prefix
}

func (r *prefixRange) Limit() string {
	p := r.prefix
	if p == "" {
		return p
	}
	// TODO(sadovsky): Special handling for delimiters or other reserved chars?
	// TODO(sadovsky): This implementation is incorrect if we allow prefix strings
	// to contain bytes with the max possible value (255). In practice we may
	// disallow such byte values, but in any case it's probably best to make this
	// implementation defensive.
	return p[:len(p)-1] + string(p[len(p)-1]+1)
}

func (r *prefixRange) Prefix() string {
	return r.prefix
}

func Prefix(prefix string) PrefixRange {
	return &prefixRange{prefix: prefix}
}
