github.com/Finschia/finschia-sdk@v0.48.1/store/firstlast.go (about) 1 package store 2 3 import ( 4 "bytes" 5 6 sdk "github.com/Finschia/finschia-sdk/types" 7 sdkkv "github.com/Finschia/finschia-sdk/types/kv" 8 ) 9 10 // Gets the first item. 11 func First(st KVStore, start, end []byte) (kv sdkkv.Pair, ok bool) { 12 iter := st.Iterator(start, end) 13 if !iter.Valid() { 14 return kv, false 15 } 16 defer iter.Close() 17 18 return sdkkv.Pair{Key: iter.Key(), Value: iter.Value()}, true 19 } 20 21 // Gets the last item. `end` is exclusive. 22 func Last(st KVStore, start, end []byte) (kv sdkkv.Pair, ok bool) { 23 iter := st.ReverseIterator(end, start) 24 if !iter.Valid() { 25 if v := st.Get(start); v != nil { 26 return sdkkv.Pair{Key: sdk.CopyBytes(start), Value: sdk.CopyBytes(v)}, true 27 } 28 return kv, false 29 } 30 defer iter.Close() 31 32 if bytes.Equal(iter.Key(), end) { 33 // Skip this one, end is exclusive. 34 iter.Next() 35 if !iter.Valid() { 36 return kv, false 37 } 38 } 39 40 return sdkkv.Pair{Key: iter.Key(), Value: iter.Value()}, true 41 }