-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenumerator.go
126 lines (98 loc) · 2.98 KB
/
enumerator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package handy
import (
"github.com/hsldymq/goiter"
"iter"
)
func NewEnumerator[TIter goiter.SeqX[T], T any](it TIter) *Enumerator[T] {
return &Enumerator[T]{
iterator: goiter.Iterator[T](it),
}
}
type Enumerator[T any] struct {
iterator goiter.Iterator[T]
}
func (e *Enumerator[T]) Iter() iter.Seq[T] {
return e.iterator.Seq()
}
func (e *Enumerator[T]) Count() int {
return e.iterator.Count()
}
func (e *Enumerator[T]) Any(predicate func(T) bool) bool {
for each := range e.iterator {
if predicate(each) {
return true
}
}
return false
}
func (e *Enumerator[T]) All(predicate func(T) bool) bool {
for each := range e.iterator {
if !predicate(each) {
return false
}
}
return true
}
func (e *Enumerator[T]) Filter(predicate func(T) bool) Enumerable[T] {
return filter(e, predicate)
}
func (e *Enumerator[T]) Take(n int) Enumerable[T] {
return NewEnumerator(goiter.Take(e.Iter(), n))
}
func (e *Enumerator[T]) TakeLast(n int) Enumerable[T] {
return NewEnumerator(goiter.TakeLast(e.Iter(), n))
}
func (e *Enumerator[T]) Skip(n int) Enumerable[T] {
return NewEnumerator(goiter.Skip(e.Iter(), n))
}
func (e *Enumerator[T]) SkipLast(n int) Enumerable[T] {
return NewEnumerator(goiter.SkipLast(e.Iter(), n))
}
func (e *Enumerator[T]) Distinct() Enumerable[T] {
return distinct[T](e)
}
func (e *Enumerator[T]) DistinctBy(keySelector func(T) any) Enumerable[T] {
return distinctBy(e, keySelector)
}
func (e *Enumerator[T]) Union(target Iterable[T]) Enumerable[T] {
return union(e, target)
}
func (e *Enumerator[T]) UnionBy(target Iterable[T], keySelector func(T) any) Enumerable[T] {
return unionBy(e, target, keySelector)
}
func (e *Enumerator[T]) Intersect(target Iterable[T]) Enumerable[T] {
return intersect(e, target)
}
func (e *Enumerator[T]) IntersectBy(target Iterable[T], keySelector func(T) any) Enumerable[T] {
return intersectBy(e, target, keySelector)
}
func (e *Enumerator[T]) Except(target Iterable[T]) Enumerable[T] {
return except(e, target)
}
func (e *Enumerator[T]) ExceptBy(target Iterable[T], keySelector func(T) any) Enumerable[T] {
return exceptBy(e, target, keySelector)
}
func (e *Enumerator[T]) SequenceEqual(target Iterable[T]) bool {
return sequenceEqual[T](e, target)
}
func (e *Enumerator[T]) SequenceEqualBy(target Iterable[T], keySelector func(T) any) bool {
return sequenceEqualBy(e, target, keySelector)
}
func (e *Enumerator[T]) Concat(iterables ...Iterable[T]) Enumerable[T] {
return concat(e, iterables...)
}
func (e *Enumerator[T]) First() (T, bool) {
return first[T](e)
}
func (e *Enumerator[T]) FirstOrDefault(def T) T {
return firstOrDefault(e, def)
}
func (e *Enumerator[T]) Last() (T, bool) {
return last[T](e)
}
func (e *Enumerator[T]) LastOrDefault(def T) T {
return lastOrDefault(e, def)
}
func (e *Enumerator[T]) OrderBy(cmp func(a, b T) int) Enumerable[T] {
return orderBy(e, cmp)
}