-
Notifications
You must be signed in to change notification settings - Fork 14
/
43.go
83 lines (75 loc) · 1.46 KB
/
43.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main
import . "fmt"
type Sequence interface {
Next() (interface{}, Sequence)
}
type List struct { int; *List }
type SliceList []int
func main() {
Range([]int{0, 2, 4, 6, 8}, print_cell)
Range([]int{0, 2, 4, 6, 8}, func(i, v interface{}) {
Printf("%v: %v\n", i, v)
})
Range(NewList(0, 2, 4, 6, 8), print_cell)
Range(NewList(0, 2, 4, 6, 8), func(i, v interface{}) {
Printf("%v: %v\n", i, v)
})
Range(SliceList{0, 2, 4, 6, 8}, print_cell)
Range(SliceList{0, 2, 4, 6, 8}, func(i, v interface{}) {
Printf("%v: %v\n", i, v)
})
}
func print_cell(i, v int) {
Printf("%v: %v\n", i, v)
}
func NewList(s ...int) (r *List) {
for i := len(s) - 1; i > -1; i-- {
r = &List{ s[i], r }
}
return
}
func (l *List) Next() (v interface{}, r Sequence) {
if l != nil {
v = l.int
r = l.List
}
return
}
func (s SliceList) Next() (v interface{}, r Sequence) {
if len(s) > 0 {
v = s[0]
r = s[1:]
}
return
}
func Range(s, f interface{}) {
switch s := s.(type) {
case Sequence:
if s != nil {
i := 0
switch f := f.(type) {
case func(int, int):
for v, r := s.Next(); r != nil; v, r = r.Next() {
f(i, v.(int))
i++
}
case func(interface{}, interface{}):
for v, r := s.Next(); r != nil; v, r = r.Next() {
f(i, v)
i++
}
}
}
case []int:
switch f := f.(type) {
case func(int, int):
for i, v := range s {
f(i, v)
}
case func(interface{}, interface{}):
for i, v := range s {
f(i, v)
}
}
}
}