6
6
7
7
package reflect
8
8
9
- import "iter"
9
+ import (
10
+ "iter"
11
+ )
10
12
11
13
func rangeNum [T int8 | int16 | int32 | int64 | int |
12
14
uint8 | uint16 | uint32 | uint64 | uint |
13
- uintptr , N int64 | uint64 ](v N ) iter.Seq [Value ] {
15
+ uintptr , N int64 | uint64 ](num N , t Type ) iter.Seq [Value ] {
14
16
return func (yield func (v Value ) bool ) {
17
+ convert := t .PkgPath () != ""
15
18
// cannot use range T(v) because no core type.
16
- for i := T (0 ); i < T (v ); i ++ {
17
- if ! yield (ValueOf (i )) {
19
+ for i := T (0 ); i < T (num ); i ++ {
20
+ tmp := ValueOf (i )
21
+ // if the iteration value type is define by
22
+ // type T built-in type.
23
+ if convert {
24
+ tmp = tmp .Convert (t )
25
+ }
26
+ if ! yield (tmp ) {
18
27
return
19
28
}
20
29
}
@@ -40,27 +49,27 @@ func (v Value) Seq() iter.Seq[Value] {
40
49
// }
41
50
switch v .Kind () {
42
51
case Int :
43
- return rangeNum [int ](v .Int ())
52
+ return rangeNum [int ](v .Int (), v . Type () )
44
53
case Int8 :
45
- return rangeNum [int8 ](v .Int ())
54
+ return rangeNum [int8 ](v .Int (), v . Type () )
46
55
case Int16 :
47
- return rangeNum [int16 ](v .Int ())
56
+ return rangeNum [int16 ](v .Int (), v . Type () )
48
57
case Int32 :
49
- return rangeNum [int32 ](v .Int ())
58
+ return rangeNum [int32 ](v .Int (), v . Type () )
50
59
case Int64 :
51
- return rangeNum [int64 ](v .Int ())
60
+ return rangeNum [int64 ](v .Int (), v . Type () )
52
61
case Uint :
53
- return rangeNum [uint ](v .Uint ())
62
+ return rangeNum [uint ](v .Uint (), v . Type () )
54
63
case Uint8 :
55
- return rangeNum [uint8 ](v .Uint ())
64
+ return rangeNum [uint8 ](v .Uint (), v . Type () )
56
65
case Uint16 :
57
- return rangeNum [uint16 ](v .Uint ())
66
+ return rangeNum [uint16 ](v .Uint (), v . Type () )
58
67
case Uint32 :
59
- return rangeNum [uint32 ](v .Uint ())
68
+ return rangeNum [uint32 ](v .Uint (), v . Type () )
60
69
case Uint64 :
61
- return rangeNum [uint64 ](v .Uint ())
70
+ return rangeNum [uint64 ](v .Uint (), v . Type () )
62
71
case Uintptr :
63
- return rangeNum [uintptr ](v .Uint ())
72
+ return rangeNum [uintptr ](v .Uint (), v . Type () )
64
73
case Pointer :
65
74
if v .Elem ().Kind () != Array {
66
75
break
0 commit comments