aboutsummaryrefslogtreecommitdiffstats
path: root/lib/iterator/impl.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/iterator/impl.go')
-rw-r--r--lib/iterator/impl.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/lib/iterator/impl.go b/lib/iterator/impl.go
new file mode 100644
index 00000000..5e685166
--- /dev/null
+++ b/lib/iterator/impl.go
@@ -0,0 +1,125 @@
+package iterator
+
+import (
+ "errors"
+
+ "git.sr.ht/~rjarry/aerc/worker/types"
+)
+
+// defaultFactory
+type defaultFactory struct{}
+
+func (df *defaultFactory) NewIterator(a interface{}) Iterator {
+ switch data := a.(type) {
+ case []uint32:
+ return &defaultUid{data: data, index: len(data)}
+ case []*types.Thread:
+ return &defaultThread{data: data, index: len(data)}
+ }
+ panic(errors.New("a iterator for this type is not implemented yet"))
+}
+
+// defaultUid
+type defaultUid struct {
+ data []uint32
+ index int
+}
+
+func (du *defaultUid) Next() bool {
+ du.index--
+ return du.index >= 0
+}
+
+func (du *defaultUid) Value() interface{} {
+ return du.data[du.index]
+}
+
+func (du *defaultUid) StartIndex() int {
+ return len(du.data) - 1
+}
+
+func (du *defaultUid) EndIndex() int {
+ return 0
+}
+
+// defaultThread
+type defaultThread struct {
+ data []*types.Thread
+ index int
+}
+
+func (dt *defaultThread) Next() bool {
+ dt.index--
+ return dt.index >= 0
+}
+
+func (dt *defaultThread) Value() interface{} {
+ return dt.data[dt.index]
+}
+
+func (dt *defaultThread) StartIndex() int {
+ return len(dt.data) - 1
+}
+
+func (dt *defaultThread) EndIndex() int {
+ return 0
+}
+
+// reverseFactory
+type reverseFactory struct{}
+
+func (rf *reverseFactory) NewIterator(a interface{}) Iterator {
+ switch data := a.(type) {
+ case []uint32:
+ return &reverseUid{data: data, index: -1}
+ case []*types.Thread:
+ return &reverseThread{data: data, index: -1}
+ }
+ panic(errors.New("an iterator for this type is not implemented yet"))
+}
+
+// reverseUid
+type reverseUid struct {
+ data []uint32
+ index int
+}
+
+func (ru *reverseUid) Next() bool {
+ ru.index++
+ return ru.index < len(ru.data)
+}
+
+func (ru *reverseUid) Value() interface{} {
+ return ru.data[ru.index]
+}
+
+func (ru *reverseUid) StartIndex() int {
+ return 0
+}
+
+func (ru *reverseUid) EndIndex() int {
+ return len(ru.data) - 1
+}
+
+// reverseThread
+type reverseThread struct {
+ data []*types.Thread
+ index int
+}
+
+func (rt *reverseThread) Next() bool {
+ rt.index++
+ return rt.index < len(rt.data)
+}
+
+func (rt *reverseThread) Value() interface{} {
+ return rt.data[rt.index]
+}
+
+func (rt *reverseThread) StartIndex() int {
+ return 0
+}
+
+func (rt *reverseThread) EndIndex() int {
+ return len(rt.data) - 1
+}