@platforma-sdk/workflow-tengo 2.8.4 → 2.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/tengo/lib/assets.lib.tengo +6 -0
  2. package/dist/tengo/lib/constants.lib.tengo +3 -0
  3. package/dist/tengo/lib/exec.R.lib.tengo +8 -0
  4. package/dist/tengo/lib/exec.internal.lib.tengo +12 -0
  5. package/dist/tengo/lib/exec.lib.tengo +67 -0
  6. package/dist/tengo/lib/exec.package.lib.tengo +9 -0
  7. package/dist/tengo/lib/exec.python.internal.lib.tengo +1 -0
  8. package/dist/tengo/lib/exec.python.lib.tengo +8 -0
  9. package/dist/tengo/lib/exec.runcmd.lib.tengo +19 -0
  10. package/dist/tengo/lib/exec.runenv.lib.tengo +4 -0
  11. package/dist/tengo/lib/exec.stream.lib.tengo +4 -0
  12. package/dist/tengo/lib/file.internal.lib.tengo +7 -0
  13. package/dist/tengo/lib/file.lib.tengo +3 -0
  14. package/dist/tengo/lib/ll.lib.tengo +24 -0
  15. package/dist/tengo/lib/maps.lib.tengo +8 -0
  16. package/dist/tengo/lib/objects.lib.tengo +2 -0
  17. package/dist/tengo/lib/oop.lib.tengo +3 -0
  18. package/dist/tengo/lib/path.lib.tengo +9 -0
  19. package/dist/tengo/lib/pframes.constants.lib.tengo +3 -0
  20. package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +5 -0
  21. package/dist/tengo/lib/pframes.lib.tengo +5 -0
  22. package/dist/tengo/lib/pframes.ll.lib.tengo +2 -0
  23. package/dist/tengo/lib/pframes.pcolumn.lib.tengo +4 -0
  24. package/dist/tengo/lib/pframes.spec.lib.tengo +26 -0
  25. package/dist/tengo/lib/pframes.util.lib.tengo +134 -0
  26. package/dist/tengo/lib/pframes.xsv.lib.tengo +12 -0
  27. package/dist/tengo/lib/render.lib.tengo +10 -0
  28. package/dist/tengo/lib/sets.lib.tengo +7 -0
  29. package/dist/tengo/lib/slices.lib.tengo +11 -0
  30. package/dist/tengo/lib/smart.lib.tengo +113 -0
  31. package/dist/tengo/lib/test.lib.tengo +32 -0
  32. package/dist/tengo/lib/tpl.lib.tengo +68 -0
  33. package/dist/tengo/lib/tpl.state-await.lib.tengo +14 -0
  34. package/dist/tengo/lib/tpl.util.lib.tengo +5 -0
  35. package/dist/tengo/lib/validation.lib.tengo +44 -0
  36. package/dist/tengo/lib/workdir.lib.tengo +22 -0
  37. package/dist/tengo/lib/workdir.proc.lib.tengo +18 -0
  38. package/dist/tengo/lib/workdir.save.lib.tengo +17 -0
  39. package/dist/tengo/lib/workflow.bobject.lib.tengo +5 -0
  40. package/dist/tengo/lib/workflow.bquery.lib.tengo +25 -0
  41. package/dist/tengo/lib/workflow.constants.lib.tengo +1 -0
  42. package/dist/tengo/lib/workflow.context.lib.tengo +5 -0
  43. package/dist/tengo/lib/workflow.lib.tengo +39 -0
  44. package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
  45. package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
  46. package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
  47. package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
  48. package/dist/tengo/tpl/pframes.aggregate.plj.gz +0 -0
  49. package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
  50. package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
  51. package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
  52. package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
  53. package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
  54. package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
  55. package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
  56. package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
  57. package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
  58. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
 
2
2
 
3
3
 
4
+
4
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
5
6
  oop := import("@platforma-sdk/workflow-tengo:oop")
6
7
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -11,18 +12,21 @@ constants := import("@platforma-sdk/workflow-tengo:pframes.constants")
11
12
 
12
13
 
13
14
 
