fez-lisp 1.5.145 → 1.5.147

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.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "fez-lisp",
3
3
  "description": "Lisp interpreted & compiled to JavaScript",
4
4
  "author": "AT290690",
5
- "version": "1.5.145",
5
+ "version": "1.5.147",
6
6
  "type": "module",
7
7
  "main": "index.js",
8
8
  "keywords": [
package/src/check.js CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  VALUE,
18
18
  WORD
19
19
  } from './keywords.js'
20
- import { isLeaf } from './parser.js'
20
+ import { isLeaf, LISP } from './parser.js'
21
21
  import {
22
22
  SPECIAL_FORM_TYPES,
23
23
  toTypeNames,
@@ -304,7 +304,7 @@ export const isAtomType = (stats) =>
304
304
  isAnyType(stats) || stats[TYPE_PROP][0] === ATOM
305
305
  export const isAtomReturn = (stats) =>
306
306
  isAnyType(stats) || stats[RETURNS][0] === ATOM
307
- export const equalsTypes = (a, b) => {
307
+ export const equalTypes = (a, b) => {
308
308
  const isAnyAny = isAnyType(a) || isAnyType(b)
309
309
  if (isAnyAny) return true
310
310
  const isSameType = a[TYPE_PROP][0] === b[TYPE_PROP][0]
@@ -312,7 +312,7 @@ export const equalsTypes = (a, b) => {
312
312
  return true
313
313
  }
314
314
 
315
- export const equalsReturns = (a, b) =>
315
+ export const equalReturns = (a, b) =>
316
316
  isAnyReturn(a) || isAnyReturn(b) || a[RETURNS][0] === b[RETURNS][0]
317
317
  export const equalsTypeWithReturn = (a, b) =>
318
318
  isAnyType(a) || isAnyReturn(b) || a[TYPE_PROP][0] === b[RETURNS][0]
@@ -338,6 +338,39 @@ const notABooleanType = (a, b) => {
338
338
  (hasSubType(b) && getSubType(a).difference(getSubType(b)).size !== 0))
339
339
  )
340
340
  }
341
+ const equalSubTypes = (a, b) => {
342
+ return (
343
+ !hasSubType(a) ||
344
+ !hasSubType(b) ||
345
+ getSubType(a).has(UNKNOWN) ||
346
+ getSubType(b).has(UNKNOWN) ||
347
+ getSubType(a).has(ANY) ||
348
+ getSubType(b).has(ANY) ||
349
+ getSubType(a).difference(getSubType(b)).size === 0
350
+ )
351
+ }
352
+ const eualSubReturn = (a, b) => {
353
+ return (
354
+ !hasSubReturn(a) ||
355
+ !hasSubReturn(b) ||
356
+ getSubReturn(a).has(UNKNOWN) ||
357
+ getSubReturn(b).has(UNKNOWN) ||
358
+ getSubReturn(a).has(ANY) ||
359
+ getSubReturn(b).has(ANY) ||
360
+ getSubReturn(a).difference(getSubReturn(b)).size === 0
361
+ )
362
+ }
363
+ const equalSubTypesWithSubReturn = (a, b) => {
364
+ return (
365
+ !hasSubType(a) ||
366
+ !hasSubReturn(b) ||
367
+ getSubType(a).has(UNKNOWN) ||
368
+ getSubReturn(b).has(UNKNOWN) ||
369
+ getSubType(a).has(ANY) ||
370
+ getSubReturn(b).has(ANY) ||
371
+ getSubType(a).difference(getSubReturn(b)).size === 0
372
+ )
373
+ }
341
374
  const notABooleanTypeWithReturn = (a, b) => {
342
375
  return (
343
376
  hasSubType(a) &&
@@ -498,7 +531,6 @@ const IfApplyBranch = ({ leaf, branch, re, prop, ref, env }) => {
498
531
  }
499
532
  }
500
533
  const ifExpression = ({ re, env, ref, prop }) => {
501
- // console.log(ref, JSON.stringify(env[KEYWORDS.IF][STATS][RETURNS]))
502
534
  if (re[0][TYPE] === ATOM || re[1][TYPE] === ATOM)
503
535
  return setPropToAtom(ref[STATS], prop)
504
536
  // TODO check that both brancehs are predicates if one is
@@ -669,7 +701,7 @@ const initArrayType = ({ rem, env }) => {
669
701
  ? env[x[VALUE]]
670
702
  ? getTypes(env[x[VALUE]][STATS])
671
703
  : [UNKNOWN]
672
- : [x[TYPE]]
704
+ : [x[TYPE], x[TYPE] === ATOM ? NUMBER_SUBTYPE() : new Set([UNKNOWN])]
673
705
  : env[x[0][VALUE]]
674
706
  ? getReturns(env[x[0][VALUE]][STATS])
675
707
  : [UNKNOWN]
@@ -688,7 +720,7 @@ const initArrayType = ({ rem, env }) => {
688
720
  } else
689
721
  return {
690
722
  [TYPE_PROP]: [APPLY],
691
- [RETURNS]: [COLLECTION, new Set([])]
723
+ [RETURNS]: [COLLECTION, new Set([UNKNOWN])]
692
724
  }
693
725
  }
694
726
  const resolveReturnType = ({
@@ -848,7 +880,6 @@ const checkReturnType = ({ exp, stack, name, env, check }) => {
848
880
  })
849
881
  }
850
882
  const stagger = (stack, method, data, fn) => {
851
- // console.log(data[0], data[1])
852
883
  stack[method]({ data, fn })
853
884
  }
854
885
  export const typeCheck = (ast) => {
@@ -877,7 +908,7 @@ export const typeCheck = (ast) => {
877
908
  exp
878
909
  )}) (check #16)`
879
910
  )
880
- else if (notABooleanTypeWithReturn(expected, actual)) {
911
+ else if (!equalSubTypesWithSubReturn(expected, actual)) {
881
912
  throw new TypeError(
882
913
  `Incorrect type of argument (${i}) for (${
883
914
  first[VALUE]
@@ -929,7 +960,7 @@ export const typeCheck = (ast) => {
929
960
  if (
930
961
  !isUnknownReturn(expected[STATS]) &&
931
962
  !isUnknownReturn(actual[STATS]) &&
932
- !equalsReturns(expected[STATS], actual[STATS])
963
+ !equalReturns(expected[STATS], actual[STATS])
933
964
  )
934
965
  throw new TypeError(
935
966
  `Incorrect return type for (${
@@ -970,7 +1001,7 @@ export const typeCheck = (ast) => {
970
1001
  if (
971
1002
  !isUnknownType(actual[STATS]) &&
972
1003
  !isUnknownType(expected[STATS]) &&
973
- !equalsTypes(actual[STATS], expected[STATS])
1004
+ !equalTypes(actual[STATS], expected[STATS])
974
1005
  )
975
1006
  throw new TypeError(
976
1007
  `Incorrect type for (${
@@ -1137,8 +1168,8 @@ export const typeCheck = (ast) => {
1137
1168
  [SIGNATURE]: name,
1138
1169
  retried: 0,
1139
1170
  counter: 0,
1140
- [TYPE_PROP]: [ATOM],
1141
- [RETURNS]: [ATOM]
1171
+ [TYPE_PROP]: [ATOM, NUMBER_SUBTYPE()],
1172
+ [RETURNS]: [ATOM, NUMBER_SUBTYPE()]
1142
1173
  }
1143
1174
  }
1144
1175
  } else if (rightHand[0]) {
@@ -1266,6 +1297,10 @@ export const typeCheck = (ast) => {
1266
1297
  case STATIC_TYPES.BOOLEAN:
1267
1298
  case STATIC_TYPES.ANY:
1268
1299
  case STATIC_TYPES.NUMBER:
1300
+ case STATIC_TYPES.NUMBERS:
1301
+ case STATIC_TYPES.ABSTRACTIONS:
1302
+ case STATIC_TYPES.BOOLEANS:
1303
+ case STATIC_TYPES.COLLECTIONS:
1269
1304
  {
1270
1305
  const ret = isLeaf(rest[0]) ? rest[0] : rest[0][0]
1271
1306
  const ref = env[ret[VALUE]]
@@ -1397,10 +1432,15 @@ export const typeCheck = (ast) => {
1397
1432
  )
1398
1433
  }
1399
1434
  }
1400
- if (
1401
- isKnown &&
1402
- !equalsTypes(args[i][STATS], env[name][STATS])
1435
+ const eqTypes = equalTypes(
1436
+ args[i][STATS],
1437
+ env[name][STATS]
1438
+ )
1439
+ const eqSubTypes = equalSubTypes(
1440
+ args[i][STATS],
1441
+ env[name][STATS]
1403
1442
  )
1443
+ if (isKnown && !eqTypes)
1404
1444
  throw new TypeError(
1405
1445
  `Incorrect type of argument (${i}) for (${
1406
1446
  first[VALUE]
@@ -1410,11 +1450,7 @@ export const typeCheck = (ast) => {
1410
1450
  getType(env[name][STATS])
1411
1451
  )}) (${stringifyArgs(exp)}) (check #3)`
1412
1452
  )
1413
- else if (
1414
- isKnown &&
1415
- notABooleanType(args[i][STATS], env[name][STATS])
1416
- // TODO: Add a check if subtype is a UKNOWN (for uknown array)
1417
- )
1453
+ else if (isKnown && eqTypes && !eqSubTypes) {
1418
1454
  throw new TypeError(
1419
1455
  `Incorrect type of argument (${i}) for (${
1420
1456
  first[VALUE]
@@ -1424,6 +1460,7 @@ export const typeCheck = (ast) => {
1424
1460
  getTypes(env[name][STATS])
1425
1461
  )}) (${stringifyArgs(exp)}) (check #202)`
1426
1462
  )
1463
+ }
1427
1464
  }
1428
1465
  break
1429
1466
  case ATOM:
@@ -1510,7 +1547,7 @@ export const typeCheck = (ast) => {
1510
1547
  if (
1511
1548
  !isUnknownReturn(expected[STATS]) &&
1512
1549
  !isUnknownReturn(actual[STATS]) &&
1513
- !equalsReturns(expected[STATS], actual[STATS])
1550
+ !equalReturns(expected[STATS], actual[STATS])
1514
1551
  ) {
1515
1552
  throw new TypeError(
1516
1553
  `Incorrect return type for (${
@@ -1545,7 +1582,7 @@ export const typeCheck = (ast) => {
1545
1582
  if (
1546
1583
  !isUnknownType(actual[STATS]) &&
1547
1584
  !isUnknownType(expected[STATS]) &&
1548
- !equalsTypes(actual[STATS], expected[STATS])
1585
+ !equalTypes(actual[STATS], expected[STATS])
1549
1586
  )
1550
1587
  throw new TypeError(
1551
1588
  `Incorrect type for (${
@@ -1580,8 +1617,8 @@ export const typeCheck = (ast) => {
1580
1617
  // when it's a special form and it's not equal
1581
1618
  // or failed the boolean subtype case
1582
1619
  isSpecial &&
1583
- (!equalsTypes(args[i][STATS], env[name][STATS]) ||
1584
- !notABooleanType(args[i][STATS], env[name][STATS]))
1620
+ (!equalTypes(args[i][STATS], env[name][STATS]) ||
1621
+ !equalSubTypes(args[i][STATS], env[name][STATS]))
1585
1622
  )
1586
1623
  setType(env[name][STATS], args[i][STATS])
1587
1624
  else if (
@@ -1616,8 +1653,8 @@ export const typeCheck = (ast) => {
1616
1653
  if (isSpecial && name === KEYWORDS.IF) {
1617
1654
  const concequent = [...rest]
1618
1655
  const alternative = [...rest]
1619
- concequent[i] = rest[i][1]
1620
- alternative[i] = rest[i][2]
1656
+ concequent[i] = rest[i][2]
1657
+ alternative[i] = rest[i][3]
1621
1658
  check([first, ...concequent], env, scope)
1622
1659
  check([first, ...alternative], env, scope)
1623
1660
  }
package/src/compiler.js CHANGED
@@ -49,6 +49,10 @@ const keywordToHelper = (name) => {
49
49
  case STATIC_TYPES.BOOLEAN:
50
50
  case STATIC_TYPES.ANY:
51
51
  case STATIC_TYPES.NUMBER:
52
+ case STATIC_TYPES.NUMBERS:
53
+ case STATIC_TYPES.ABSTRACTIONS:
54
+ case STATIC_TYPES.BOOLEANS:
55
+ case STATIC_TYPES.COLLECTIONS:
52
56
  case DEBUG.ASSERT:
53
57
  case DEBUG.LOG:
54
58
  case DEBUG.STRING:
@@ -287,6 +291,10 @@ const comp = (tree, Drill) => {
287
291
  case STATIC_TYPES.BOOLEAN:
288
292
  case STATIC_TYPES.ANY:
289
293
  case STATIC_TYPES.NUMBER:
294
+ case STATIC_TYPES.NUMBERS:
295
+ case STATIC_TYPES.ABSTRACTIONS:
296
+ case STATIC_TYPES.BOOLEANS:
297
+ case STATIC_TYPES.COLLECTIONS:
290
298
  case DEBUG.ASSERT:
291
299
  case DEBUG.LOG:
292
300
  case DEBUG.STRING:
package/src/enhance.js CHANGED
@@ -1,5 +1,13 @@
1
1
  import { AST, isLeaf } from './parser.js'
2
- import { APPLY, ATOM, KEYWORDS, TYPE, VALUE, WORD } from './keywords.js'
2
+ import {
3
+ APPLY,
4
+ ATOM,
5
+ KEYWORDS,
6
+ STATIC_TYPES,
7
+ TYPE,
8
+ VALUE,
9
+ WORD
10
+ } from './keywords.js'
3
11
  import { getPrefix, shake, wrapInBlock } from './utils.js'
4
12
  import std from '../lib/baked/std.js'
5
13
  export const OPTIMIZATIONS = {
@@ -28,6 +36,22 @@ const opt = (ast) => {
28
36
  case APPLY:
29
37
  {
30
38
  switch (first[VALUE]) {
39
+ case STATIC_TYPES.ABSTRACTION:
40
+ case STATIC_TYPES.COLLECTION:
41
+ case STATIC_TYPES.UNKNOWN:
42
+ case STATIC_TYPES.ATOM:
43
+ case STATIC_TYPES.BOOLEAN:
44
+ case STATIC_TYPES.ANY:
45
+ case STATIC_TYPES.NUMBER:
46
+ case STATIC_TYPES.NUMBERS:
47
+ case STATIC_TYPES.ABSTRACTIONS:
48
+ case STATIC_TYPES.BOOLEANS:
49
+ case STATIC_TYPES.COLLECTIONS:
50
+ case STATIC_TYPES.AS_NUMBER:
51
+ exp.length = 0
52
+ for (let i = 0; i < rest.length; ++i) exp.push(...rest[i])
53
+ evaluate(exp)
54
+ break
31
55
  case KEYWORDS.DEFINE_VARIABLE:
32
56
  {
33
57
  const last = exp.at(-1)
@@ -833,11 +833,17 @@ export const keywords = {
833
833
  throw new Error(expression.map((x) => String.fromCharCode(x)).join(''))
834
834
  },
835
835
 
836
- [STATIC_TYPES.ABSTRACTION]: (args, env) => evaluate(args[0], env),
836
+ [STATIC_TYPES.UNKNOWN]: (args, env) => evaluate(args[0], env),
837
+ [STATIC_TYPES.ANY]: (args, env) => evaluate(args[0], env),
838
+
837
839
  [STATIC_TYPES.ATOM]: (args, env) => evaluate(args[0], env),
840
+ [STATIC_TYPES.ABSTRACTION]: (args, env) => evaluate(args[0], env),
838
841
  [STATIC_TYPES.COLLECTION]: (args, env) => evaluate(args[0], env),
842
+
839
843
  [STATIC_TYPES.BOOLEAN]: (args, env) => evaluate(args[0], env),
840
844
  [STATIC_TYPES.NUMBER]: (args, env) => evaluate(args[0], env),
841
- [STATIC_TYPES.UNKNOWN]: (args, env) => evaluate(args[0], env),
842
- [STATIC_TYPES.ANY]: (args, env) => evaluate(args[0], env)
845
+ [STATIC_TYPES.NUMBERS]: (args, env) => evaluate(args[0], env),
846
+ [STATIC_TYPES.COLLECTIONS]: (args, env) => evaluate(args[0], env),
847
+ [STATIC_TYPES.ABSTRACTIONS]: (args, env) => evaluate(args[0], env),
848
+ [STATIC_TYPES.BOOLEANS]: (args, env) => evaluate(args[0], env)
843
849
  }
package/src/keywords.js CHANGED
@@ -15,6 +15,11 @@ export const STATIC_TYPES = {
15
15
  ATOM: 'Atom',
16
16
  COLLECTION: 'Collection',
17
17
  BOOLEAN: 'Boolean',
18
+ NUMBERS: 'Numbers',
19
+ BOOLEANS: 'Booleans',
20
+ ABSTRACTIONS: 'Abstractions',
21
+ COLLECTIONS: 'Collections',
22
+ AS_NUMBER: 'numberp',
18
23
  ANY: 'Any'
19
24
  }
20
25
  export const KEYWORDS = {
@@ -104,10 +109,6 @@ export const MUTATORS_SET = new Set([
104
109
  'matrix:set-and-get!',
105
110
  'array:set-and-get!',
106
111
  'var:set-and-get!',
107
- 'map:set-and-get!',
108
- 'set:add-and-get!',
109
- 'set:add!',
110
- 'map:set!',
111
112
  'array:set!',
112
113
  'array:append!',
113
114
  'array:push!',
package/src/macros.js CHANGED
@@ -324,8 +324,11 @@ export const deSuggarAst = (ast, scope) => {
324
324
  break
325
325
  case KEYWORDS.DIVISION:
326
326
  if (!rest.length) {
327
- exp[0][TYPE] = ATOM
328
- exp[0][VALUE] = FALSE
327
+ exp[0][VALUE] = KEYWORDS.NOT
328
+ exp[1] = [
329
+ [APPLY, KEYWORDS.NOT],
330
+ [ATOM, FALSE]
331
+ ]
329
332
  } else if (rest.length === 1) {
330
333
  exp.length = 1
331
334
  exp.push([ATOM, 1], rest[0])
package/src/types.js CHANGED
@@ -33,10 +33,12 @@ export const FALSE_WORD = 'false'
33
33
  export const BOOLEAN_SUBTYPE = () => new Set([BOOLEAN])
34
34
  export const COLLECTION_SUBTYPE = () => new Set([COLLECTION])
35
35
  export const NUMBER_SUBTYPE = () => new Set([NUMBER])
36
+ export const ABSTRACTION_SUBTYPE = () => new Set([APPLY])
36
37
 
37
38
  const SPECIAL_BOOLEAN = BOOLEAN_SUBTYPE()
38
39
  const SPECIAL_COLLECTION = COLLECTION_SUBTYPE()
39
40
  const SPECIAL_NUMBER = NUMBER_SUBTYPE()
41
+ const SPECIAL_ABSTRACTION = ABSTRACTION_SUBTYPE()
40
42
  export const toTypeNames = (type) => {
41
43
  switch (type) {
42
44
  case APPLY:
@@ -85,7 +87,6 @@ export const SPECIAL_FORM_TYPES = {
85
87
  [SIGNATURE]: PLACEHOLDER,
86
88
  [TYPE_PROP]: [UNKNOWN],
87
89
  [RETURNS]: [UNKNOWN],
88
-
89
90
  [ARGUMENTS]: [],
90
91
  [ARG_COUNT]: 0
91
92
  }
@@ -94,6 +95,27 @@ export const SPECIAL_FORM_TYPES = {
94
95
  [RETURNS]: [APPLY]
95
96
  }
96
97
  },
98
+ [STATIC_TYPES.ABSTRACTIONS]: {
99
+ [STATS]: {
100
+ [TYPE_PROP]: [APPLY],
101
+ [SIGNATURE]: STATIC_TYPES.ABSTRACTIONS,
102
+ retried: Infinity,
103
+ [ARG_COUNT]: 1,
104
+ [ARGUMENTS]: [
105
+ {
106
+ [STATS]: {
107
+ retried: Infinity,
108
+ [SIGNATURE]: PLACEHOLDER,
109
+ [TYPE_PROP]: [UNKNOWN],
110
+ [RETURNS]: [UNKNOWN],
111
+ [ARGUMENTS]: [],
112
+ [ARG_COUNT]: 0
113
+ }
114
+ }
115
+ ],
116
+ [RETURNS]: [COLLECTION, SPECIAL_ABSTRACTION]
117
+ }
118
+ },
97
119
  [STATIC_TYPES.ATOM]: {
98
120
  [STATS]: {
99
121
  [TYPE_PROP]: [APPLY],
@@ -107,7 +129,6 @@ export const SPECIAL_FORM_TYPES = {
107
129
  [SIGNATURE]: PLACEHOLDER,
108
130
  [TYPE_PROP]: [UNKNOWN],
109
131
  [RETURNS]: [UNKNOWN],
110
-
111
132
  [ARGUMENTS]: [],
112
133
  [ARG_COUNT]: 0
113
134
  }
@@ -116,6 +137,27 @@ export const SPECIAL_FORM_TYPES = {
116
137
  [RETURNS]: [ATOM]
117
138
  }
118
139
  },
140
+ [STATIC_TYPES.AS_NUMBER]: {
141
+ [STATS]: {
142
+ [TYPE_PROP]: [APPLY],
143
+ [SIGNATURE]: STATIC_TYPES.AS_NUMBER,
144
+ retried: Infinity,
145
+ [ARG_COUNT]: 1,
146
+ [ARGUMENTS]: [
147
+ {
148
+ [STATS]: {
149
+ retried: Infinity,
150
+ [SIGNATURE]: PLACEHOLDER,
151
+ [TYPE_PROP]: [ATOM, SPECIAL_BOOLEAN],
152
+ [RETURNS]: [ATOM, SPECIAL_BOOLEAN],
153
+ [ARGUMENTS]: [],
154
+ [ARG_COUNT]: 0
155
+ }
156
+ }
157
+ ],
158
+ [RETURNS]: [ATOM, SPECIAL_NUMBER]
159
+ }
160
+ },
119
161
  [STATIC_TYPES.BOOLEAN]: {
120
162
  [STATS]: {
121
163
  [TYPE_PROP]: [APPLY],
@@ -137,6 +179,27 @@ export const SPECIAL_FORM_TYPES = {
137
179
  [RETURNS]: [ATOM, SPECIAL_BOOLEAN]
138
180
  }
139
181
  },
182
+ [STATIC_TYPES.BOOLEANS]: {
183
+ [STATS]: {
184
+ [TYPE_PROP]: [APPLY],
185
+ [SIGNATURE]: STATIC_TYPES.BOOLEANS,
186
+ retried: Infinity,
187
+ [ARG_COUNT]: 1,
188
+ [ARGUMENTS]: [
189
+ {
190
+ [STATS]: {
191
+ retried: Infinity,
192
+ [SIGNATURE]: PLACEHOLDER,
193
+ [TYPE_PROP]: [UNKNOWN],
194
+ [RETURNS]: [UNKNOWN],
195
+ [ARGUMENTS]: [],
196
+ [ARG_COUNT]: 0
197
+ }
198
+ }
199
+ ],
200
+ [RETURNS]: [COLLECTION, SPECIAL_BOOLEAN]
201
+ }
202
+ },
140
203
  [STATIC_TYPES.NUMBER]: {
141
204
  [STATS]: {
142
205
  [TYPE_PROP]: [APPLY],
@@ -158,6 +221,27 @@ export const SPECIAL_FORM_TYPES = {
158
221
  [RETURNS]: [ATOM, SPECIAL_NUMBER]
159
222
  }
160
223
  },
224
+ [STATIC_TYPES.NUMBERS]: {
225
+ [STATS]: {
226
+ [TYPE_PROP]: [APPLY],
227
+ [SIGNATURE]: STATIC_TYPES.NUMBERS,
228
+ retried: Infinity,
229
+ [ARG_COUNT]: 1,
230
+ [ARGUMENTS]: [
231
+ {
232
+ [STATS]: {
233
+ retried: Infinity,
234
+ [SIGNATURE]: PLACEHOLDER,
235
+ [TYPE_PROP]: [UNKNOWN],
236
+ [RETURNS]: [UNKNOWN],
237
+ [ARGUMENTS]: [],
238
+ [ARG_COUNT]: 0
239
+ }
240
+ }
241
+ ],
242
+ [RETURNS]: [COLLECTION, SPECIAL_NUMBER]
243
+ }
244
+ },
161
245
  [STATIC_TYPES.COLLECTION]: {
162
246
  [STATS]: {
163
247
  [TYPE_PROP]: [APPLY],
@@ -180,6 +264,28 @@ export const SPECIAL_FORM_TYPES = {
180
264
  [RETURNS]: [COLLECTION]
181
265
  }
182
266
  },
267
+ [STATIC_TYPES.COLLECTIONS]: {
268
+ [STATS]: {
269
+ [TYPE_PROP]: [APPLY],
270
+ [SIGNATURE]: STATIC_TYPES.COLLECTIONS,
271
+ retried: Infinity,
272
+ [ARG_COUNT]: 1,
273
+ [ARGUMENTS]: [
274
+ {
275
+ [STATS]: {
276
+ retried: Infinity,
277
+ [SIGNATURE]: PLACEHOLDER,
278
+ [TYPE_PROP]: [UNKNOWN],
279
+ [RETURNS]: [UNKNOWN],
280
+
281
+ [ARGUMENTS]: [],
282
+ [ARG_COUNT]: 0
283
+ }
284
+ }
285
+ ],
286
+ [RETURNS]: [COLLECTION, SPECIAL_COLLECTION]
287
+ }
288
+ },
183
289
  [STATIC_TYPES.UNKNOWN]: {
184
290
  [STATS]: {
185
291
  [TYPE_PROP]: [APPLY],