functionalscript 0.0.337 → 0.0.340

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,5 +1,6 @@
1
1
  const operator = require('../../types/function/operator/index.js')
2
2
  const list = require('../../types/list/index.js')
3
+ const range = require('../../types/range/index.js')
3
4
 
4
5
  /**
5
6
  * @typedef {{
@@ -67,6 +68,12 @@ const letterT = 0x74
67
68
  const letterU = 0x75
68
69
  const letterZ = 0x7a
69
70
 
71
+ const containsDigit = range.contains([digit0, digit9])
72
+ const containsDigitOneNine = range.contains([digit1, digit9])
73
+ const containsSmallAF = range.contains([letterA, letterF])
74
+ const containsCapitalAF = range.contains([capitalLetterA, capitalLetterF])
75
+ const containsSmallLetter = range.contains([letterA, letterZ])
76
+
70
77
  /**
71
78
  * @typedef {|
72
79
  * InitialState |
@@ -116,22 +123,23 @@ const letterZ = 0x7a
116
123
 
117
124
  /** @typedef {number|undefined} CharCodeOrEof */
118
125
 
119
- /** @type {(old: string) => (input: CharCodeOrEof) => string} */
120
- const appendChar = old => input => input === undefined ? old : operator.concat(charToString(input))(old)
121
-
122
- /** @type {(input: CharCodeOrEof) => string} */
123
- const charToString = input => input === undefined ? '' : String.fromCharCode(input)
126
+ /** @type {(old: string) => (input: number) => string} */
127
+ const appendChar = old => input => `${old}${String.fromCharCode(input)}`
124
128
 
125
129
  /** @type {(state: InitialState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
126
130
  const initialStateOp = initialState => input =>
127
131
  {
128
- if (input >= digit1 && input <= digit9)
132
+ if (containsDigitOneNine(input))
129
133
  {
130
- return [undefined, { kind: 'number', value: charToString(input), numberKind: 'int'}]
134
+ return [undefined, { kind: 'number', value: String.fromCharCode(input), numberKind: 'int'}]
131
135
  }
132
- if (input >= letterA && input <= letterZ)
136
+ if (containsSmallLetter(input))
133
137
  {
134
- return [undefined, { kind: 'keyword', value: charToString(input)}]
138
+ return [undefined, { kind: 'keyword', value: String.fromCharCode(input)}]
139
+ }
140
+ if (isWhiteSpace(input))
141
+ {
142
+ return [undefined, initialState]
135
143
  }
136
144
  switch(input)
137
145
  {
@@ -142,12 +150,8 @@ const initialStateOp = initialState => input =>
142
150
  case leftBracket: return [[{kind: '['}], initialState]
143
151
  case rightBracket: return [[{kind: ']'}], initialState]
144
152
  case quotationMark: return[undefined, {kind: 'string', value: ''}]
145
- case digit0: return [undefined, { kind: 'number', value: charToString(input), numberKind: '0'}]
146
- case signMinus: return [undefined, { kind: 'number', value: charToString(input), numberKind: '-'}]
147
- case horizontalTab:
148
- case newLine:
149
- case carriageReturn:
150
- case space: return[undefined, initialState]
153
+ case digit0: return [undefined, { kind: 'number', value: String.fromCharCode(input), numberKind: '0'}]
154
+ case signMinus: return [undefined, { kind: 'number', value: String.fromCharCode(input), numberKind: '-'}]
151
155
  default: return [[{kind: 'error', message: 'unexpected character'}], initialState]
152
156
  }
153
157
  }
@@ -177,7 +181,7 @@ const parseNumberStateOp = state => input =>
177
181
  default: return [undefined, {kind:'number', value: appendChar(state.value)(input), numberKind: state.numberKind}]
178
182
  }
179
183
  }
180
- if (input >= digit1 && input <= digit9)
184
+ if (containsDigitOneNine(input))
181
185
  {
182
186
  switch (state.numberKind)
183
187
  {
@@ -242,6 +246,10 @@ const parseNumberStateOp = state => input =>
242
246
  /** @type {(char: number) => boolean} */
243
247
  const isTerminalForNumber = char =>
244
248
  {
249
+ if (isWhiteSpace(char))
250
+ {
251
+ return true;
252
+ }
245
253
  switch (char)
246
254
  {
247
255
  case quotationMark:
@@ -255,6 +263,19 @@ const isTerminalForNumber = char =>
255
263
  }
256
264
  }
257
265
 
266
+ /** @type {(char: number) => boolean} */
267
+ const isWhiteSpace = char =>
268
+ {
269
+ switch (char)
270
+ {
271
+ case horizontalTab:
272
+ case newLine:
273
+ case carriageReturn:
274
+ case space: return true
275
+ default: return false
276
+ }
277
+ }
278
+
258
279
  /** @type {(state: InvalidNumberState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
259
280
  const invalidNumberStateOp = state => input =>
260
281
  {
@@ -301,9 +322,9 @@ const parseEscapeCharStateOp = state => input =>
301
322
  /** @type {(hex: number) => number|undefined} */
302
323
  const hexDigitToNumber = hex =>
303
324
  {
304
- if (hex >= digit0 && hex <= digit9) { return hex - digit0 }
305
- if (hex >= capitalLetterA && hex <= capitalLetterF) { return hex - capitalLetterA + 10 }
306
- if (hex >= letterA && hex <= letterF) { return hex - letterA + 10 }
325
+ if (containsDigit(hex)) { return hex - digit0 }
326
+ if (containsCapitalAF(hex)) { return hex - capitalLetterA + 10 }
327
+ if (containsSmallAF(hex)) { return hex - letterA + 10 }
307
328
  }
308
329
 
309
330
  /** @type {(state: ParseUnicodeCharState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
@@ -336,7 +357,7 @@ const stringToKeywordToken = s =>
336
357
  /** @type {(state: ParseKeywordState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
337
358
  const parseKeyWordStateOp = state => input =>
338
359
  {
339
- if (input >= letterA && input <= letterZ)
360
+ if (containsSmallLetter(input))
340
361
  {
341
362
  return [undefined, {kind: 'keyword', value: appendChar(state.value)(input)}]
342
363
  }
@@ -188,6 +188,16 @@ const stringify = json.stringify(sort)
188
188
  if (result !== '[{"kind":"{"},{"kind":"number","value":"90"},{"kind":"}"}]') { throw result }
189
189
  }
190
190
 
191
+ {
192
+ const result = stringify(tokenizeString('1 2'))
193
+ if (result !== '[{"kind":"number","value":"1"},{"kind":"number","value":"2"}]') { throw result }
194
+ }
195
+
196
+ {
197
+ const result = stringify(tokenizeString('0. 2'))
198
+ if (result !== '[{"kind":"error","message":"invalid number"},{"kind":"number","value":"2"}]') { throw result }
199
+ }
200
+
191
201
  {
192
202
  const result = stringify(tokenizeString('10-0'))
193
203
  if (result !== '[{"kind":"error","message":"invalid number"}]') { throw result }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.337",
3
+ "version": "0.0.340",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "homepage": "https://github.com/functionalscript/functionalscript#readme",
30
30
  "devDependencies": {
31
- "@types/node": "^16.11.26",
32
- "typescript": "^4.6.2"
31
+ "@types/node": "^16.11.33",
32
+ "typescript": "^4.6.4"
33
33
  }
34
34
  }