functionalscript 0.0.499 → 0.0.500
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/json/parser/module.f.cjs +24 -31
- package/json/tokenizer/module.f.cjs +1 -1
- package/package.json +1 -1
- package/types/number/test.f.cjs +15 -0
package/json/parser/module.f.cjs
CHANGED
|
@@ -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,
|
|
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 {
|
|
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<
|
|
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<
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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' ?
|
|
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) =>
|
|
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
|
|
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 '{'
|
|
215
|
-
case '{k'
|
|
216
|
-
case '{:'
|
|
217
|
-
case '{v'
|
|
218
|
-
case '{,'
|
|
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<
|
|
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 {(
|
|
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
package/types/number/test.f.cjs
CHANGED
|
@@ -22,5 +22,20 @@ module.exports = {
|
|
|
22
22
|
cmp: () => {
|
|
23
23
|
const result = cmp(4)(5)
|
|
24
24
|
if (result !== -1) { throw result }
|
|
25
|
+
},
|
|
26
|
+
standard: () => {
|
|
27
|
+
/** @type {(v: bigint) => void} */
|
|
28
|
+
const eq = v => {
|
|
29
|
+
if (BigInt(Number(v)) != v) { throw v }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 0x35 bits.
|
|
33
|
+
// 3 2 1 0
|
|
34
|
+
// 4_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210_FEDC_BA98_7654_3210
|
|
35
|
+
eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n)
|
|
36
|
+
eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001n)
|
|
37
|
+
eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010n)
|
|
38
|
+
eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0011n)
|
|
39
|
+
eq(0b1_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0100n)
|
|
25
40
|
}
|
|
26
41
|
}
|