15
+
14
16
  exportFrame := func(pf) {
15
17
  return render.createEphemeral(assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-pframe"), { pf: pf }).output("result")
16
18
  }
17
19
 
18
20
 
19
21
 
22
+
20
23
  exportColumnData := func(data) {
21
24
  return render.createEphemeral(assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.export-single-pcolumn"), { data: data }).output("result")
22
25
  }
23
26
 
24
27
 
25
28
 
29
+
26
30
  pFrameBuilder := func() {
27
31
  r := smart.structBuilder(constants.RTYPE_P_FRAME)
28
32
 
@@ -48,6 +52,7 @@ return self
48
52
 
49
53
 
50
54
 
55
+
51
56
  pColumnResourceMapDataBuilder := func(keyLength) {
52
57
  ll.panic("pframes.pColumnResourceMapDataBuilder is not supported any more; use pcolumn.resourceMapBuilder")
53
58
  }
@@ -1,6 +1,7 @@
1
1
 
2
2
 
3
3
 
4
+
4
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
5
6
  assets := import("@platforma-sdk/workflow-tengo:assets")
6
7
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -53,6 +54,7 @@ llAggTpl := assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.aggrega
53
54
 
54
55
 
55
56
 
57
+
56
58
 
57
59
 
58
60
  aggregate := func(data, indices, bodyTpl, outputs, isEph, ...extra) {
@@ -1,6 +1,7 @@
1
1
 
2
2
 
3
3
 
4
+
4
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
5
6
  oop := import("@platforma-sdk/workflow-tengo:oop")
6
7
  json := import("json")
@@ -9,6 +10,7 @@ constants := import("@platforma-sdk/workflow-tengo:pframes.constants")
9
10
 
10
11
 
11
12
 
13
+
12
14
  isResourceMap := func(r) {
13
15
  return smart.isResource(r) && r.info().Type.Name == constants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP.Name
14
16
  }
@@ -17,6 +19,7 @@ return smart.isResource(r) && r.info().Type.Name == constants.RTYPE_P_COLUMN_DAT
17
19
 
18
20
 
19
21
 
22
+
20
23
  resourceMapBuilder := func(keyLength) {
21
24
  r := smart.structBuilder(
22
25
  constants.RTYPE_P_COLUMN_DATA_RESOURCE_MAP,
@@ -46,6 +49,7 @@ return self
46
49
 
47
50
 
48
51
 
52
+
49
53
  fromMap := func(map, keyLength, keyParser) {
50
54
  b := resourceMapBuilder(keyLength)
51
55
 
@@ -3,13 +3,18 @@
3
3
 
4
4
 
5
5
 
6
+
6
7
  ll := import("@platforma-sdk/workflow-tengo:ll")
7
8
  maps := import("@platforma-sdk/workflow-tengo:maps")
8
9
  validation := import("@platforma-sdk/workflow-tengo:validation")
9
10
  json := import("json")
10
11
 
11
12
 
13
+
14
+
15
+
12
16
  P_AXIS_SPEC_SCHEMA := {
17
+
13
18
  `type`: `string,regex=Int|Long|Float|Double|String`,
14
19
  `name`: `string`,
15
20
  `domain,?`: { any: `string` },
@@ -18,6 +23,7 @@ P_AXIS_SPEC_SCHEMA := {
18
23
  }
19
24
 
20
25
  P_COLUMN_SPEC_SCHEMA := {
26
+
21
27
  `kind`: `string,regex=PColumn`,
22
28
  `valueType`: `string`,
23
29
  `name`: `string`,
@@ -30,12 +36,24 @@ P_COLUMN_SPEC_SCHEMA := {
30
36
  KIND_P_COLUMN := "PColumn"
31
37
 
32
38
 
39
+
40
+
41
+
42
+
33
43
  N_LABEL := "pl7.app/label"
34
44
 
35
45
 
46
+
47
+
48
+
49
+
36
50
  D_BLOCK := "pl7.app/block"
37
51
 
38
52
 
53
+
54
+
55
+
56
+
39
57
  A_LABEL := "pl7.app/label"
40
58
 
41
59
 
@@ -47,9 +65,13 @@ A_LABEL := "pl7.app/label"
47
65
 
48
66
 
49
67
 
68
+
50
69
  A_TRACE := "pl7.app/trace"
51
70
 
52
71
 
72
+
73
+
74
+
53
75
  _TRACE_STEP_SCHEMA := {
54
76
  `type`: `string`,
55
77
  `label`: `string`,
@@ -65,7 +87,9 @@ _TRACE_SCHEMA := [_TRACE_STEP_SCHEMA]
65
87
 
66
88
 
67
89
 
90
+
68
91
  makeTrace := func(input, ...steps) {
92
+
69
93
  validation.assertJsonSchema(steps, _TRACE_SCHEMA)
70
94
 
71
95
  currentTraceContent := undefined
@@ -80,6 +104,7 @@ currentTraceContent = input["annotations"][A_TRACE]
80
104
  currentTrace := []
81
105
  if !is_undefined(currentTraceContent) {
82
106
  currentTrace = json.decode(currentTraceContent)
107
+
83
108
  validation.assertJsonSchema(currentTrace, _TRACE_SCHEMA)
84
109
  }
85
110
 
@@ -89,6 +114,7 @@ currentTraceStr := string(json.encode(currentTrace))
89
114
  return ll.toStrict({
90
115
  value: currentTrace,
91
116
  valueStr: currentTraceStr,
117
+
92
118
  inject: func(spec) {
93
119
  validation.assertJsonSchema(spec, P_COLUMN_SPEC_SCHEMA)
94
120
  return maps.deepMerge(spec, {annotations: {"pl7.app/trace": currentTraceStr}})
@@ -4,86 +4,217 @@ objects := import("@platforma-sdk/workflow-tengo:objects")
4
4
 
5
5
  _PRE_PROCESS_STEP_SCHEMA := [`or`,
6
6
  {
7
+
8
+
7
9
  `type`: `string,regex=regexpReplace`,
10
+
11
+
12
+
13
+
8
14
  `pattern`: `string`,
15
+
16
+
17
+
9
18
  `replacement`: `string`
10
19
  },
11
20
  {
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
12
35
  `type`: `string,regex=regexpExtract`,
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
13
47
  `pattern`: `string`
14
48
  }]
15
49
 
16
50
  _SPEC_AXES_SCHEMA := {
51
+
17
52
  `column`: `string`,
53
+
54
+
55
+
18
56
  `filterOutRegex,?`: `string`,
57
+
19
58
  `preProcess,?`: [_PRE_PROCESS_STEP_SCHEMA],
59
+
60
+
61
+
62
+
20
63
  `naRegex,?`: `string`,
64
+
65
+
21
66
  `allowNA,?`: `bool`,
67
+
22
68
  `spec`: {
69
+
23
70
  `type`: `string,regex=Int|Long|Float|Double|String`,
71
+
72
+
24
73
  `name,?`: `string`,
74
+
75
+
25
76
  `domain,?`: { any: `string` },
77
+
78
+
26
79
  `annotations,?`: { any: `string` },
80
+
81
+
27
82
  `parentAxes,?`: [`number`]
28
83
  }
29
84
  }
30
85
 
31
86
  _SPEC_COLUMN_SCHEMA := {
87
+
32
88
  `column`: `string`,
89
+
90
+
91
+
33
92
  `filterOutRegex,?`: `string`,
93
+
34
94
  `preProcess,?`: [_PRE_PROCESS_STEP_SCHEMA],
95
+
96
+
97
+
98
+
35
99
  `naRegex,?`: `string`,
100
+
101
+
36
102
  `allowNA,?`: `bool`,
103
+
104
+
37
105
  `id,?`: `string`,
106
+
38
107
  `spec`: {
108
+
39
109
  `valueType`: `string,regex=Int|Long|Float|Double|String`,
110
+
111
+
40
112
  `name,?`: `string`,
113
+
114
+
41
115
  `domain,?`: { any: `string` },
116
+
117
+
42
118
  `annotations,?`: { any: `string` },
119
+
120
+
43
121
  `parentAxes,?`: [ `number` ]
44
122
  }
45
123
  }
46
124
 
47
125
  _SPEC_INDEX_SCHEMA := {
126
+
48
127
  `name`: `string`,
128
+
129
+
49
130
  `domain,?`: { any: `string` },
131
+
132
+
50
133
  `annotations,?`: { any: `string` },
134
+
135
+
51
136
  `parentAxes,?`: [`number`]
52
137
  }
53
138
 
54
139
  PFCONV_IMPORT_CFG_SCHEMA := {
140
+
141
+
55
142
  `separator,?`: `string`,
143
+
144
+
56
145
  `commentLinePrefix,?`: `string`,
146
+
147
+
57
148
  `skipEmptyLines,?`: `bool`,
149
+
150
+
58
151
  `allowColumnLabelDuplicates,?`: `bool`,
152
+
153
+
59
154
  `axes`: [_SPEC_AXES_SCHEMA],
155
+
156
+
60
157
  `index,?`: _SPEC_INDEX_SCHEMA,
158
+
61
159
  `columns`: [_SPEC_COLUMN_SCHEMA],
160
+
161
+
162
+
62
163
  `allowArtificialColumns,?`: `bool`,
164
+
165
+
63
166
  `columnNamePrefix,?`: `string`,
167
+
168
+
64
169
  `storageFormat,?` : `string,regex=Binary|Json`,
170
+
171
+
65
172
  `partitionKeyLength,?` : `number`
66
173
  }
67
174
 
68
175
  _COLUMN_FILTER_SCHEMA := {
176
+
177
+
69
178
  `type,?`: `string,regex=Int|Long|Float|Double|String|Bytes`,
179
+
180
+
70
181
  `name,?`: `string`,
182
+
183
+
71
184
  `domainValue,?`: { any: `string` },
185
+
186
+
72
187
  `annotationValue,?`: { any: `string` },
188
+
189
+
73
190
  `annotationPattern,?`: { any: `string` }
74
191
  }
75
192
 
76
193
  PFCONV_EXPORT_CFG_SCHEMA := {
194
+
195
+
77
196
  `naStr,?`: `string`,
197
+
198
+
78
199
  `nullStr,?`: `string`,
200
+
201
+
79
202
  `exportBytes,?`: `bool`,
203
+
204
+
80
205
  `separator,?`: `string`,
206
+
207
+
81
208
  `columnSelector,?`: [_COLUMN_FILTER_SCHEMA],
209
+
210
+
211
+
82
212
  `joinType,?`: `string,regex=Full|Inner`
83
213
  }
84
214
 
85
215
 
86
216
 
217
+
87
218
  xsvColumnId := func(c) {
88
219
  id := c.id
89
220
  if is_undefined(id) {
@@ -94,6 +225,7 @@ return id
94
225
 
95
226
 
96
227
 
228
+
97
229
  purifySpec := func(spec) {
98
230
  newSpec := copy(spec)
99
231
 
@@ -150,6 +282,7 @@ return newSpec
150
282
 
151
283
 
152
284
 
285
+
153
286
 
154
287
 
155
288
  decomposePfconvImportCfg := func(cfg, ...ops) {
@@ -171,6 +304,7 @@ id := xsvColumnId(column)
171
304
  ll.assert(is_undefined(columnsSpec[id]), "repeated column spec id in pfconv cfg: %v", id)
172
305
  columnsSpec[id] = column.spec
173
306
  columnsSpec[id].axesSpec = axesSpec
307
+
174
308
  columnsSpec[id].kind = "PColumn"
175
309
  }
176
310
 
@@ -1,6 +1,7 @@
1
1
 
2
2
 
3
3
 
4
+
4
5
  validation := import("@platforma-sdk/workflow-tengo:validation")
5
6
  constants := import("@platforma-sdk/workflow-tengo:pframes.constants")
6
7
  objects := import("@platforma-sdk/workflow-tengo:objects")
@@ -17,6 +18,7 @@ pfconvSw := assets.importSoftware("@milaboratories/software-pframes-conv:main")
17
18
 
18
19
 
19
20
 
21
+
20
22
  getAxesSpec := func(spec) {
21
23
  axes := []
22
24
  for ax in spec.axes {
@@ -77,6 +79,7 @@ return objects.deleteUndefined(spec)
77
79
 
78
80
 
79
81
 
82
+
80
83
 
81
84
 
82
85
  importFile := func(xsvFile, xsvType, spec, ...ops) {
@@ -94,6 +97,7 @@ tops := ops.transpose
94
97
 
95
98
  transposedFileName := "fileTransposed." + xsvType
96
99
 
100
+
97
101
  transposeXsv := exec.builder().
98
102
  software(transposeXsvSw).
99
103
  printErrStreamToStdout().
@@ -137,10 +141,13 @@ run()
137
141
  xsvFile = transposeXsv.getFile(transposedFileName)
138
142
  }
139
143
 
144
+
140
145
  importDirTpl := assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.import-dir")
141
146
 
147
+
142
148
  pureSpec := util.purifySpec(spec)
143
149
 
150
+
144
151
  pfconv := exec.builder().
145
152
  software(pfconvSw).
146
153
  printErrStreamToStdout().
@@ -154,6 +161,7 @@ writeFile("spec.json", json.encode(pureSpec)).
154
161
  processWorkdir("pf", importDirTpl, pureSpec).
155
162
  run()
156
163
 
164
+
157
165
  pf := pfconv.getProcessorResult("pf")
158
166
  if ops.dataOnly {
159
167
  return pf
@@ -205,6 +213,7 @@ return result
205
213
 
206
214
 
207
215
 
216
+
208
217
 
209
218
 
210
219
  importFileMap := func(xsvMap, xsvType, spec, ...ops) {
@@ -218,6 +227,7 @@ additionalAxesSpec: [],
218
227
  transpose: undefined
219
228
  }, ops...)
220
229
 
230
+
221
231
  decomposedSpec := util.decomposePfconvImportCfg(spec, { additionalAxesSpec: ops.additionalAxesSpec })
222
232
  pureSpec := decomposedSpec.purifiedCfg
223
233
  columnsSpec := decomposedSpec.columnsSpec
@@ -259,11 +269,13 @@ return result
259
269
 
260
270
 
261
271
 
272
+
262
273
  exportFrame := func(pf, xsvType, params) {
263
274
  exportPfTpl := assets.importTemplate("@platforma-sdk/workflow-tengo:pframes.xsv-export-pframe")
264
275
 
265
276
  if is_array(pf) {
266
277
 
278
+
267
279
  pfm := {}
268
280
  i := 0
269
281
  for col in pf {
@@ -1,6 +1,7 @@
1
1
 
2
2
 
3
3
 
4
+
4
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
5
6
  assets := import("@platforma-sdk/workflow-tengo:assets")
6
7
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -20,8 +21,10 @@ _SUBSCRIPTION_FIELD := "subscription"
20
21
 
21
22
 
22
23
 
24
+
23
25
  createUniversal := func(tpl, isEph, inputs) {
24
26
 
27
+
25
28
  rbuilder := undefined
26
29
  if isEph {
27
30
  rbuilder = smart.ephemeralBuilder(constants.RTYPE_RENDER_EPH_TEMPLATE)
@@ -30,17 +33,21 @@ rbuilder = smart.structBuilder(constants.RTYPE_RENDER_TEMPLATE)
30
33
  }
31
34
 
32
35
  if isEph {
36
+
33
37
  rbuilder.createField(_SUBSCRIPTION_FIELD, "OTW")
34
38
  }
35
39
 
40
+
36
41
  rbuilder.createInputField(tplutil.TEMPLATE_FIELD).set(tpl)
37
42
 
43
+
38
44
  inputsMap := isEph ? smart.ephemeralMapBuilder() : smart.mapBuilder()
39
45
  for name, value in inputs {
40
46
  inputsMap.add(name, value)
41
47
  }
42
48
 
43
49
  rbuilder.createInputField(tplutil.INPUTS_MAP_FIELD).set(inputsMap.build())
50
+
44
51
  renderer := rbuilder.lockInputsAndBuild()
45
52
 
46
53
  self := undefined
@@ -48,6 +55,7 @@ self = ll.toStrict(oop.inherit(renderer, {
48
55
 
49
56
 
50
57
 
58
+
51
59
  output: func(name, ...cache) {
52
60
  ll.assert(len(cache) == 0 || is_int(cache[0]), "cache should be a number (use 'times' tengo library), got: %v", cache)
53
61
  out := renderer.getFutureOutputField(tplutil.TEMPLATE_OUTPUT_PREFIX + name, isEph)
@@ -69,6 +77,7 @@ return self
69
77
 
70
78
 
71
79
 
80
+
72
81
  create := func(tpl, inputs) {
73
82
  return createUniversal(tpl, false, inputs)
74
83
  }
@@ -79,6 +88,7 @@ return createUniversal(tpl, false, inputs)
79
88
 
80
89
 
81
90
 
91
+
82
92
  createEphemeral := func(tpl, inputs) {
83
93
  return createUniversal(tpl, true, inputs)
84
94
  }
@@ -3,6 +3,7 @@
3
3
 
4
4
 
5
5
 
6
+
6
7
  ll := import("@platforma-sdk/workflow-tengo:ll")
7
8
  maps := import("@platforma-sdk/workflow-tengo:maps")
8
9
 
@@ -11,6 +12,7 @@ maps := import("@platforma-sdk/workflow-tengo:maps")
11
12
 
12
13
 
13
14
 
15
+
14
16
  fromSlice := func(slice) {
15
17
  set := {}
16
18
  for _, elem in slice {
@@ -24,6 +26,7 @@ return set
24
26
 
25
27
 
26
28
 
29
+
27
30
  toSlice := func(set) {
28
31
  sl := []
29
32
  for v, _ in set {
@@ -38,6 +41,7 @@ return sl
38
41
 
39
42
 
40
43
 
44
+
41
45
  hasElement := func(set, element) {
42
46
  return !is_undefined(set[element])
43
47
  }
@@ -48,6 +52,7 @@ return !is_undefined(set[element])
48
52
 
49
53
 
50
54
 
55
+
51
56
  add := func(set, ...elements) {
52
57
  for _, elem in elements {
53
58
  set[elem] = true
@@ -61,6 +66,7 @@ return set
61
66
 
62
67
 
63
68
 
69
+
64
70
  fromMapKeys := func(map) {
65
71
  keys := maps.getKeys(map)
66
72
  return fromSlice(keys)
@@ -72,6 +78,7 @@ return fromSlice(keys)
72
78
 
73
79
 
74
80
 
81
+
75
82
  map := func(set, fn) {
76
83
  return maps.mapKeys(set, fn)
77
84
  }
@@ -7,6 +7,7 @@ enum := import("enum")
7
7
 
8
8
 
9
9
 
10
+
10
11
  length := func(slice) {
11
12
  if is_undefined(slice) {
12
13
  return 0
@@ -23,6 +24,7 @@ return len(slice)
23
24
 
24
25
 
25
26
 
27
+
26
28
  slice := func(array, from, to) {
27
29
  len := length(array)
28
30
  if from < 0 {
@@ -42,6 +44,7 @@ return array[from:to]
42
44
 
43
45
 
44
46
 
47
+
45
48
  safeAppend := func(slice, ...toAppend) {
46
49
  if is_undefined(slice) {
47
50
  slice = []
@@ -59,6 +62,7 @@ return append(slice, toAppend...)
59
62
 
60
63
 
61
64
 
65
+
62
66
  findElement := func(slice, element) {
63
67
  for i, elem in slice {
64
68
  if elem == element {
@@ -75,6 +79,7 @@ return -1
75
79
 
76
80
 
77
81
 
82
+
78
83
  hasElement := func(slice, element) {
79
84
  return findElement(slice, element) != -1
80
85
  }
@@ -85,6 +90,7 @@ return findElement(slice, element) != -1
85
90
 
86
91
 
87
92
 
93
+
88
94
  removeElement := func(slice, i) {
89
95
  return safeAppend(slice[:i], slice[i+1:]...)
90
96
  }
@@ -95,6 +101,7 @@ return safeAppend(slice[:i], slice[i+1:]...)
95
101
 
96
102
 
97
103
 
104
+
98
105
  filter := func(slice, predicateFn) {
99
106
  newS := []
100
107
  for _, elem in slice {
@@ -112,6 +119,7 @@ return newS
112
119
 
113
120
 
114
121
 
122
+
115
123
  map := func(slice, fn) {
116
124
  newS := []
117
125
  for _, elem in slice {
@@ -130,6 +138,7 @@ return newS
130
138
 
131
139
 
132
140
 
141
+
133
142
  reduce := func(slice, fn) {
134
143
  result := undefined
135
144
  for i, elem in slice {
@@ -150,6 +159,7 @@ return result
150
159
 
151
160
 
152
161
 
162
+
153
163
  sortByFn := func(notSortedSlice, fn) {
154
164
  s := copy(notSortedSlice)
155
165
 
@@ -171,6 +181,7 @@ return s
171
181
 
172
182
 
173
183
 
184
+
174
185
  fromSet := func(set) {
175
186
  slice := enum.map(set, func(k, _) { return k })
176
187
  return sortByFn(slice, func(elem) { return elem })