Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions array_iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,8 @@ type ArrayLoadedValueIterator struct {
dataIterator *arrayLoadedElementIterator
}

var _ ArrayIterator = &ArrayLoadedValueIterator{}

func (i *ArrayLoadedValueIterator) nextDataIterator() (*arrayLoadedElementIterator, error) {

// Iterate parents (LIFO) to find next loaded array data slab.
Expand Down Expand Up @@ -268,6 +270,11 @@ func (i *ArrayLoadedValueIterator) nextDataIterator() (*arrayLoadedElementIterat
return nil, nil
}

// CanMutate returns false.
func (i *ArrayLoadedValueIterator) CanMutate() bool {
return false
}

// Next iterates and returns next loaded element.
// It returns nil Value at end of loaded elements.
func (i *ArrayLoadedValueIterator) Next() (Value, error) {
Expand Down
26 changes: 25 additions & 1 deletion array_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6326,8 +6326,32 @@ func createArrayWithSimpleAndChildArrayValues(
}

func testArrayLoadedElements(t *testing.T, array *atree.Array, expectedValues testutils.ExpectedArrayValue) {
// Test Next

iter, err := array.ReadOnlyLoadedValueIterator()
require.NoError(t, err)
require.False(t, iter.CanMutate())

i := 0
err := array.IterateReadOnlyLoadedValues(func(v atree.Value) (bool, error) {
for {
v, err := iter.Next()
require.NoError(t, err)

if v == nil {
break
}

require.True(t, i < len(expectedValues))
testValueEqual(t, expectedValues[i], v)

i++
}
require.Equal(t, len(expectedValues), i)

// Test callback

i = 0
err = array.IterateReadOnlyLoadedValues(func(v atree.Value) (bool, error) {
require.True(t, i < len(expectedValues))
testValueEqual(t, expectedValues[i], v)
i++
Expand Down
21 changes: 21 additions & 0 deletions map_iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,8 @@ type MapLoadedValueIterator struct {
dataIterator *mapLoadedElementIterator
}

var _ MapIterator = &MapLoadedValueIterator{}

func (i *MapLoadedValueIterator) nextDataIterator() (*mapLoadedElementIterator, error) {

// Iterate parents (LIFO) to find next loaded map data slab.
Expand Down Expand Up @@ -546,6 +548,25 @@ func (i *MapLoadedValueIterator) nextDataIterator() (*mapLoadedElementIterator,
return nil, nil
}

// CanMutate returns false.
func (i *MapLoadedValueIterator) CanMutate() bool {
return false
}

// NextKey iterates and returns next loaded key.
// It returns nil key at end of loaded elements.
func (i *MapLoadedValueIterator) NextKey() (Value, error) {
key, _, err := i.Next()
return key, err
}

// NextValue iterates and returns next loaded value.
// It returns nil Value at end of loaded elements.
func (i *MapLoadedValueIterator) NextValue() (Value, error) {
_, value, err := i.Next()
return value, err
}

// Next iterates and returns next loaded element.
// It returns nil Value at end of loaded elements.
func (i *MapLoadedValueIterator) Next() (Value, Value, error) {
Expand Down
68 changes: 67 additions & 1 deletion map_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16668,8 +16668,74 @@ func createMapWithSimpleAndChildArrayValues(
}

func testMapLoadedElements(t *testing.T, m *atree.OrderedMap, expectedValues [][2]atree.Value) {
// Test NextKey
iter, err := m.ReadOnlyLoadedValueIterator()
require.NoError(t, err)
require.False(t, iter.CanMutate())

i := 0
err := m.IterateReadOnlyLoadedValues(func(k atree.Value, v atree.Value) (bool, error) {
for {
k, err := iter.NextKey()
require.NoError(t, err)

if k == nil {
break
}

require.True(t, i < len(expectedValues))
testValueEqual(t, expectedValues[i][0], k)

i++
}
require.Equal(t, len(expectedValues), i)

// Test NextValue

iter, err = m.ReadOnlyLoadedValueIterator()
require.NoError(t, err)

i = 0
for {
v, err := iter.NextValue()
require.NoError(t, err)

if v == nil {
break
}

require.True(t, i < len(expectedValues))
testValueEqual(t, expectedValues[i][1], v)

i++
}
require.Equal(t, len(expectedValues), i)

// Test Next

iter, err = m.ReadOnlyLoadedValueIterator()
require.NoError(t, err)

i = 0
for {
k, v, err := iter.Next()
require.NoError(t, err)

if v == nil {
break
}

require.True(t, i < len(expectedValues))
testValueEqual(t, expectedValues[i][0], k)
testValueEqual(t, expectedValues[i][1], v)

i++
}
require.Equal(t, len(expectedValues), i)

// Test callback

i = 0
err = m.IterateReadOnlyLoadedValues(func(k atree.Value, v atree.Value) (bool, error) {
require.True(t, i < len(expectedValues))
testValueEqual(t, expectedValues[i][0], k)
testValueEqual(t, expectedValues[i][1], v)
Expand Down
Loading