functionalscript 0.0.499 → 0.0.501

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.
@@ -1,16 +1,18 @@
1
1
  const result = require('../../types/result/module.f.cjs')
2
2
  const list = require('../../types/list/module.f.cjs')
3
- const { fold, isEmpty, first, drop, toArray } = list
3
+ const { fold, first, drop, toArray } = list
4
4
  const operator = require('../../types/function/operator/module.f.cjs')
5
5
  const tokenizer = require('../tokenizer/module.f.cjs')
6
6
  const map = require('../../types/map/module.f.cjs')
7
- const { entries, setReplace } = map
7
+ const { setReplace } = map
8
+ const json = require('../module.f.cjs')
9
+ const { fromMap } = require('../../types/object/module.f.cjs')
8
10
 
9
11
 
10
12
  /**
11
13
  * @typedef {{
12
14
  * readonly kind: 'object'
13
- * readonly values: map.Map<any>
15
+ * readonly values: map.Map<json.Unknown>
14
16
  * readonly key: string
15
17
  * }} JsonObject
16
18
  * */
@@ -18,7 +20,7 @@ const { entries, setReplace } = map
18
20
  /**
19
21
  * @typedef {{
20
22
  * readonly kind: 'array'
21
- * readonly values: list.List<any>
23
+ * readonly values: list.List<json.Unknown>
22
24
  * }} JsonArray
23
25
  * */
24
26
 
@@ -42,7 +44,7 @@ const { entries, setReplace } = map
42
44
  /**
43
45
  * @typedef {{
44
46
  * readonly status: 'result'
45
- * readonly value: any
47
+ * readonly value: json.Unknown
46
48
  * }} StateResult
47
49
  */
48
50
 
@@ -64,10 +66,10 @@ const { entries, setReplace } = map
64
66
  /** @type {(obj: JsonObject) => (key: string) => JsonObject} */
65
67
  const addKeyToObject = obj => key => ({ kind: 'object', values: obj.values, key: key })
66
68
 
67
- /** @type {(obj: JsonObject) => (value: any) => JsonObject} */
69
+ /** @type {(obj: JsonObject) => (value: json.Unknown) => JsonObject} */
68
70
  const addValueToObject = obj => value => ({ kind: 'object', values: setReplace(obj.key)(value)(obj.values), key: '' })
69
71
 
70
- /** @type {(array: JsonArray) => (value: any) => JsonArray} */
72
+ /** @type {(array: JsonArray) => (value: json.Unknown) => JsonArray} */
71
73
  const addToArray = array => value => ({ kind: 'array', values: list.concat(array.values)([value]) })
72
74
 
73
75
  /** @type {(state: StateParse) => (key: string) => JsonState} */
@@ -76,9 +78,9 @@ const pushKey = state => value => {
76
78
  return { status: 'error', message: 'error' }
77
79
  }
78
80
 
79
- /** @type {(state: StateParse) => (value: any) => JsonState} */
81
+ /** @type {(state: StateParse) => (value: json.Unknown) => JsonState} */
80
82
  const pushValue = state => value => {
81
- if (state.top === null) { return { status: 'result', value: value }}
83
+ if (state.top === null) { return { status: 'result', value: value } }
82
84
  if (state.top.kind === 'array') { return { status: '[v', top: addToArray(state.top)(value), stack: state.stack } }
83
85
  return { status: '{v', top: addValueToObject(state.top)(value), stack: state.stack }
84
86
  }
@@ -103,30 +105,21 @@ const startObject = state => {
103
105
  return { status: '{', top: { kind: 'object', values: null, key: '' }, stack: newStack }
104
106
  }
105
107
 
106
- /** @type {operator.Fold<map.Entry<any>, any>} */
107
- const foldToObjectOp = ([k, v]) => obj => { return { ...obj, [k] : v } }
108
-
109
- /** @type {(m: map.Map<any>) => any} */
110
- const toObject = m => {
111
- const e = entries(m)
112
- return fold(foldToObjectOp)({})(e)
113
- }
114
-
115
108
  /** @type {(state: StateParse) => JsonState} */
116
109
  const endObject = state => {
117
- const obj = state.top?.kind === 'object' ? toObject(state.top.values) : null
110
+ const obj = state.top?.kind === 'object' ? fromMap(state.top.values) : null
118
111
  /** @type {StateParse} */
119
112
  const newState = { status: '', top: first(null)(state.stack), stack: drop(1)(state.stack) }
120
113
  return pushValue(newState)(obj)
121
114
  }
122
115
 
