This repository has been archived on 2021-09-07. You can view files and clone it, but cannot push or open issues or pull requests.

83 lines
1.4 KiB
Go
Raw Permalink Normal View History

2018-04-22 14:13:57 +03:00
package main
import (
"fmt"
)
//Iterator object should implement this interface
type Iterator interface {
First()
Next() bool
Done() bool
CurrentItem() interface{}
}
//A list object should implement Iterable interface in order to be a iterable list
type Iterable interface {
CreateIterator() Iterator
}
//Iterator object
type ListIterator struct {
data []string
index int
}
func (i *ListIterator) Done() bool {
return i.index >= len(i.data)
}
func (i *ListIterator) CurrentItem() interface{} {
return i.data[i.index]
}
func (i *ListIterator) First() {
i.index = 0
}
func (i *ListIterator) Next() bool {
i.index++
if i.Done() {
return false
}
return true
}
//Actual a basic list object.I don't use abstraction here.
type List struct {
data []string
}
func (l *List) Append(str string) {
l.data = append(l.data, str)
}
func (l *List) Count() int {
return len(l.data)
}
func (l *List) CreateIterator() Iterator {
listIterator := &ListIterator{data: l.data, index: -1}
return listIterator
}
//Basic testing....
func main() {
lst := &List{data: make([]string, 0)}
lst.Append("A")
lst.Append("B")
lst.Append("C")
lst.Append("D")
lst.Append("E")
//time to iterate...
lstIterator := lst.CreateIterator()
for lstIterator.Next() {
fmt.Println("-", lstIterator.CurrentItem())
}
lstIterator.First()
fmt.Println("First:", lstIterator.CurrentItem())
}