-
Notifications
You must be signed in to change notification settings - Fork 1
/
first.go
38 lines (35 loc) · 681 Bytes
/
first.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
package glinq
func First[T any](source IEnumerable[T], err *error) T {
if getter, ok := source.(IGetAt[T]); ok {
v, e := getter.GetAt(0)
if e != nil && err != nil {
*err = e
}
return v
}
iter := source.GetEnumerator()
e := iter.MoveNext()
var v T
if e != nil {
v = iter.Current()
if err != nil {
*err = e
}
}
return v
}
func FirstWhere[T any](source IEnumerable[T], pred func(T) bool, err *error) T {
iter := source.GetEnumerator()
e := iter.MoveNext()
for ; e == nil; e = iter.MoveNext() {
x := iter.Current()
if pred(x) {
return x
}
}
if err != nil {
*err = e
}
var result T
return result
}