123
- /** @type {(token: tokenizer.JsonToken) => any} */
116
+ /** @type {(token: tokenizer.JsonToken) => json.Unknown} */
124
117
  const tokenToValue = token => {
125
- switch(token.kind) {
118
+ switch (token.kind) {
126
119
  case 'null': return null
127
120
  case 'false': return false
128
121
  case 'true': return true
129
- case 'number': return Number(token.value)
122
+ case 'number': return parseFloat(token.value)
130
123
  case 'string': return token.value
131
124
  default: return null
132
125
  }
@@ -134,7 +127,7 @@ const tokenToValue = token => {
134
127
 
135
128
  /** @type {(token: tokenizer.JsonToken) => boolean} */
136
129
  const isValueToken = token => {
137
- switch(token.kind) {
130
+ switch (token.kind) {
138
131
  case 'null':
139
132
  case 'false':
140
133
  case 'true':
@@ -204,25 +197,25 @@ const parseObjectCommaOp = token => state => {
204
197
 
205
198
  /** @type {operator.Fold<tokenizer.JsonToken, JsonState>} */
206
199
  const foldOp = token => state => {
207
- switch(state.status) {
200
+ switch (state.status) {
208
201
  case 'result': return { status: 'error', message: 'unexpected token' }
209
202
  case 'error': return { status: 'error', message: state.message }
210
203
  case '': return parseValueOp(token)(state)
211
204
  case '[': return parseArrayStartOp(token)(state)
212
205
  case '[v': return parseArrayValueOp(token)(state)
213
206
  case '[,': return parseValueOp(token)(state)
214
- case '{' : return parseObjectStartOp(token)(state)
215
- case '{k' : return parseObjectKeyOp(token)(state)
216
- case '{:' : return parseObjectColonOp(token)(state)
217
- case '{v' : return parseObjectNextOp(token)(state)
218
- case '{,' : return parseObjectCommaOp(token)(state)
207
+ case '{': return parseObjectStartOp(token)(state)
208
+ case '{k': return parseObjectKeyOp(token)(state)
209
+ case '{:': return parseObjectColonOp(token)(state)
210
+ case '{v': return parseObjectNextOp(token)(state)
211
+ case '{,': return parseObjectCommaOp(token)(state)
219
212
  }
220
213
  }
221
214
 
222
- /** @type {(tokenList: list.List<tokenizer.JsonToken>) => result.Result<any, string>} */
215
+ /** @type {(tokenList: list.List<tokenizer.JsonToken>) => result.Result<json.Unknown, string>} */
223
216
  const parse = tokenList => {
224
217
  const state = fold(foldOp)({ status: '', top: null, stack: null })(tokenList)
225
- switch(state.status) {
218
+ switch (state.status) {
226
219
  case 'result': return result.ok(state.value)
227
220
  case 'error': return result.error(state.message)
228
221
  default: return result.error('unexpected end')
@@ -238,7 +238,7 @@ const initialStateOp = create(state => () => [[{ kind: 'error', message: 'unexpe
238
238
  rangeFunc(one(hyphenMinus))(() => input => [empty, { kind: 'number', value: fromCharCode(input), numberKind: '-' }])
239
239
  ])
240
240
 
241
- /** @type {(state: any) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
241
+ /** @type {() => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
242
242
  const invalidNumberToToken = () => input => tokenizeOp({ kind: 'invalidNumber' })(input)
243
243
 
244
244
  /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.499",
3
+ "version": "0.0.501",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "module.f.cjs",
6
6
  "scripts": {
@@ -22,5 +22,170 @@ module.exports = {
22
22
  cmp: () => {
23
23
  const result = cmp(4)(5)
24
24
  if (result !== -1) { throw result }
25
+ },
26
+ standard: () => {
27
+ /** @type {(a: bigint) => (a: bigint) => void} */
28
+ const check = a => b => {
29
+ if (BigInt(Number(a)) != b) { throw [a, b] }
30
+ }
31
+
32
+ /** @type {(v: bigint) => void} */
33
+ const eq = v => check(v)(v)
34
+
35
+ // 53, 0x35 bits.
36
+ // 3 2 1 0
37
+ // 4_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210
38
+ eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n)
39
+ eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001n)
40
+ eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010n)
41
+ eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0011n)
42
+ eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0100n)
43
+ //
44
+ eq(0b1_1101_0010_0110_1110_1000_0010_1000_1101_0000_0001_0011_0100_1000n)
45
+ eq(0b1_0101_0110_0110_0101_0110_0011_1100_0110_0110_0100_1100_1111_0001n)
46
+ eq(0b1_1011_0011_0010_1010_1110_1101_1000_1111_0010_0100_1100_0010_1010n)
47
+ eq(0b1_1010_0101_0010_0001_1000_1100_1010_1110_0110_0011_0001_0010_0011n)
48
+ eq(0b1_0011_0001_0101_1101_1000_1111_0111_1100_0011_1100_0000_1010_1100n)
49
+ //
50
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111n)
51
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110n)
52
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1101n)
53
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1100n)
54
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1011n)
55
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1010n)
56
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1001n)
57
+ eq(0b1_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1000n)
58
+
59
+ // 54, 0x35+1 bits.
60
+ // 3 2 1 0
61
+ // 4_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_1
62
+ check
63
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0n)
64
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0n)
65
+ check
66
+ (0b01_1101_0111_0110_0101_1001_1101_0101_0010_1101_1011_0110_0111_1011_0n)
67
+ (0b01_1101_0111_0110_0101_1001_1101_0101_0010_1101_1011_0110_0111_1011_0n)
68
+ check
69
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_0n)
70
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_0n)
71
+ // round down
72
+ check
73
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_1n)
74
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0n)
75
+ check
76
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010_1n)
77
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010_0n)
78
+ check
79
+ (0b01_0100_1101_0100_1111_1101_1010_0110_1100_1111_1010_1000_1111_0010_1n)
80
+ (0b01_0100_1101_0100_1111_1101_1010_0110_1100_1111_1010_1000_1111_0010_0n)
81
+ check
82
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_1n)
83
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_0n)
84
+ // round up
85
+ check
86
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_1n)
87
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010_0n)
88
+ check
89
+ (0b01_1011_1101_1010_0011_1010_1111_0111_1101_0001_1110_1111_1001_1011_1n)
90
+ (0b01_1011_1101_1010_0011_1010_1111_0111_1101_0001_1110_1111_1001_1100_0n)
91
+ check
92
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1n)
93
+ (0b10_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0n)
94
+
95
+ // 55, 0x35+2 bits.
96
+ // 3 2 1 0
97
+ // 4_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_12
98
+ // 0_xx: down, down, up
99
+ // 0_00
100
+ check
101
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_00n)
102
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_00n)
103
+ check
104
+ (0b01_1011_1000_1010_1100_0110_1010_1010_0110_1100_0010_1010_1111_0000_00n)
105
+ (0b01_1011_1000_1010_1100_0110_1010_1010_0110_1100_0010_1010_1111_0000_00n)
106
+ check
107
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_00n)
108
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_00n)
109
+ // 0_01 round down
110
+ check
111
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_01n)
112
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_00n)
113
+ check
114
+ (0b01_1111_1101_1010_1111_0011_1100_0011_1010_1001_1100_1010_1110_1000_01n)
115
+ (0b01_1111_1101_1010_1111_0011_1100_0011_1010_1001_1100_1010_1110_1000_00n)
116
+ check
117
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_01n)
118
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_00n)
119
+ // 0_10 round down
120
+ check
121
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_10n)
122
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_00n)
123
+ check
124
+ (0b01_0010_0011_1101_1100_0011_0001_1000_1101_0011_0011_0011_1111_0110_10n)
125
+ (0b01_0010_0011_1101_1100_0011_0001_1000_1101_0011_0011_0011_1111_0110_00n)
126
+ check
127
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_10n)
128
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_00n)
129
+ // 0_11 round up
130
+ check
131
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_11n)
132
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_00n)
133
+ check
134
+ (0b01_0010_0111_0000_1101_1011_0111_0010_0100_1101_1100_0010_0111_0000_11n)
135
+ (0b01_0010_0111_0000_1101_1011_0111_0010_0100_1101_1100_0010_0111_0001_00n)
136
+ check
137
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_11n)
138
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_00n)
139
+ // 1_xx: down, up, up
140
+ // 1_00
141
+ check
142
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_00n)
143
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_00n)
144
+ check
145
+ (0b01_1000_0001_1111_0001_1011_1101_0000_1001_1111_0011_0011_0111_0101_00n)
146
+ (0b01_1000_0001_1111_0001_1011_1101_0000_1001_1111_0011_0011_0111_0101_00n)
147
+ check
148
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1110_11n)
149
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_00n)
150
+ // 1_01 round down
151
+ check
152
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_01n)
153
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_00n)
154
+ check
155
+ (0b01_0100_1000_1100_1010_0010_1111_1011_0111_1011_1010_1011_0100_0001_01n)
156
+ (0b01_0100_1000_1100_1010_0010_1111_1011_0111_1011_1010_1011_0100_0001_00n)
157
+ check
158
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_01n)
159
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_00n)
160
+ // 1_10 round up
161
+ check
162
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_10n)
163
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010_00n)
164
+ check
165
+ (0b01_1111_1011_1100_1010_1111_0010_1010_1111_1101_0110_0101_1001_0011_10n)
166
+ (0b01_1111_1011_1100_1010_1111_0010_1010_1111_1101_0110_0101_1001_0100_00n)
167
+ check
168
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_10n)
169
+ (0b10_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_00n)
170
+ // 1_11 round up
171
+ check
172
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_11n)
173
+ (0b01_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010_00n)
174
+ check
175
+ (0b01_1111_0001_1001_1000_1110_0011_1011_0011_0100_0111_0010_0000_0101_11n)
176
+ (0b01_1111_0001_1001_1000_1110_0011_1011_0011_0100_0111_0010_0000_0110_00n)
177
+ check
178
+ (0b01_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_11n)
179
+ (0b10_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_00n)
180
+
181
+ // 57, 0x35+4 bits.
182
+ // 3 2 1 0
183
+ // 4_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_1234
184
+ check
185
+ (0b01_0111_0001_0111_1101_1011_0100_1111_1110_0010_1111_0010_0010_1111_1110n)
186
+ (0b01_0111_0001_0111_1101_1011_0100_1111_1110_0010_1111_0010_0011_0000_0000n)
187
+ check
188
+ (0b01_1111_1010_1111_0011_0101_0111_1001_1111_1001_1101_0111_0000_0001_0100n)
189
+ (0b01_1111_1010_1111_0011_0101_0111_1001_1111_1001_1101_0111_0000_0001_0000n)
25
190
  }
26
- }
191
+ }