forked from nytlabs/st-core
/
array_blocks.go
124 lines (118 loc) · 2.94 KB
/
array_blocks.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package core
// Head emits the first element of the inbound array
func Head() Spec {
return Spec{
Name: "head",
Inputs: []Pin{Pin{"in", ARRAY}},
Outputs: []Pin{Pin{"head", ANY}},
Kernel: func(in, out, internal MessageMap, s Source, i chan Interrupt) Interrupt {
arr, ok := in[0].([]interface{})
if !ok {
out[0] = NewError("head requires an array")
return nil
}
if len(arr) == 0 {
out[0] = NewError("zero length array passed to head")
return nil
}
out[0] = arr[0]
return nil
},
}
}
// Tail emits all the elements of an array except for the first
func Tail() Spec {
return Spec{
Name: "tail",
Inputs: []Pin{Pin{"in", ARRAY}},
Outputs: []Pin{Pin{"tail", ARRAY}},
Kernel: func(in, out, internal MessageMap, s Source, i chan Interrupt) Interrupt {
arr, ok := in[0].([]interface{})
if !ok {
out[0] = NewError("tail requires an array")
return nil
}
if len(arr) == 0 {
out[0] = NewError("zero length array passed to tail")
return nil
}
out[0] = arr[1:len(arr)]
return nil
},
}
}
// Last returns the last element of an array
func Last() Spec {
return Spec{
Name: "last",
Inputs: []Pin{Pin{"in", ARRAY}},
Outputs: []Pin{Pin{"last", ANY}},
Kernel: func(in, out, internal MessageMap, s Source, i chan Interrupt) Interrupt {
arr, ok := in[0].([]interface{})
if !ok {
out[0] = NewError("last requires an array")
return nil
}
if len(arr) == 0 {
out[0] = NewError("zero length array passed to last")
return nil
}
out[0] = arr[len(arr)-1]
return nil
},
}
}
// Init returns the all the elements of an array apart from the last one
func Init() Spec {
return Spec{
Name: "init",
Inputs: []Pin{Pin{"in", ARRAY}},
Outputs: []Pin{Pin{"init", ARRAY}},
Kernel: func(in, out, internal MessageMap, s Source, i chan Interrupt) Interrupt {
arr, ok := in[0].([]interface{})
if !ok {
out[0] = NewError("init requires an array")
return nil
}
if len(arr) == 0 {
out[0] = NewError("zero length array passed to init")
return nil
}
out[0] = arr[0 : len(arr)-1]
return nil
},
}
}
// Append appends the supplied element to the supplied array
func Append() Spec {
return Spec{
Name: "append",
Inputs: []Pin{Pin{"element", ANY}, Pin{"array", ARRAY}},
Outputs: []Pin{Pin{"array", ARRAY}},
Kernel: func(in, out, internal MessageMap, s Source, i chan Interrupt) Interrupt {
arr, ok := in[1].([]interface{})
if !ok {
out[0] = NewError("Append requires an array")
return nil
}
out[0] = append(arr, in[0])
return nil
},
}
}
func Len() Spec {
return Spec{
Name: "len",
Inputs: []Pin{Pin{"in", ARRAY}},
Outputs: []Pin{Pin{"out", NUMBER}},
Kernel: func(in, out, internal MessageMap, s Source, i chan Interrupt) Interrupt {
arr, ok := in[0].([]interface{})
if !ok {
out[0] = NewError("len requires an array")
return nil
}
out[0] = float64(len(arr))
return nil
},
}
}