Source file
src/reflect/iter.go
1
2
3
4
5 package reflect
6
7 import "iter"
8
9 func rangeNum[T int8 | int16 | int32 | int64 | int |
10 uint8 | uint16 | uint32 | uint64 | uint |
11 uintptr, N int64 | uint64](v N) iter.Seq[Value] {
12 return func(yield func(v Value) bool) {
13
14 for i := T(0); i < T(v); i++ {
15 if !yield(ValueOf(i)) {
16 return
17 }
18 }
19 }
20 }
21
22
23
24
25
26
27
28
29 func (v Value) Seq() iter.Seq[Value] {
30 if canRangeFunc(v.typ()) {
31 return func(yield func(Value) bool) {
32 rf := MakeFunc(v.Type().In(0), func(in []Value) []Value {
33 return []Value{ValueOf(yield(in[0]))}
34 })
35 v.Call([]Value{rf})
36 }
37 }
38 switch v.Kind() {
39 case Int:
40 return rangeNum[int](v.Int())
41 case Int8:
42 return rangeNum[int8](v.Int())
43 case Int16:
44 return rangeNum[int16](v.Int())
45 case Int32:
46 return rangeNum[int32](v.Int())
47 case Int64:
48 return rangeNum[int64](v.Int())
49 case Uint:
50 return rangeNum[uint](v.Uint())
51 case Uint8:
52 return rangeNum[uint8](v.Uint())
53 case Uint16:
54 return rangeNum[uint16](v.Uint())
55 case Uint32:
56 return rangeNum[uint32](v.Uint())
57 case Uint64:
58 return rangeNum[uint64](v.Uint())
59 case Uintptr:
60 return rangeNum[uintptr](v.Uint())
61 case Pointer:
62 if v.Elem().kind() != Array {
63 break
64 }
65 return func(yield func(Value) bool) {
66 v = v.Elem()
67 for i := range v.Len() {
68 if !yield(ValueOf(i)) {
69 return
70 }
71 }
72 }
73 case Array, Slice:
74 return func(yield func(Value) bool) {
75 for i := range v.Len() {
76 if !yield(ValueOf(i)) {
77 return
78 }
79 }
80 }
81 case String:
82 return func(yield func(Value) bool) {
83 for i := range v.String() {
84 if !yield(ValueOf(i)) {
85 return
86 }
87 }
88 }
89 case Map:
90 return func(yield func(Value) bool) {
91 i := v.MapRange()
92 for i.Next() {
93 if !yield(i.Key()) {
94 return
95 }
96 }
97 }
98 case Chan:
99 return func(yield func(Value) bool) {
100 for value, ok := v.Recv(); ok; value, ok = v.Recv() {
101 if !yield(value) {
102 return
103 }
104 }
105 }
106 }
107 panic("reflect: " + v.Type().String() + " cannot produce iter.Seq[Value]")
108 }
109
110
111
112
113
114
115 func (v Value) Seq2() iter.Seq2[Value, Value] {
116 if canRangeFunc2(v.typ()) {
117 return func(yield func(Value, Value) bool) {
118 rf := MakeFunc(v.Type().In(0), func(in []Value) []Value {
119 return []Value{ValueOf(yield(in[0], in[1]))}
120 })
121 v.Call([]Value{rf})
122 }
123 }
124 switch v.Kind() {
125 case Pointer:
126 if v.Elem().kind() != Array {
127 break
128 }
129 return func(yield func(Value, Value) bool) {
130 v = v.Elem()
131 for i := range v.Len() {
132 if !yield(ValueOf(i), v.Index(i)) {
133 return
134 }
135 }
136 }
137 case Array, Slice:
138 return func(yield func(Value, Value) bool) {
139 for i := range v.Len() {
140 if !yield(ValueOf(i), v.Index(i)) {
141 return
142 }
143 }
144 }
145 case String:
146 return func(yield func(Value, Value) bool) {
147 for i, v := range v.String() {
148 if !yield(ValueOf(i), ValueOf(v)) {
149 return
150 }
151 }
152 }
153 case Map:
154 return func(yield func(Value, Value) bool) {
155 i := v.MapRange()
156 for i.Next() {
157 if !yield(i.Key(), i.Value()) {
158 return
159 }
160 }
161 }
162 }
163 panic("reflect: " + v.Type().String() + " cannot produce iter.Seq2[Value, Value]")
164 }
165
View as plain text