| |
| |
| |
|
|
| package reflect |
|
|
| import ( |
| "iter" |
| ) |
|
|
| func rangeNum[T int8 | int16 | int32 | int64 | int | |
| uint8 | uint16 | uint32 | uint64 | uint | |
| uintptr, N int64 | uint64](num N, t Type) iter.Seq[Value] { |
| return func(yield func(v Value) bool) { |
| convert := t.PkgPath() != "" |
| |
| for i := T(0); i < T(num); i++ { |
| tmp := ValueOf(i) |
| |
| |
| if convert { |
| tmp = tmp.Convert(t) |
| } |
| if !yield(tmp) { |
| return |
| } |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| func (v Value) Seq() iter.Seq[Value] { |
| if canRangeFunc(v.abiType()) { |
| return func(yield func(Value) bool) { |
| rf := MakeFunc(v.Type().In(0), func(in []Value) []Value { |
| return []Value{ValueOf(yield(in[0]))} |
| }) |
| v.Call([]Value{rf}) |
| } |
| } |
| switch v.kind() { |
| case Int: |
| return rangeNum[int](v.Int(), v.Type()) |
| case Int8: |
| return rangeNum[int8](v.Int(), v.Type()) |
| case Int16: |
| return rangeNum[int16](v.Int(), v.Type()) |
| case Int32: |
| return rangeNum[int32](v.Int(), v.Type()) |
| case Int64: |
| return rangeNum[int64](v.Int(), v.Type()) |
| case Uint: |
| return rangeNum[uint](v.Uint(), v.Type()) |
| case Uint8: |
| return rangeNum[uint8](v.Uint(), v.Type()) |
| case Uint16: |
| return rangeNum[uint16](v.Uint(), v.Type()) |
| case Uint32: |
| return rangeNum[uint32](v.Uint(), v.Type()) |
| case Uint64: |
| return rangeNum[uint64](v.Uint(), v.Type()) |
| case Uintptr: |
| return rangeNum[uintptr](v.Uint(), v.Type()) |
| case Pointer: |
| if v.Elem().kind() != Array { |
| break |
| } |
| return func(yield func(Value) bool) { |
| v = v.Elem() |
| for i := range v.Len() { |
| if !yield(ValueOf(i)) { |
| return |
| } |
| } |
| } |
| case Array, Slice: |
| return func(yield func(Value) bool) { |
| for i := range v.Len() { |
| if !yield(ValueOf(i)) { |
| return |
| } |
| } |
| } |
| case String: |
| return func(yield func(Value) bool) { |
| for i := range v.String() { |
| if !yield(ValueOf(i)) { |
| return |
| } |
| } |
| } |
| case Map: |
| return func(yield func(Value) bool) { |
| i := v.MapRange() |
| for i.Next() { |
| if !yield(i.Key()) { |
| return |
| } |
| } |
| } |
| case Chan: |
| return func(yield func(Value) bool) { |
| for value, ok := v.Recv(); ok; value, ok = v.Recv() { |
| if !yield(value) { |
| return |
| } |
| } |
| } |
| } |
| panic("reflect: " + v.Type().String() + " cannot produce iter.Seq[Value]") |
| } |
|
|
| |
| |
| |
| |
| |
| func (v Value) Seq2() iter.Seq2[Value, Value] { |
| if canRangeFunc2(v.abiType()) { |
| return func(yield func(Value, Value) bool) { |
| rf := MakeFunc(v.Type().In(0), func(in []Value) []Value { |
| return []Value{ValueOf(yield(in[0], in[1]))} |
| }) |
| v.Call([]Value{rf}) |
| } |
| } |
| switch v.Kind() { |
| case Pointer: |
| if v.Elem().kind() != Array { |
| break |
| } |
| return func(yield func(Value, Value) bool) { |
| v = v.Elem() |
| for i := range v.Len() { |
| if !yield(ValueOf(i), v.Index(i)) { |
| return |
| } |
| } |
| } |
| case Array, Slice: |
| return func(yield func(Value, Value) bool) { |
| for i := range v.Len() { |
| if !yield(ValueOf(i), v.Index(i)) { |
| return |
| } |
| } |
| } |
| case String: |
| return func(yield func(Value, Value) bool) { |
| for i, v := range v.String() { |
| if !yield(ValueOf(i), ValueOf(v)) { |
| return |
| } |
| } |
| } |
| case Map: |
| return func(yield func(Value, Value) bool) { |
| i := v.MapRange() |
| for i.Next() { |
| if !yield(i.Key(), i.Value()) { |
| return |
| } |
| } |
| } |
| } |
| panic("reflect: " + v.Type().String() + " cannot produce iter.Seq2[Value, Value]") |
| } |
|
|