functionalscript 0.0.482 → 0.0.483

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/dev/test.f.cjs CHANGED
@@ -21,7 +21,7 @@ module.exports = {
21
21
  ctorUndefined: () => {
22
22
  /** @type {any} */
23
23
  const o = {
24
- constructor: undefined
24
+ constructor: void 0
25
25
  }
26
26
  const c = o['constructor']
27
27
  //console.log(c)
package/doc/LANGUAGE.md CHANGED
@@ -93,7 +93,7 @@ const functionDouble = a => a * 2
93
93
  const structure = { name: "John", surname: "Smith" }
94
94
  const array = [1, 2, 3]
95
95
  const nestedStructure = {
96
- address: undefined,
96
+ address: null,
97
97
  serialNumber: "123-45-78",
98
98
  sum: 14 + myConst + functionDouble(4),
99
99
  moreInfo: {
@@ -1,7 +1,7 @@
1
1
  const operator = require('../../types/function/operator/module.f.cjs')
2
2
  const list = require('../../types/list/module.f.cjs')
3
3
  const { contains } = require('../../types/range/module.f.cjs')
4
- const { stateScan, flat } = list
4
+ const { empty, stateScan, flat } = list
5
5
  const { fromCharCode } = String
6
6
  const {
7
7
  range,
@@ -125,7 +125,7 @@ const containsSmallLetter = contains(latinSmallLetterRange)
125
125
 
126
126
  /** @typedef {{ readonly kind: 'eof'}} EofState */
127
127
 
128
- /** @typedef {number|undefined} CharCodeOrEof */
128
+ /** @typedef {number|null} CharCodeOrEof */
129
129
 
130
130
  /** @type {(old: string) => (input: number) => string} */
131
131
  const appendChar = old => input => `${old}${fromCharCode(input)}`
@@ -133,13 +133,13 @@ const appendChar = old => input => `${old}${fromCharCode(input)}`
133
133
  /** @type {(state: InitialState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
134
134
  const initialStateOp = initialState => input => {
135
135
  if (containsDigitOneNine(input)) {
136
- return [undefined, { kind: 'number', value: fromCharCode(input), numberKind: 'int' }]
136
+ return [empty, { kind: 'number', value: fromCharCode(input), numberKind: 'int' }]
137
137
  }
138
138
  if (containsSmallLetter(input)) {
139
- return [undefined, { kind: 'keyword', value: fromCharCode(input) }]
139
+ return [empty, { kind: 'keyword', value: fromCharCode(input) }]
140
140
  }
141
141
  if (isWhiteSpace(input)) {
142
- return [undefined, initialState]
142
+ return [empty, initialState]
143
143
  }
144
144
  switch (input) {
145
145
  case leftCurlyBracket: return [[{ kind: '{' }], initialState]
@@ -148,9 +148,9 @@ const initialStateOp = initialState => input => {
148
148
  case comma: return [[{ kind: ',' }], initialState]
149
149
  case leftSquareBracket: return [[{ kind: '[' }], initialState]
150
150
  case rightSquareBracket: return [[{ kind: ']' }], initialState]
151
- case quotationMark: return [undefined, { kind: 'string', value: '' }]
152
- case digit0: return [undefined, { kind: 'number', value: fromCharCode(input), numberKind: '0' }]
153
- case hyphenMinus: return [undefined, { kind: 'number', value: fromCharCode(input), numberKind: '-' }]
151
+ case quotationMark: return [empty, { kind: 'string', value: '' }]
152
+ case digit0: return [empty, { kind: 'number', value: fromCharCode(input), numberKind: '0' }]
153
+ case hyphenMinus: return [empty, { kind: 'number', value: fromCharCode(input), numberKind: '-' }]
154
154
  default: return [[{ kind: 'error', message: 'unexpected character' }], initialState]
155
155
  }
156
156
  }
@@ -160,49 +160,49 @@ const parseNumberStateOp = state => input => {
160
160
  if (input === fullStop) {
161
161
  switch (state.numberKind) {
162
162
  case '0':
163
- case 'int': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: '.' }]
163
+ case 'int': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: '.' }]
164
164
  default: return tokenizeOp({ kind: 'invalidNumber' })(input)
165
165
  }
166
166
  }
167
167
  if (input === digit0) {
168
168
  switch (state.numberKind) {
169
169
  case '0': return tokenizeOp({ kind: 'invalidNumber' })(input)
170
- case '-': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: '0' }]
171
- case '.': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'fractional' }]
170
+ case '-': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: '0' }]
171
+ case '.': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'fractional' }]
172
172
  case 'e':
173
173
  case 'e+':
174
- case 'e-': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'expDigits' }]
175
- default: return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: state.numberKind }]
174
+ case 'e-': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'expDigits' }]
175
+ default: return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: state.numberKind }]
176
176
  }
177
177
  }
178
178
  if (containsDigitOneNine(input)) {
179
179
  switch (state.numberKind) {
180
180
  case '0': return tokenizeOp({ kind: 'invalidNumber' })(input)
181
- case '-': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'int' }]
182
- case '.': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'fractional' }]
181
+ case '-': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'int' }]
182
+ case '.': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'fractional' }]
183
183
  case 'e':
184
184
  case 'e+':
185
- case 'e-': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'expDigits' }]
186
- default: return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: state.numberKind }]
185
+ case 'e-': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'expDigits' }]
186
+ default: return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: state.numberKind }]
187
187
  }
188
188
  }
189
189
  if (input === latinSmallLetterE || input === latinCapitalLetterE) {
190
190
  switch (state.numberKind) {
191
191
  case '0':
192
192
  case 'int':
193
- case 'fractional': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'e' }]
193
+ case 'fractional': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'e' }]
194
194
  default: return tokenizeOp({ kind: 'invalidNumber' })(input)
195
195
  }
196
196
  }
197
197
  if (input === hyphenMinus) {
198
198
  switch (state.numberKind) {
199
- case 'e': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'e-' }]
199
+ case 'e': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'e-' }]
200
200
  default: return tokenizeOp({ kind: 'invalidNumber' })(input)
201
201
  }
202
202
  }
203
203
  if (input === plusSign) {
204
204
  switch (state.numberKind) {
205
- case 'e': return [undefined, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'e+' }]
205
+ case 'e': return [empty, { kind: 'number', value: appendChar(state.value)(input), numberKind: 'e+' }]
206
206
  default: return tokenizeOp({ kind: 'invalidNumber' })(input)
207
207
  }
208
208
  }
@@ -261,15 +261,15 @@ const invalidNumberStateOp = () => input => {
261
261
  const next = tokenizeOp({ kind: 'initial' })(input)
262
262
  return [{ first: { kind: 'error', message: 'invalid number' }, tail: next[0] }, next[1]]
263
263
  }
264
- return [undefined, { kind: 'invalidNumber' }]
264
+ return [empty, { kind: 'invalidNumber' }]
265
265
  }
266
266
 
267
267
  /** @type {(state: ParseStringState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
268
268
  const parseStringStateOp = state => input => {
269
269
  switch (input) {
270
270
  case quotationMark: return [[{ kind: 'string', value: state.value }], { kind: 'initial' }]
271
- case reverseSolidus: return [undefined, { kind: 'escapeChar', value: state.value }]
272
- default: return [undefined, { kind: 'string', value: appendChar(state.value)(input) }]
271
+ case reverseSolidus: return [empty, { kind: 'escapeChar', value: state.value }]
272
+ default: return [empty, { kind: 'string', value: appendChar(state.value)(input) }]
273
273
  }
274
274
  }
275
275
 
@@ -278,13 +278,13 @@ const parseEscapeCharStateOp = state => input => {
278
278
  switch (input) {
279
279
  case quotationMark:
280
280
  case reverseSolidus:
281
- case solidus: return [undefined, { kind: 'string', value: appendChar(state.value)(input) }]
282
- case latinSmallLetterB: return [undefined, { kind: 'string', value: appendChar(state.value)(backspace) }]
283
- case latinSmallLetterF: return [undefined, { kind: 'string', value: appendChar(state.value)(ff) }]
284
- case latinSmallLetterN: return [undefined, { kind: 'string', value: appendChar(state.value)(lf) }]
285
- case latinSmallLetterR: return [undefined, { kind: 'string', value: appendChar(state.value)(cr) }]
286
- case latinSmallLetterT: return [undefined, { kind: 'string', value: appendChar(state.value)(ht) }]
287
- case latinSmallLetterU: return [undefined, { kind: 'unicodeChar', value: state.value, unicode: 0, hexIndex: 0 }]
281
+ case solidus: return [empty, { kind: 'string', value: appendChar(state.value)(input) }]
282
+ case latinSmallLetterB: return [empty, { kind: 'string', value: appendChar(state.value)(backspace) }]
283
+ case latinSmallLetterF: return [empty, { kind: 'string', value: appendChar(state.value)(ff) }]
284
+ case latinSmallLetterN: return [empty, { kind: 'string', value: appendChar(state.value)(lf) }]
285
+ case latinSmallLetterR: return [empty, { kind: 'string', value: appendChar(state.value)(cr) }]
286
+ case latinSmallLetterT: return [empty, { kind: 'string', value: appendChar(state.value)(ht) }]
287
+ case latinSmallLetterU: return [empty, { kind: 'unicodeChar', value: state.value, unicode: 0, hexIndex: 0 }]
288
288
  default: {
289
289
  const next = tokenizeOp({ kind: 'string', value: state.value })(input)
290
290
  return [{ first: { kind: 'error', message: 'unescaped character' }, tail: next[0] }, next[1]]
@@ -292,22 +292,23 @@ const parseEscapeCharStateOp = state => input => {
292
292
  }
293
293
  }
294
294
 
295
- /** @type {(hex: number) => number|undefined} */
295
+ /** @type {(hex: number) => number|null} */
296
296
  const hexDigitToNumber = hex => {
297
297
  if (containsDigit(hex)) { return hex - digit0 }
298
298
  if (containsCapitalAF(hex)) { return hex - latinCapitalLetterA + 10 }
299
299
  if (containsSmallAF(hex)) { return hex - latinSmallLetterA + 10 }
300
+ return null
300
301
  }
301
302
 
302
303
  /** @type {(state: ParseUnicodeCharState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
303
304
  const parseUnicodeCharStateOp = state => input => {
304
305
  const hexValue = hexDigitToNumber(input)
305
- if (hexValue === undefined) {
306
+ if (hexValue === null) {
306
307
  const next = tokenizeOp({ kind: 'string', value: state.value })(input)
307
308
  return [{ first: { kind: 'error', message: 'invalid hex value' }, tail: next[0] }, next[1]]
308
309
  }
309
310
  const newUnicode = state.unicode | (hexValue << (3 - state.hexIndex) * 4)
310
- return [undefined, state.hexIndex === 3 ?
311
+ return [empty, state.hexIndex === 3 ?
311
312
  { kind: 'string', value: appendChar(state.value)(newUnicode) } :
312
313
  { kind: 'unicodeChar', value: state.value, unicode: newUnicode, hexIndex: state.hexIndex + 1 }]
313
314
  }
@@ -325,7 +326,7 @@ const stringToKeywordToken = s => {
325
326
  /** @type {(state: ParseKeywordState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
326
327
  const parseKeyWordStateOp = state => input => {
327
328
  if (containsSmallLetter(input)) {
328
- return [undefined, { kind: 'keyword', value: appendChar(state.value)(input) }]
329
+ return [empty, { kind: 'keyword', value: appendChar(state.value)(input) }]
329
330
  }
330
331
  const keyWordToken = stringToKeywordToken(state.value)
331
332
  const next = tokenizeOp({ kind: 'initial' })(input)
@@ -333,7 +334,7 @@ const parseKeyWordStateOp = state => input => {
333
334
  }
334
335
 
335
336
  /** @type {(state: EofState) => (input: number) => readonly[list.List<JsonToken>, TokenizerState]} */
336
- const eofStateOp = state => input => [[{ kind: 'error', message: 'eof' }], state]
337
+ const eofStateOp = state => () => [[{ kind: 'error', message: 'eof' }], state]
337
338
 
338
339
  /** @type {operator.StateScan<number, TokenizerState, list.List<JsonToken>>} */
339
340
  const tokenizeCharCodeOp = state => {
@@ -352,7 +353,7 @@ const tokenizeCharCodeOp = state => {
352
353
  /** @type {(state: TokenizerState) => readonly[list.List<JsonToken>, TokenizerState]} */
353
354
  const tokenizeEofOp = state => {
354
355
  switch (state.kind) {
355
- case 'initial': return [undefined, { kind: 'eof' }]
356
+ case 'initial': return [empty, { kind: 'eof' }]
356
357
  case 'keyword': return [[stringToKeywordToken(state.value)], { kind: 'eof' }]
357
358
  case 'string':
358
359
  case 'escapeChar':
@@ -372,14 +373,14 @@ const tokenizeEofOp = state => {
372
373
  }
373
374
 
374
375
  /** @type {operator.StateScan<CharCodeOrEof, TokenizerState, list.List<JsonToken>>} */
375
- const tokenizeOp = state => input => input === undefined ? tokenizeEofOp(state) : tokenizeCharCodeOp(state)(input)
376
+ const tokenizeOp = state => input => input === null ? tokenizeEofOp(state) : tokenizeCharCodeOp(state)(input)
376
377
 
377
378
  const scanTokenize = stateScan(tokenizeOp)
378
379
 
379
380
  const initial = scanTokenize({ kind: 'initial' })
380
381
 
381
382
  /** @type {(input: list.List<number>) => list.List<JsonToken>} */
382
- const tokenize = input => flat(initial(flat([/** @type {list.List<CharCodeOrEof>} */(input), [undefined]])))
383
+ const tokenize = input => flat(initial(flat([/** @type {list.List<CharCodeOrEof>} */(input), [null]])))
383
384
 
384
385
  module.exports = {
385
386
  /** @readonly */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.482",
3
+ "version": "0.0.483",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "module.f.cjs",
6
6
  "scripts": {