2020-05-18 12:30:44 +00:00
|
|
|
/*
|
|
|
|
Package iterator provides functions to work with Neo iterators.
|
|
|
|
*/
|
2018-08-31 08:23:57 +00:00
|
|
|
package iterator
|
|
|
|
|
2021-02-05 16:02:09 +00:00
|
|
|
import "github.com/nspcc-dev/neo-go/pkg/interop/neogointernal"
|
|
|
|
|
2020-05-18 12:30:44 +00:00
|
|
|
// Iterator represents a Neo iterator, it's an opaque data structure that can
|
|
|
|
// be properly created by Create or storage.Find. Unlike enumerators, iterators
|
|
|
|
// range over key-value pairs, so it's convenient to use them for maps. This
|
|
|
|
// structure is similar in function to Neo .net framework's Iterator.
|
2018-08-31 08:23:57 +00:00
|
|
|
type Iterator struct{}
|
|
|
|
|
2020-07-21 10:14:16 +00:00
|
|
|
// Create creates an iterator from the given items (array, struct, map, byte
|
|
|
|
// array or integer and boolean converted to byte array). A new iterator is set
|
|
|
|
// to point at element -1, so to access its first element you need to call Next
|
|
|
|
// first. This function uses `System.Iterator.Create` syscall.
|
|
|
|
func Create(items interface{}) Iterator {
|
2021-02-05 16:02:09 +00:00
|
|
|
return neogointernal.Syscall1("System.Iterator.Create", items).(Iterator)
|
2018-08-31 08:23:57 +00:00
|
|
|
}
|
|
|
|
|
2020-05-18 12:30:44 +00:00
|
|
|
// Next advances the iterator returning true if it is was successful (and you
|
|
|
|
// can use Key or Value) and false otherwise (and there are no more elements in
|
2021-01-12 09:30:21 +00:00
|
|
|
// this Iterator). This function uses `System.Iterator.Next` syscall.
|
2020-03-26 13:34:54 +00:00
|
|
|
func Next(it Iterator) bool {
|
2021-02-05 16:02:09 +00:00
|
|
|
return neogointernal.Syscall1("System.Iterator.Next", it).(bool)
|
2020-03-26 13:34:54 +00:00
|
|
|
}
|
|
|
|
|
2020-05-18 12:30:44 +00:00
|
|
|
// Value returns iterator's current value. It's only valid to call after
|
2021-01-12 09:30:21 +00:00
|
|
|
// successful Next call. This function uses `System.Iterator.Value` syscall.
|
|
|
|
// For slices the result is just value.
|
|
|
|
// For maps the result can be casted to a slice of 2 elements: key and value.
|
2021-01-12 10:39:31 +00:00
|
|
|
// For storage iterators refer to `storage.FindFlags` documentation.
|
2020-03-26 13:34:54 +00:00
|
|
|
func Value(it Iterator) interface{} {
|
2021-02-05 16:02:09 +00:00
|
|
|
return neogointernal.Syscall1("System.Iterator.Value", it)
|
2020-03-26 13:34:54 +00:00
|
|
|
}
|