diff --git a/containers/iterator.go b/containers/iterator.go index 0dcb829..db0ea7a 100644 --- a/containers/iterator.go +++ b/containers/iterator.go @@ -28,11 +28,28 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package containers -type Iterator interface { +// Stateful iterator for ordered containers whose values can be fetched by an index. +type IteratorWithIndex interface { // Moves the iterator to the next element and returns true if there was a next element in the container. + // Modifies the state of the iterator. Next() bool // Returns the current element's value. + // Does not modify the state of the iterator. Value() interface{} - // Returns the current element's index(key). - Index() interface{} + // Returns the current element's index. + // Does not modify the state of the iterator. + Index() int +} + +// Stateful iterator for ordered containers whose elements are key value pairs. +type IteratorWithKey interface { + // Moves the iterator to the next element and returns true if there was a next element in the container. + // Modifies the state of the iterator. + Next() bool + // Returns the current element's value. + // Does not modify the state of the iterator. + Value() interface{} + // Returns the current element's key. + // Does not modify the state of the iterator. + Key() interface{} } diff --git a/lists/arraylist/arraylist.go b/lists/arraylist/arraylist.go index 059ef3e..df40aa8 100644 --- a/lists/arraylist/arraylist.go +++ b/lists/arraylist/arraylist.go @@ -41,7 +41,7 @@ import ( func assertInterfaceImplementation() { var _ lists.List = (*List)(nil) var _ containers.Enumerable = (*List)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithIndex = (*Iterator)(nil) } type List struct { @@ -196,7 +196,7 @@ func (iterator *Iterator) Value() interface{} { return iterator.list.elements[iterator.index] } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Index() int { return iterator.index } diff --git a/lists/doublylinkedlist/doublylinkedlist.go b/lists/doublylinkedlist/doublylinkedlist.go index 69d6368..40b6d43 100644 --- a/lists/doublylinkedlist/doublylinkedlist.go +++ b/lists/doublylinkedlist/doublylinkedlist.go @@ -41,7 +41,7 @@ import ( func assertInterfaceImplementation() { var _ lists.List = (*List)(nil) var _ containers.Enumerable = (*List)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithIndex = (*Iterator)(nil) } type List struct { @@ -328,7 +328,7 @@ func (iterator *Iterator) Value() interface{} { return iterator.element.value } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Index() int { return iterator.index } diff --git a/lists/singlylinkedlist/singlylinkedlist.go b/lists/singlylinkedlist/singlylinkedlist.go index 69177b3..3faed7d 100644 --- a/lists/singlylinkedlist/singlylinkedlist.go +++ b/lists/singlylinkedlist/singlylinkedlist.go @@ -41,7 +41,7 @@ import ( func assertInterfaceImplementation() { var _ lists.List = (*List)(nil) var _ containers.Enumerable = (*List)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithIndex = (*Iterator)(nil) } type List struct { @@ -298,7 +298,7 @@ func (iterator *Iterator) Value() interface{} { return iterator.element.value } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Index() int { return iterator.index } diff --git a/stacks/arraystack/arraystack.go b/stacks/arraystack/arraystack.go index 4b670dd..c775e80 100644 --- a/stacks/arraystack/arraystack.go +++ b/stacks/arraystack/arraystack.go @@ -40,7 +40,7 @@ import ( func assertInterfaceImplementation() { var _ stacks.Stack = (*Stack)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithIndex = (*Iterator)(nil) } type Stack struct { @@ -115,7 +115,7 @@ func (iterator *Iterator) Value() interface{} { return value } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Index() int { return iterator.index } diff --git a/stacks/linkedliststack/linkedliststack.go b/stacks/linkedliststack/linkedliststack.go index 14b720f..7bf5d03 100644 --- a/stacks/linkedliststack/linkedliststack.go +++ b/stacks/linkedliststack/linkedliststack.go @@ -41,7 +41,7 @@ import ( func assertInterfaceImplementation() { var _ stacks.Stack = (*Stack)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithIndex = (*Iterator)(nil) } type Stack struct { @@ -111,7 +111,7 @@ func (iterator *Iterator) Value() interface{} { return value } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Index() int { return iterator.index } diff --git a/trees/binaryheap/binaryheap.go b/trees/binaryheap/binaryheap.go index c5b2e39..ab7452b 100644 --- a/trees/binaryheap/binaryheap.go +++ b/trees/binaryheap/binaryheap.go @@ -42,7 +42,7 @@ import ( func assertInterfaceImplementation() { var _ trees.Tree = (*Heap)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithIndex = (*Iterator)(nil) } type Heap struct { @@ -130,7 +130,7 @@ func (iterator *Iterator) Value() interface{} { return value } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Index() int { return iterator.index } diff --git a/trees/redblacktree/redblacktree.go b/trees/redblacktree/redblacktree.go index 35d1d56..da000ad 100644 --- a/trees/redblacktree/redblacktree.go +++ b/trees/redblacktree/redblacktree.go @@ -41,7 +41,7 @@ import ( func assertInterfaceImplementation() { var _ trees.Tree = (*Tree)(nil) - var _ containers.Iterator = (*Iterator)(nil) + var _ containers.IteratorWithKey = (*Iterator)(nil) } type color bool @@ -311,7 +311,7 @@ func (iterator *Iterator) Value() interface{} { return iterator.left.Value } -func (iterator *Iterator) Index() interface{} { +func (iterator *Iterator) Key() interface{} { return iterator.left.Key } diff --git a/trees/redblacktree/redblacktree_test.go b/trees/redblacktree/redblacktree_test.go index 90f1fe0..eee8955 100644 --- a/trees/redblacktree/redblacktree_test.go +++ b/trees/redblacktree/redblacktree_test.go @@ -234,7 +234,7 @@ func TestRedBlackTreeIterator(t *testing.T) { count := 0 for it.Next() { count += 1 - index := it.Index() + index := it.Key() switch index { case count: if actualValue, expectedValue := index, count; actualValue != expectedValue { @@ -259,7 +259,7 @@ func TestRedBlackTreeIterator(t *testing.T) { count = 0 for it.Next() { count += 1 - index := it.Index() + index := it.Key() switch index { case count: if actualValue, expectedValue := index, count; actualValue != expectedValue { @@ -282,7 +282,7 @@ func TestRedBlackTreeIterator(t *testing.T) { count = 0 for it.Next() { count += 1 - index := it.Index() + index := it.Key() switch index { case count: if actualValue, expectedValue := index, count; actualValue != expectedValue {