functionalscript 0.0.310 → 0.0.314

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.
@@ -13,7 +13,7 @@ jobs:
13
13
 
14
14
  strategy:
15
15
  matrix:
16
- node-version: [14.x, 16.x]
16
+ node-version: [14.x, 16.x, 17.x]
17
17
  # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
18
18
 
19
19
  steps:
package/LANGUAGE.md CHANGED
@@ -13,7 +13,7 @@ const result = thirdPartyModule.someFunction('hello')
13
13
  ## 2. Packages
14
14
 
15
15
  FunctionalScript uses a `package.json` file to define a package. This file is compatible with [Node.js `package.json`](https://nodejs.org/en/knowledge/getting-started/npm/what-is-the-file-package-json/).
16
- The prefered way to refence dependencies is to use a GitHub URL. These dependencies in a `package.json` file could look like this,
16
+ The preferred way to reference dependencies is to use a GitHub URL. These dependencies in a `package.json` file could look like this,
17
17
 
18
18
  ```json
19
19
  {
@@ -33,7 +33,7 @@ npm install -S github:functionalscript/functionalscript
33
33
 
34
34
  ## 3. Module Structure
35
35
 
36
- A module is a file with the `.js` extention. It contains three parts: references to other modules, definitions, and exports. For example
36
+ A module is a file with the `.js` extension. It contains three parts: references to other modules, definitions, and exports. For example
37
37
 
38
38
  `./first.js`
39
39
  ```js
@@ -81,7 +81,7 @@ const localFile = require('../some-directory/some-file.js')
81
81
 
82
82
  ## 5. Definitions
83
83
 
84
- The format of defintions is `const NAME = EXPRESSION`, where the `EXPRESSION` is a subset of [JavaScript expressions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators).
84
+ The format of definitions is `const NAME = EXPRESSION`, where the `EXPRESSION` is a subset of [JavaScript expressions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators).
85
85
 
86
86
  ```js
87
87
  const myConst = 42
@@ -139,7 +139,7 @@ Expressions could fall under these categories:
139
139
  - Relations Operators: `in`, `instanceof`.
140
140
  - Member Operators: `.`, `[]`.
141
141
 
142
- Note: the `.` member operator has prohibitted property names, such as `constructor` and `push`. To access such properties, it's recommeded to use the [Object.getOwnPropertyDescriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor) function.
142
+ **Note:** the `.` member operator has prohibited property names, such as `constructor` and `push`. To access such properties, it's recommended to use the [Object.getOwnPropertyDescriptor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor) function.
143
143
 
144
144
  ## 8. Arrow Functions
145
145
 
@@ -167,7 +167,7 @@ const f = x => {
167
167
 
168
168
  ## 9. Statements
169
169
 
170
- `{ A_LIST_OF_STATEMENTS }` is one or many statements seperated by the newline control character. One of these statements mentioned earlier was [definition](#5-Definitions), also known as a [const](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const) statement. The other statements are described below.
170
+ `{ A_LIST_OF_STATEMENTS }` is one or many statements separated by the newline control character. One of these statements mentioned earlier was [definition](#5-Definitions), also known as a [const](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const) statement. The other statements are described below.
171
171
 
172
172
  ### 9.1. Let
173
173
 
@@ -197,7 +197,7 @@ const f = () => x // < invalid
197
197
 
198
198
  ### 9.5. Throw
199
199
 
200
- [Throw](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw). FunctionalScript allows to throw exceptions but it doesn't catch them. You should only be using Statement throw in non-recoverable situations. It could be compared to [panic in Rust](https://doc.rust-lang.org/std/macro.panic.html).
200
+ [Throw](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw). FunctionalScript allows to throw exceptions, but the language has no syntax to catch them. Developers should only use the 'throw' statement in non-recoverable situations. Throwing an exception could be compared to [panic in Rust](https://doc.rust-lang.org/std/macro.panic.html).
201
201
 
202
202
  ### 9.6. While
203
203
 
@@ -20,8 +20,8 @@ const split = path => path.split('/')
20
20
 
21
21
  /** @typedef {readonly[list.List<string>] | undefined} OptionList */
22
22
 
23
- /** @type {(s: OptionList) => (items: string) => OptionList} */
24
- const normItemsOp = prior => first => {
23
+ /** @type {(items: string) => (prior: OptionList) => OptionList} */
24
+ const normItemsOp = first => prior => {
25
25
  if (prior === undefined) { return undefined }
26
26
  const tail = prior[0]
27
27
  switch (first) {
package/json/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  const seq = require('../types/list')
2
2
  const object = require('../types/object')
3
- const array = require('../types/array')
4
3
  const op = require('../types/function/operator')
4
+ const { compose } = require('../types/function')
5
5
 
6
- /**
6
+ /**
7
7
  * @typedef {{
8
8
  * readonly [k in string]: Unknown
9
- * }} Object
9
+ * }} Object
10
10
  */
11
11
 
12
12
  /** @typedef {readonly Unknown[]} Array */
@@ -22,7 +22,7 @@ const setProperty = value => {
22
22
  const srcObject = (src === undefined || src === null || typeof src !== 'object' || src instanceof Array) ? {} : src
23
23
  const { first, tail } = result
24
24
  return { ...srcObject, [first]: f(tail)(object.at(first)(srcObject)) }
25
- }
25
+ }
26
26
  return f
27
27
  }
28
28
 
@@ -45,7 +45,7 @@ const colon = [':']
45
45
  const comma = [',']
46
46
 
47
47
  /** @type {op.Fold<seq.List<string>>} */
48
- const joinOp = a => b => seq.flat([a, comma, b])
48
+ const joinOp = b => prior => seq.flat([prior, comma, b])
49
49
 
50
50
  /** @type {(input: seq.List<seq.List<string>>) => seq.List<string>} */
51
51
  const join = seq.fold(joinOp)([])
@@ -76,19 +76,8 @@ const serialize = sort => {
76
76
  f(v)
77
77
  ])
78
78
  /** @type {(object: Object) => seq.List<string>} */
79
- const objectSerialize = input => {
80
- const entries = Object.entries(input)
81
- const sortedEntries = sort(entries)
82
- const _ = seq.toArray(sortedEntries)
83
- const serializedEntries = seq.map(propertySerialize)(sortedEntries)
84
- return objectList(serializedEntries)
85
- }
86
- /** @type {(input: Array) => seq.List<string>} */
87
- const arraySerialize = input => {
88
- const serializedEntries = seq.map(f)(input)
89
- return arrayList(serializedEntries)
90
- }
91
- /** @type {(value: Unknown) => seq.List < string >} */
79
+ const objectSerialize = input => objectList(seq.map(propertySerialize)(sort(Object.entries(input))))
80
+ /** @type {(value: Unknown) => seq.List<string>} */
92
81
  const f = value => {
93
82
  switch (typeof value) {
94
83
  case 'boolean': { return boolSerialize(value) }
@@ -101,22 +90,21 @@ const serialize = sort => {
101
90
  }
102
91
  }
103
92
  }
93
+ /** @type {(input: Array) => seq.List<string>} */
94
+ const arraySerialize = compose(seq.map(f))(arrayList)
104
95
  return f
105
96
  }
106
97
 
107
98
  /**
108
- * The standard `JSON.stringify` rules determined by
99
+ * The standard `JSON.stringify` rules determined by
109
100
  * https://262.ecma-international.org/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys
110
- *
101
+ *
111
102
  * @type {(mapEntries: MapEntries) => (value: Unknown) => string}
112
103
  */
113
- const stringify = sort => value => {
114
- const _s = serialize(sort)(value)
115
- return seq.join('')(_s)
116
- }
104
+ const stringify = sort => compose(serialize(sort))(seq.join(''))
117
105
 
118
106
  /** @type {(value: string) => Unknown} */
119
- const parse = value => JSON.parse(value)
107
+ const parse = JSON.parse
120
108
 
121
109
  /** @type {(value: Unknown) => value is Object} */
122
110
  const isObject = value => typeof value === 'object' && value !== null && !(value instanceof Array)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.310",
3
+ "version": "0.0.314",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -92,8 +92,8 @@ const initValue1 = a => n => {
92
92
  * @typedef {(a: A) => (n: _.Branch3<T>) => _.Branch1<T> | _.Branch3<T>} Merge
93
93
  */
94
94
 
95
- /** @type {<A, T>(ms: array.Array2<Merge<A, T>>) => (a: A) => (i: find.PathItem<T>) => Branch<T>} */
96
- const reduceX = ms => a => i => {
95
+ /** @type {<A, T>(ms: array.Array2<Merge<A, T>>) => (i: find.PathItem<T>) => (a: A) => Branch<T>} */
96
+ const reduceX = ms => i => a => {
97
97
  const [m0, m2] = ms
98
98
  /** @typedef {typeof ms extends array.Array2<Merge<infer A, infer T>> ? [A,T] : never} AT */
99
99
  /** @typedef {AT[0]} A */
@@ -155,7 +155,7 @@ const nodeRemove = c => node => {
155
155
  const tailR = list.next(tail)
156
156
  if (tailR === undefined) { return first }
157
157
  const { first: tf, tail: tt } = tailR
158
- const result = reduce(initReduce(first)(tf))(tt)
158
+ const result = reduce(initReduce(tf)(first))(tt)
159
159
  return result.length === 1 ? result[0] : result
160
160
  }
161
161
 
@@ -11,8 +11,8 @@ const list = require('../../list')
11
11
  /** @type {<T>(b: _.Branch5<T> | _.Branch7<T>) => Bracnh1To3<T>} */
12
12
  const b57 = b => b.length === 5 ? [b] : [[b[0], b[1], b[2]], b[3], [b[4], b[5], b[6]]]
13
13
 
14
- /** @type {<T>(a: Bracnh1To3<T>) => (i: find.PathItem<T>) => Bracnh1To3<T>} */
15
- const reduce = a => i => {
14
+ /** @type {<T>(i: find.PathItem<T>) => (a: Bracnh1To3<T>) => Bracnh1To3<T>} */
15
+ const reduce = i => a => {
16
16
  switch (i[0]) {
17
17
  case 0: {
18
18
  const x = i[1]
@@ -7,18 +7,20 @@
7
7
 
8
8
  /**
9
9
  * @template I,O
10
- * @typedef {Binary<O, I, O>} Reduce
10
+ * @typedef {Binary<I, O, O>} Reduce
11
11
  */
12
12
 
13
13
  /** @type {(separator: string) => Fold<string>} */
14
- const join = separator => prior => value => `${prior}${separator}${value}`
14
+ const join = separator => value => prior => `${prior}${separator}${value}`
15
15
 
16
16
  /** @type {Fold<string>} */
17
- const concat = a => b => `${a}${b}`
17
+ const concat = i => acc => `${acc}${i}`
18
18
 
19
19
  /** @type {Fold<number>} */
20
20
  const addition = a => b => a + b
21
21
 
22
+ const increment = addition(1)
23
+
22
24
  /**
23
25
  * @template T
24
26
  * @template R
@@ -60,7 +62,7 @@ const stateScanToScan = op => prior => i => {
60
62
 
61
63
  /** @type {<I, O>(reduce: Reduce<I, O>) => (prior: O) => Scan<I, O>} */
62
64
  const reduceToScan = reduce => prior => i => {
63
- const result = reduce(prior)(i)
65
+ const result = reduce(i)(prior)
64
66
  return [result, reduceToScan(reduce)(result)]
65
67
  }
66
68
 
@@ -72,8 +74,7 @@ const reduceToScan = reduce => prior => i => {
72
74
  /** @type {<T>(fold: Fold<T>) => Scan<T, T>} */
73
75
  const foldToScan = op => init => [init, reduceToScan(op)(init)]
74
76
 
75
- /** @type {(a: number) => () => number} */
76
- const counter = a => () => a + 1
77
+ const counter = () => increment
77
78
 
78
79
  module.exports = {
79
80
  /** @readonly */
@@ -81,6 +82,8 @@ module.exports = {
81
82
  /** @readonly */
82
83
  addition,
83
84
  /** @readonly */
85
+ increment,
86
+ /** @readonly */
84
87
  strictEqual,
85
88
  /** @readonly */
86
89
  logicalNot,
@@ -268,8 +268,8 @@ const entries = input => {
268
268
  return stateScan(/** @type {operator.StateScan<T, Number, Entry<T>>} */(entryOperator))(0)(input)
269
269
  }
270
270
 
271
- /** @type {<T>(prior: List<T>) => (value: T) => List<T>} */
272
- const reverseOperator = tail => first => ({ first, tail })
271
+ /** @type {<T>(value: T) => (prior: List<T>) => List<T>} */
272
+ const reverseOperator = first => tail => ({ first, tail })
273
273
 
274
274
  /** @type {<T>(input: List<T>) => List<T>} */
275
275
  const reverse = reduce(reverseOperator)(undefined)
@@ -6,7 +6,6 @@ const compare = require('../function/compare')
6
6
  const { stringCmp } = require('../function/compare')
7
7
  const list = require('../list')
8
8
  const btRemove = require('../btree/remove')
9
- const { flip } = require('../function')
10
9
 
11
10
  /** @typedef {compare.Sign} Sign */
12
11
 
@@ -45,7 +44,7 @@ const set = name => value => setEntry([name, value])
45
44
  const entries = values
46
45
 
47
46
  /** @type {<T>(entries: list.List<Entry<T>>) => Map<T>} */
48
- const fromEntries = list.reduce(flip(setEntry))(undefined)
47
+ const fromEntries = list.reduce(setEntry)(undefined)
49
48
 
50
49
  /** @type {(name: string) => <T>(map: Map<T>) => Map<T>} */
51
50
  const remove = name => btRemove.remove(keyCmp(name))
@@ -19,8 +19,11 @@ const at = name => object => Object.getOwnPropertyDescriptor(object, name)?.valu
19
19
  /** @type {<T>(entries: list.List<Entry<T>>) => list.List<Entry<T>>} */
20
20
  const sort = entries => map.entries(map.fromEntries(entries))
21
21
 
22
+ /** @type {<T>(entries: list.List<Entry<T>>) => Map<T>} */
23
+ const fromEntries = entries => Object.fromEntries(list.iterable(entries))
24
+
22
25
  /** @type {<T>(m: map.Map<T>) => Map<T>} */
23
- const fromMap = m => Object.fromEntries(list.iterable(map.entries(m)))
26
+ const fromMap = m => fromEntries(map.entries(m))
24
27
 
25
28
  module.exports = {
26
29
  /** @readonly */
@@ -28,5 +31,7 @@ module.exports = {
28
31
  /** @readonly */
29
32
  sort,
30
33
  /** @readonly */
34
+ fromEntries,
35
+ /** @readonly */
31
36
  fromMap,
32
37
  }
@@ -4,7 +4,7 @@ const btSet = require('../btree/set')
4
4
  const btRemove = require('../btree/remove')
5
5
  const { stringCmp } = require("../function/compare")
6
6
  const list = require('../list')
7
- const { flip, compose } = require('../function')
7
+ const { compose } = require('../function')
8
8
 
9
9
  /** @typedef {btree.Tree<string>} StringSet */
10
10
 
@@ -17,7 +17,7 @@ const set = value => btSet.set(stringCmp(value))(value)
17
17
  /** @type {(s: StringSet) => list.List<string>} */
18
18
  const values = btree.values
19
19
 
20
- const fromValues = list.reduce(flip(set))(undefined)
20
+ const fromValues = list.reduce(set)(undefined)
21
21
 
22
22
  /** @type {(value: string) => (s: StringSet) => StringSet} */
23
23
  const remove = compose(stringCmp)(btRemove.remove)