func GetRangeFromIndex(r io.Reader, prefix string) (uint64, uint64, error) {
	prefix = clean(prefix)
	pbr := pbutil.NewReader(r)
	idx := &Index{}
	k := b(prefix)
	var lower, upper uint64
	iter := func(f func(int) bool) error {
		for {
			if err := pbr.Read(idx); err != nil {
				if err == io.EOF {
					break
				}
				return err
			}
			var cmp int
			if len(k) < len(idx.K) {
				cmp = bytes.Compare(k, idx.K[:len(k)])
			} else {
				cmp = bytes.Compare(k[:len(idx.K)], idx.K)
			}
			if f(cmp) {
				break
			}
		}
		return nil
	}
	low := func(cmp int) bool {
		if cmp > 0 {
			lower = idx.Offset
			return false
		} else if cmp < 0 {
			// Handles the case where a prefix fits within one range
			upper = idx.Offset
		}
		return true
	}
	up := func(cmp int) bool {
		if cmp < 0 {
			upper = idx.Offset
			return true
		}
		return false
	}
	// Find lower
	iter(low)
	// Find upper
	if upper <= 0 {
		iter(up)
	}
	// Handles the case when at the end of the indexes
	if upper <= 0 {
		return lower, 0, nil
	}
	// Return offset and size
	return lower, upper - lower, nil
}
func GetRangeFromIndex(r io.Reader, prefix string) (uint64, uint64, error) {
	prefix = clean(prefix)
	pbr := pbutil.NewReader(r)
	idx := &Index{}
	k := b(prefix)
	var lower, upper uint64
	iter := func(f func(int) bool) error {
		for {
			if err := pbr.Read(idx); err != nil {
				if err == io.EOF {
					break
				}
				return err
			}
			var cmp int
			if len(k) < len(idx.K) {
				cmp = bytes.Compare(k, idx.K[:len(k)])
			} else {
				cmp = bytes.Compare(k[:len(idx.K)], idx.K)
			}
			if f(cmp) {
				break
			}
		}
		return nil
	}
	low := func(cmp int) bool {
		if cmp > 0 {
			lower = idx.Offset
			return false
		} else if cmp < 0 {
			
			upper = idx.Offset
		}
		return true
	}
	up := func(cmp int) bool {
		if cmp < 0 {
			upper = idx.Offset
			return true
		}
		return false
	}
	
	iter(low)
	
	if upper <= 0 {
		iter(up)
	}
	
	if upper <= 0 {
		return lower, 0, nil
	}
	
	return lower, upper - lower, nil
}
func GetRangeFromIndex ( r io . Reader , prefix string ) ( uint64 , uint64 , error ) { prefix = clean ( prefix ) pbr := pbutil . NewReader ( r ) idx := & Index { } k := b ( prefix ) var lower , upper uint64 iter := func ( f func ( int ) bool ) error { for { if err := pbr . Read ( idx ) ; err != nil { if err == io . EOF { break } return err } var cmp int if len ( k ) < len ( idx . K ) { cmp = bytes . Compare ( k , idx . K [ : len ( k ) ] ) } else { cmp = bytes . Compare ( k [ : len ( idx . K ) ] , idx . K ) } if f ( cmp ) { break } } return nil } low := func ( cmp int ) bool { if cmp > 0 { lower = idx . Offset return false } else if cmp < 0 { // Handles the case where a prefix fits within one range upper = idx . Offset } return true } up := func ( cmp int ) bool { if cmp < 0 { upper = idx . Offset return true } return false } // Find lower iter ( low ) // Find upper if upper <= 0 { iter ( up ) } // Handles the case when at the end of the indexes if upper <= 0 { return lower , 0 , nil } // Return offset and size return lower , upper - lower , nil }
// GetRangeFromIndex returns a subtree byte range in a serialized hashtree based on a passed in prefix.
GetRangeFromIndex returns a subtree byte range in a serialized hashtree based on a passed in prefix .