From c685593e6e94fb4658cc3b6d3c0287951c7f7a9f Mon Sep 17 00:00:00 2001 From: Emir Pasic Date: Wed, 22 Jun 2016 05:11:41 +0200 Subject: [PATCH] - rewrite enumerable operations using iterator (for easier copy/paste into other containers) --- lists/arraylist/arraylist.go | 68 ++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/lists/arraylist/arraylist.go b/lists/arraylist/arraylist.go index ff3f51d..c0e313f 100644 --- a/lists/arraylist/arraylist.go +++ b/lists/arraylist/arraylist.go @@ -178,33 +178,54 @@ func (list *List) Insert(index int, values ...interface{}) { } } +func (list *List) Iterator() Iterator { + return Iterator{list: list, current: -1} +} + +func (iterator *Iterator) Next() bool { + iterator.current += 1 + return iterator.list.withinRange(iterator.current) +} + +func (iterator *Iterator) Value() interface{} { + return iterator.list.elements[iterator.current] +} + +func (iterator *Iterator) Index() interface{} { + return iterator.current +} + func (list *List) Each(f func(index interface{}, value interface{})) { - for i := 0; i < list.size; i++ { - f(i, list.elements[i]) + iterator := list.Iterator() + for iterator.Next() { + f(iterator.Index(), iterator.Value()) } } func (list *List) Map(f func(index interface{}, value interface{}) interface{}) containers.Container { newList := &List{} - for i := 0; i < list.size; i++ { - newList.Add(f(i, list.elements[i])) + iterator := list.Iterator() + for iterator.Next() { + newList.Add(f(iterator.Index(), iterator.Value())) } return newList } func (list *List) Select(f func(index interface{}, value interface{}) bool) containers.Container { newList := &List{} - for i := 0; i < list.size; i++ { - if f(i, list.elements[i]) { - newList.Add(list.elements[i]) + iterator := list.Iterator() + for iterator.Next() { + if f(iterator.Index(), iterator.Value()) { + newList.Add(iterator.Value()) } } return newList } func (list *List) Any(f func(index interface{}, value interface{}) bool) bool { - for i := 0; i < list.size; i++ { - if f(i, list.elements[i]) { + iterator := list.Iterator() + for iterator.Next() { + if f(iterator.Index(), iterator.Value()) { return true } } @@ -212,8 +233,9 @@ func (list *List) Any(f func(index interface{}, value interface{}) bool) bool { } func (list *List) All(f func(index interface{}, value interface{}) bool) bool { - for i := 0; i < list.size; i++ { - if !f(i, list.elements[i]) { + iterator := list.Iterator() + for iterator.Next() { + if !f(iterator.Index(), iterator.Value()) { return false } } @@ -221,9 +243,10 @@ func (list *List) All(f func(index interface{}, value interface{}) bool) bool { } func (list *List) Find(f func(index interface{}, value interface{}) bool) (index interface{}, value interface{}) { - for i := 0; i < list.size; i++ { - if f(i, list.elements[i]) { - return i, list.elements[i] + iterator := list.Iterator() + for iterator.Next() { + if f(iterator.Index(), iterator.Value()) { + return iterator.Index(), iterator.Value() } } return nil, nil @@ -234,23 +257,6 @@ type Iterator struct { current int } -func (list *List) Iterator() Iterator { - return Iterator{list: list, current: -1} -} - -func (iterator *Iterator) Next() bool { - iterator.current += 1 - return iterator.list.withinRange(iterator.current) -} - -func (iterator *Iterator) Value() interface{} { - return iterator.list.elements[iterator.current] -} - -func (iterator *Iterator) Index() interface{} { - return iterator.current -} - func (list *List) String() string { str := "ArrayList\n" values := []string{}