Skip to content

Commit edb9ee6

Browse files
committed
refactor
1 parent 1f5cfc2 commit edb9ee6

File tree

2 files changed

+75
-45
lines changed

2 files changed

+75
-45
lines changed

iterator.go

+36-21
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,44 @@ func (it Iterator[T]) Through(f func(T) T) Iterator[T] {
6868
func (it Iterator[T]) Cache() Iterator[T] {
6969
var cached []T
7070
var cacheFlag int32
71-
return func(yield func(T) bool) {
72-
if cached != nil {
73-
for _, v := range cached {
74-
if !yield(v) {
75-
return
76-
}
71+
72+
var dynIter iter.Seq[T]
73+
cachedIter := func(yield func(T) bool) {
74+
for _, v := range cached {
75+
if !yield(v) {
76+
return
77+
}
78+
}
79+
}
80+
81+
originalIter := func(yield func(T) bool) {
82+
cTemp := make([]T, 0)
83+
next, stop := iter.Pull(iter.Seq[T](it))
84+
defer stop()
85+
for {
86+
v, ok := next()
87+
if !ok {
88+
break
7789
}
78-
} else {
79-
cTemp := make([]T, 0)
80-
next, stop := iter.Pull(iter.Seq[T](it))
81-
defer stop()
82-
for {
83-
v, ok := next()
84-
if !ok {
85-
break
86-
}
87-
if !yield(v) {
88-
return
89-
}
90-
cTemp = append(cTemp, v)
90+
if !yield(v) {
91+
return
9192
}
92-
if atomic.CompareAndSwapInt32(&cacheFlag, 0, 1) {
93-
cached = cTemp
93+
cTemp = append(cTemp, v)
94+
}
95+
if atomic.CompareAndSwapInt32(&cacheFlag, 0, 1) {
96+
cached = cTemp
97+
dynIter = cachedIter
98+
}
99+
}
100+
dynIter = originalIter
101+
sIter := IterSource(func() iter.Seq[T] {
102+
return dynIter
103+
})
104+
105+
return func(yield func(T) bool) {
106+
for v := range sIter {
107+
if !yield(v) {
108+
return
94109
}
95110
}
96111
}

iterator2.go

+39-24
Original file line numberDiff line numberDiff line change
@@ -68,32 +68,47 @@ func (it Iterator2[T1, T2]) Through(f func(T1, T2) (T1, T2)) Iterator2[T1, T2] {
6868
func (it Iterator2[T1, T2]) Cache() Iterator2[T1, T2] {
6969
var cached []*Combined[T1, T2]
7070
var cacheFlag int32
71-
return func(yield func(T1, T2) bool) {
72-
if cached != nil {
73-
for _, v := range cached {
74-
if !yield(v.V1, v.V2) {
75-
return
76-
}
71+
72+
var dynIter iter.Seq2[T1, T2]
73+
cachedIter := func(yield func(T1, T2) bool) {
74+
for _, v := range cached {
75+
if !yield(v.V1, v.V2) {
76+
return
77+
}
78+
}
79+
}
80+
81+
originalIter := func(yield func(T1, T2) bool) {
82+
cTemp := make([]*Combined[T1, T2], 0)
83+
next, stop := iter.Pull2(iter.Seq2[T1, T2](it))
84+
defer stop()
85+
for {
86+
v1, v2, ok := next()
87+
if !ok {
88+
break
7789
}
78-
} else {
79-
cTemp := make([]*Combined[T1, T2], 0)
80-
next, stop := iter.Pull2(iter.Seq2[T1, T2](it))
81-
defer stop()
82-
for {
83-
v1, v2, ok := next()
84-
if !ok {
85-
break
86-
}
87-
if !yield(v1, v2) {
88-
return
89-
}
90-
cTemp = append(cTemp, &Combined[T1, T2]{
91-
V1: v1,
92-
V2: v2,
93-
})
90+
if !yield(v1, v2) {
91+
return
9492
}
95-
if atomic.CompareAndSwapInt32(&cacheFlag, 0, 1) {
96-
cached = cTemp
93+
cTemp = append(cTemp, &Combined[T1, T2]{
94+
V1: v1,
95+
V2: v2,
96+
})
97+
}
98+
if atomic.CompareAndSwapInt32(&cacheFlag, 0, 1) {
99+
cached = cTemp
100+
dynIter = cachedIter
101+
}
102+
}
103+
dynIter = originalIter
104+
sIter := Iter2Source(func() iter.Seq2[T1, T2] {
105+
return dynIter
106+
})
107+
108+
return func(yield func(T1, T2) bool) {
109+
for v1, v2 := range sIter {
110+
if !yield(v1, v2) {
111+
return
97112
}
98113
}
99114
}

0 commit comments

Comments
 (0)