functionalscript 0.0.229 → 0.0.233

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.
Files changed (41) hide show
  1. package/commonjs/index.js +11 -0
  2. package/commonjs/package/index.js +72 -0
  3. package/commonjs/package/test.js +33 -0
  4. package/commonjs/path/index.js +66 -0
  5. package/commonjs/path/test.js +47 -0
  6. package/commonjs/run/index.js +17 -0
  7. package/io/commonjs/index.js +28 -0
  8. package/io/commonjs/test.js +72 -0
  9. package/io/result/index.js +15 -0
  10. package/json/index.js +29 -29
  11. package/json/test.js +9 -9
  12. package/package.json +23 -23
  13. package/test.js +5 -6
  14. package/{sequence → types}/array/index.js +2 -2
  15. package/{btree → types/btree}/README.md +0 -0
  16. package/{btree → types/btree}/index.js +6 -6
  17. package/{btree → types/btree}/test.js +1 -1
  18. package/{cmp → types/function/compare}/index.js +6 -6
  19. package/{function → types/function}/index.js +0 -0
  20. package/{function → types/function}/operator/index.js +15 -0
  21. package/{map → types/map}/index.js +3 -3
  22. package/{map → types/map}/test.js +0 -0
  23. package/{object → types/object}/index.js +1 -2
  24. package/{object → types/object}/test.js +0 -0
  25. package/{option → types/option}/index.js +0 -0
  26. package/types/result/index.js +36 -0
  27. package/{sequence → types/sequence}/README.md +0 -0
  28. package/{sequence → types/sequence}/index.js +99 -50
  29. package/{sequence → types/sequence}/test.js +138 -11
  30. package/version.js +2 -2
  31. package/module-manager/README.md +0 -35
  32. package/module-manager/index.js +0 -110
  33. package/module-manager/node/index.js +0 -18
  34. package/module-manager/node/test.js +0 -75
  35. package/module-manager/test.js +0 -120
  36. package/result/index.js +0 -17
  37. package/sequence/asyncIterable/index.js +0 -111
  38. package/sequence/asyncIterable/test.js +0 -24
  39. package/sequence/iterable/index.js +0 -109
  40. package/sequence/iterable/test.js +0 -51
  41. package/sequence/operator/index.js +0 -92
package/version.js CHANGED
@@ -12,6 +12,6 @@ console.log(`version: ${v}`)
12
12
 
13
13
  let package_json = json.parse(fs.readFileSync('package.json').toString())
14
14
 
15
- package_json = json.addProperty(v)(['version'])(package_json)
15
+ package_json = json.setProperty(v)(['version'])(package_json)
16
16
 
17
- fs.writeFileSync('package.json', JSON.stringify(package_json, null, 3))
17
+ fs.writeFileSync('package.json', JSON.stringify(package_json, null, 2))
@@ -1,35 +0,0 @@
1
- # Module Manager
2
-
3
- ## Module Provider
4
-
5
- ```js
6
- /** @typedef {(packageName: string) => PackageMap|Package|undefined} PackageMap */
7
-
8
- /**
9
- * @typedef {readonly[
10
- * string,
11
- * PackageMap,
12
- * (fileName: string) => string|undefined
13
- * ]} Package
14
- */
15
- ```
16
-
17
- ## Runner IO
18
-
19
- The main target of this design is to simplify `RunnerIo` as much as possible.
20
-
21
- ```js
22
- /**
23
- * @template T
24
- * @typedef {readonly[Result<unknown, Error>, Require<T>]} RunnerResult
25
- */
26
-
27
- /** @typedef {<T>(require: Require<T>) => (source: string) => RunnerResult<T>} RunnerIo */
28
-
29
- /**
30
- * @template T
31
- * @typedef {readonly[(path: string) => RunnerResult<T>, T]} Require<T>
32
- */
33
- ```
34
-
35
- `Require` is using a `Package` and it contains also `RunnerIo` to provide sources also it contains
@@ -1,110 +0,0 @@
1
- const array = require('../sequence/array')
2
- const { compose } = require('../function')
3
- const option = require('../option')
4
- const { head, last, splitLast, splitFirst } = array
5
- const iter = require('../sequence/iterable')
6
- const seq = require('../sequence/operator')
7
-
8
- /**
9
- * @template T
10
- * @typedef {array.Array<T>} Array
11
- */
12
-
13
- /** @typedef {Array<string>} Path */
14
-
15
- /** @typedef {(_: string) => string|undefined} ReadFile */
16
-
17
- /**
18
- * @typedef {{
19
- * readonly id: Array<string>
20
- * readonly dependencies: Dependencies
21
- * readonly file: ReadFile
22
- * }} Package
23
- */
24
-
25
- /**
26
- * @typedef {{
27
- * readonly pack: Package,
28
- * readonly local: Array<string>,
29
- * }} Location
30
- */
31
-
32
- /**
33
- * @typedef {{
34
- * readonly fileName: string
35
- * readonly location: Location
36
- * readonly source: string
37
- * }} Module
38
- */
39
-
40
- /** @typedef {(_: string) => undefined|Package|Dependencies} Dependencies */
41
-
42
- /** @type {seq.ExclusiveScan<string, undefined|Path>} */
43
- const pathNormReduce = seq.exclusiveScan
44
- (path => item =>
45
- path === undefined ?
46
- undefined :
47
- ['', '.'].includes(item) ?
48
- path :
49
- item === '..' ?
50
- head(path) :
51
- [...path, item])
52
- ([])
53
-
54
- /** @type {(_: Array<string>) => boolean} */
55
- const isRelative = localId => ['.', '..'].includes(localId[0])
56
-
57
- const pathNorm = iter.reduce(pathNormReduce)
58
-
59
- /** @type {(_: Package) => (_: Path) => Module|undefined} */
60
- const internal = pack => {
61
- /** @type {(_: Path) => (_: string) => Module|undefined} */
62
- const readFile = local => fileName => {
63
- const source = pack.file([...local, fileName].join('/'))
64
- return source === undefined ? undefined : { fileName, location: { pack, local }, source}
65
- }
66
- return path => {
67
- /** @type {(_: Path) => Module|undefined} */
68
- const read = local => {
69
- /** @type {(_: readonly[Path, string]) => Module|undefined} */
70
- const tryFiles = ([head, file]) => {
71
- /** @type {(_: string) => Module|undefined} */
72
- const one = ext => readFile(head)(file + ext)
73
- return ['.', '..', '', undefined].includes(last(path)) ? undefined : one('') ?? one('.js')
74
- }
75
- return option.map(tryFiles)(splitLast(local)) ?? readFile(local)('index.js')
76
- }
77
- return option.map(read)(pathNorm(path))
78
- }
79
- }
80
-
81
- /** @type {(_: Package|Dependencies|undefined) => (_: Path) => Module|undefined} */
82
- const externalOrInternal = p =>
83
- p === undefined ? () => undefined : (typeof p === 'function' ? external(p) : internal(p))
84
-
85
- /** @type {(_: Dependencies) => (path: Path) => Module|undefined} */
86
- const external = packages => {
87
- /** @type {(_: readonly [string, Path]) => Module|undefined} */
88
- const defined = ([first, tail]) => externalOrInternal(packages(first))(tail)
89
- return path => option.map(defined)(splitFirst(path))
90
- }
91
-
92
- /** @type {(_: Location) => (_: string) => Module|undefined} */
93
- const getModule = ({pack, local}) => path => {
94
- const pathArray = path.split('/')
95
- return isRelative(pathArray) ? internal(pack)([...local, ...pathArray]) : external(pack.dependencies)(pathArray)
96
- }
97
-
98
- /** @type {(_: Module) => string} */
99
- const moduleId = module => [...module.location.pack.id, ...module.location.local, module.fileName].join('/')
100
-
101
- module.exports = {
102
- /** @readonly */
103
- isRelative,
104
- /** @readonly */
105
- pathNorm,
106
- /** @readonly */
107
- getModule,
108
- /** @readonly */
109
- moduleId,
110
- }
@@ -1,18 +0,0 @@
1
- const m = require('..')
2
-
3
- /** @type {(_: m.ReadFile) => m.Location} */
4
- module.exports = readFile => {
5
- /** @type {(_: string[]) => (_: string) => m.Package|m.Dependencies|undefined} */
6
- const packages = path => name => {
7
- const newPath = [...path, name]
8
- // we only need to check if 'package.json' exist
9
- return (readFile([...newPath, 'package.json'].join('/')) === undefined ? packages : pack)(newPath)
10
- }
11
- /** @type {(_: string[]) => m.Package} */
12
- const pack = path => ({
13
- id: path,
14
- dependencies: packages(['node_modules']),
15
- file: filePath => readFile([...path, ...filePath.split('/')].join('/'))
16
- })
17
- return { pack: pack([]), local: [] }
18
- }
@@ -1,75 +0,0 @@
1
- const mm = require('..')
2
- const i = require('.')
3
-
4
- /** @type {{ readonly [_ in string]: string}} */
5
- const files = {
6
- 'index.js': './index.js',
7
- 'a/index.js': './a/index.js',
8
- 'a/b/x.js': './a/b/x.js',
9
- 'c/t.js': './c/t.js',
10
- 'node_modules/@functionalscript/functionalscript/package.json': '',
11
- 'node_modules/@functionalscript/functionalscript/index.js': '@functionalscript/functionalscript ./index.js',
12
- 'node_modules/my/package.json': '',
13
- 'node_modules/my/src/x.js': 'my ./src/x.js',
14
- 'node_modules/my/b/index.js': 'my ./b/index.js',
15
- }
16
-
17
- /** @type {(_: string) => string|undefined} */
18
- const readFile = path => files[path]
19
-
20
- const root = i(readFile)
21
-
22
- {
23
- const index = mm.getModule(root)('.')
24
- if (index === undefined) { throw 'no module' }
25
- if (index.fileName !== 'index.js') { throw 'fileName' }
26
- if (index.source !== './index.js') { throw 'source' }
27
- if (index.location.local.join('/') !== '') { throw 'location' }
28
- if (index.location.pack.id.join('/') !== '') { throw 'pack.id' }
29
- if (mm.moduleId(index) !== 'index.js') { throw 'moduleId' }
30
- const a = mm.getModule(index.location)('./a')
31
- if (a === undefined) { throw 'no module' }
32
- if (a.fileName !== 'index.js') { throw 'fileName' }
33
- if (a.source !== './a/index.js') { throw 'source' }
34
- if (a.location.local.join('/') !== 'a') { throw 'location' }
35
- if (a.location.pack.id.join('/') !== '') { throw 'pack.id' }
36
- if (mm.moduleId(a) !== 'a/index.js') { throw 'moduleId' }
37
- const abx = mm.getModule(a.location)('./b/x')
38
- if (abx === undefined) { throw 'no module' }
39
- if (abx.fileName !== 'x.js') { throw 'fileName' }
40
- if (abx.source !== './a/b/x.js') { throw 'source' }
41
- if (abx.location.local.join('/') !== 'a/b') { throw 'location' }
42
- if (abx.location.pack.id.join('/') !== '') { throw 'pack.id' }
43
- if (mm.moduleId(abx) !== 'a/b/x.js') { throw 'moduleId' }
44
- const ct = mm.getModule(abx.location)('../../c/t.js')
45
- if (ct === undefined) { throw 'no module' }
46
- if (ct.fileName !== 't.js') { throw 'fileName' }
47
- if (ct.source !== './c/t.js') { throw 'source' }
48
- if (ct.location.local.join('/') !== 'c') { throw 'location' }
49
- if (ct.location.pack.id.join('/') !== '') { throw 'pack.id' }
50
- if (mm.getModule(ct.location)('./d') !== undefined) { throw 'no module' }
51
- if (mm.getModule(ct.location)('@functionalscript') !== undefined) { throw 'no module' }
52
- if (mm.moduleId(ct) !== 'c/t.js') { throw 'moduleId' }
53
- const fs = mm.getModule(ct.location)('@functionalscript/functionalscript')
54
- if (fs === undefined) { throw 'no module' }
55
- if (fs.source !== '@functionalscript/functionalscript ./index.js') { throw 'source' }
56
- if (fs.fileName !== 'index.js') { throw 'fileName' }
57
- if (fs.location.local.join('/') !== '') { throw 'location' }
58
- if (fs.location.pack.id.join('/') !== 'node_modules/@functionalscript/functionalscript') { throw 'pack.id' }
59
- if (mm.getModule(fs.location)('my/src/x/') !== undefined) { throw 'no module '}
60
- if (mm.moduleId(fs) !== 'node_modules/@functionalscript/functionalscript/index.js') { throw 'moduleId' }
61
- const mySrcX = mm.getModule(fs.location)('my/src/x')
62
- if (mySrcX === undefined) { throw 'no module' }
63
- if (mySrcX.fileName !== 'x.js') { throw 'fileName' }
64
- if (mySrcX.source !== 'my ./src/x.js') { throw 'source' }
65
- if (mySrcX.location.local.join('/') !== 'src') { throw 'location' }
66
- if (mySrcX.location.pack.id.join('/') !== 'node_modules/my') { throw 'pack.id' }
67
- if (mm.moduleId(mySrcX) !== 'node_modules/my/src/x.js') { throw 'moduleId' }
68
- const myB = mm.getModule(mySrcX.location)('../b/')
69
- if (myB === undefined) { throw 'no module' }
70
- if (myB.fileName !== 'index.js') { throw 'fileName' }
71
- if (myB.source !== 'my ./b/index.js') { throw 'source' }
72
- if (myB.location.local.join('/') !== 'b') { throw 'location' }
73
- if (myB.location.pack.id.join('/') !== 'node_modules/my') { throw 'pack.id' }
74
- if (mm.moduleId(myB) !== 'node_modules/my/b/index.js') { throw 'moduleId' }
75
- }
@@ -1,120 +0,0 @@
1
- const i = require('.')
2
-
3
- require('./node/test')
4
-
5
- /** @type {<T>(_: T | undefined) => T} */
6
- const cast = x => {
7
- if (x === undefined) { throw 'x' }
8
- return x
9
- }
10
-
11
- if (i.isRelative('a/b/c'.split('/'))) { throw 'error '}
12
- if (!i.isRelative('./a/b/c'.split('/'))) { throw 'error ' }
13
- if (cast(i.pathNorm('a/../b'.split('/'))).join('/') !== 'b') { throw 'error ' }
14
- if (cast(i.pathNorm('a/../b/../c'.split('/'))).join('/') !== 'c') { throw 'error ' }
15
- if (cast(i.pathNorm('./a/../b/c/..//d/'.split('/'))).join('/') !== 'b/d') { throw 'error ' }
16
-
17
- {
18
- /** @type {i.Package} */
19
- const a = {
20
- dependencies: () => undefined,
21
- file: path => {
22
- /** @type {{ [_ in string]?: string}} */
23
- const f = {
24
- 'index.js': 'a ./index.js',
25
- }
26
- return f[path]
27
- },
28
- id: ['a']
29
- }
30
- /** @type {i.Package} */
31
- const c = {
32
- dependencies: () => undefined,
33
- file: path => {
34
- /** @type {{ readonly [_ in string]?: string}} */
35
- const f = {
36
- 'index.js': 'b/c ./index.js',
37
- 'x/index.js': 'b/c ./x/index.js',
38
- }
39
- if (['.js', '', 'undefined.js'].includes(path)) { throw '.js' }
40
- return f[path]
41
- },
42
- id: ['c']
43
- }
44
- /** @type {{ readonly [_ in string]: i.Package|i.Dependencies}} */
45
- const packages = {
46
- a,
47
- b: s => {
48
- /** @type {{ readonly [_ in string]: i.Package|i.Dependencies}} */
49
- const p = { c }
50
- return p[s]
51
- }
52
- }
53
- /** @type {i.Package} */
54
- const pack = {
55
- dependencies: s => packages[s],
56
- file: path => {
57
- /** @type {{ readonly [_ in string]?: string}} */
58
- const f = {
59
- 'index.js': './index.js',
60
- 'index/index.js': './index/index.js',
61
- 'a/index.js': './a/index.js',
62
- 'a/index.js.js': './a/index.js.js',
63
- }
64
- if (['.js', '', 'undefined.js'].includes(path)) { throw '.js' }
65
- return f[path]
66
- },
67
- id: ['']
68
- }
69
- /** @type {(_: i.Module|undefined) => (_: i.Module) => void} */
70
- const expect = a => b => {
71
- if (a === undefined) { throw 'undefined' }
72
- if (a.location.local.join('/') !== b.location.local.join('/')) { throw 'local'}
73
- if (a.location.pack !== b.location.pack) { throw 'pack' }
74
- if (a.source !== b.source) { throw 'source' }
75
- }
76
- {
77
- const g = i.getModule({pack, local: []})
78
- if (g('') !== undefined) { throw 'error' }
79
- if (g('..') !== undefined) { throw 'error' }
80
- expect(g('.'))({ fileName: 'index.js', location: { pack, local: []}, source: './index.js'})
81
- expect(g('./index'))({ fileName: 'index.js', location: { pack, local: []}, source: './index.js'})
82
- expect(g('./index.js'))({ fileName: 'index.js', location: { pack, local: []}, source: './index.js'})
83
- expect(g('./index/'))({ fileName: 'index.js', location: { pack, local: ['index']}, source: './index/index.js'})
84
- expect(g('./a'))({ fileName: 'index.js', location: { pack, local: ['a']}, source: './a/index.js'})
85
- expect(g('./a/index'))({ fileName: 'index.js', location: { pack, local: ['a']}, source: './a/index.js'})
86
- expect(g('./a/index.js'))({ fileName: 'index.js.js', location: { pack, local: ['a']}, source: './a/index.js'})
87
- if (g('./x') !== undefined) { throw 'error' }
88
- expect(g('a'))({ fileName: 'index.js', location: { pack: a, local: []}, source: 'a ./index.js'})
89
- expect(g('a/index'))({ fileName: 'index.js', location: { pack: a, local: []}, source: 'a ./index.js'})
90
- if (g('b') !== undefined) { throw 'error' }
91
- expect(g('b/c'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
92
- expect(g('b/c/index'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
93
- expect(g('b/c/index.js'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
94
- expect(g('b/c/x'))({ fileName: 'index.js', location: { pack: c, local: ['x']}, source: 'b/c ./x/index.js'})
95
- expect(g('b/c/r/..'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
96
- }
97
- {
98
- const g = i.getModule({pack, local: ['index']})
99
- if (g('') !== undefined) { throw 'error' }
100
- expect(g('..'))({ fileName: 'index.js', location: { pack, local: []}, source: './index.js'})
101
- expect(g('.'))({ fileName: 'index.js', location: { pack, local: ['index']}, source: './index/index.js'})
102
- expect(g('./index'))({ fileName: 'index.js', location: { pack, local: ['index']}, source: './index/index.js'})
103
- expect(g('./index.js'))({ fileName: 'index.js', location: { pack, local: ['index']}, source: './index/index.js'})
104
- if (g('./index/') !== undefined) { throw 'error' }
105
- if (g('./a') !== undefined) { throw 'error' }
106
- expect(g('../a'))({ fileName: 'index.js', location: { pack, local: ['a']}, source: './a/index.js'})
107
- expect(g('../a/index'))({ fileName: 'index.js', location: { pack, local: ['a']}, source: './a/index.js'})
108
- expect(g('../a/index.js'))({ fileName: 'index.js', location: { pack, local: ['a']}, source: './a/index.js'})
109
- expect(g('../a/index.js.js'))({ fileName: 'index.js.js', location: { pack, local: ['a']}, source: './a/index.js.js'})
110
- if (g('./x') !== undefined) { throw 'error' }
111
- expect(g('a'))({ fileName: 'index.js', location: { pack: a, local: []}, source: 'a ./index.js'})
112
- expect(g('a/index'))({ fileName: 'index.js', location: { pack: a, local: []}, source: 'a ./index.js'})
113
- if (g('b') !== undefined) { throw 'error' }
114
- expect(g('b/c'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
115
- expect(g('b/c/index'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
116
- expect(g('b/c/index.js'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
117
- expect(g('b/c/x'))({ fileName: 'index.js', location: { pack: c, local: ['x']}, source: 'b/c ./x/index.js'})
118
- expect(g('b/c/r/..'))({ fileName: 'index.js', location: { pack: c, local: []}, source: 'b/c ./index.js'})
119
- }
120
- }
package/result/index.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * @template T
3
- * @typedef {readonly['ok', T]} Ok
4
- */
5
-
6
- /**
7
- * @template E
8
- * @typedef {readonly['error', E]} Error
9
- */
10
-
11
- /**
12
- * @template T
13
- * @template E
14
- * @typedef {Ok<T>|Error<E>} Result
15
- */
16
-
17
- module.exports = {}
@@ -1,111 +0,0 @@
1
- const { compose } = require('../../function')
2
- const seq = require('../operator')
3
-
4
- /**
5
- * @template T
6
- * @typedef {Promise<T>|T} PromiseOrValue
7
- */
8
-
9
- /**
10
- * @template T
11
- * @typedef {Iterable<T> | AsyncIterable<T>} AsyncOrSyncIterable
12
- */
13
-
14
- /** @type {<T>(c: AsyncOrSyncIterable<AsyncOrSyncIterable<T>>) => AsyncIterable<T>} */
15
- const flat = c => ({
16
- async *[Symbol.asyncIterator]() {
17
- for await (const i of c) {
18
- yield* i
19
- }
20
- }
21
- })
22
-
23
- /** @type {<T, R>(f: (value: T) => AsyncOrSyncIterable<R>) => (c: AsyncOrSyncIterable<T>) => AsyncIterable<R>} */
24
- const flatMap = f => c => ({
25
- async *[Symbol.asyncIterator]() {
26
- for await (const i of c) {
27
- yield* await f(i)
28
- }
29
- }
30
- })
31
-
32
- /** @type {<T, R>(f: (value: T) => R) => (c: AsyncOrSyncIterable<T>) => AsyncIterable<R>} */
33
- const map = seq.map(flatMap)
34
-
35
- /** @type {<T>(f: (value: T) => boolean) => (c: AsyncOrSyncIterable<T>) => AsyncOrSyncIterable<T>} */
36
- const filter = seq.filter(flatMap)
37
-
38
- /** @type {<T>(a: AsyncOrSyncIterable<T>) => (b: AsyncOrSyncIterable<T>) => AsyncIterable<T>} */
39
- const concat = a => b => ({
40
- async *[Symbol.asyncIterator]() {
41
- yield* a
42
- yield* b
43
- }
44
- })
45
-
46
- /** @type {<T, R>(s: seq.Scan<T, R>) => (c: AsyncOrSyncIterable<T>) => AsyncIterable<R>} */
47
- const scan = s => c => ({
48
- async *[Symbol.asyncIterator]() {
49
- let next = s
50
- for await (const i of c) {
51
- const result = next(i)
52
- next = result[1]
53
- yield result[0]
54
- }
55
- }
56
- })
57
-
58
- /** @type {<T, R>(s: seq.ExclusiveScan<T, R>) => (c: AsyncOrSyncIterable<T>) => AsyncIterable<R>} */
59
- const exclusiveScan = ([first, s]) => c => concat([first])(scan(s)(c))
60
-
61
- /** @type {<T, R>(is: seq.ExclusiveScan<T, R>) => (c: AsyncOrSyncIterable<T>) => Promise<R>} */
62
- const reduce = ([first, s]) => async c => {
63
- let next = first
64
- for await (const i of scan(s)(c)) {
65
- next = i
66
- }
67
- return next
68
- }
69
-
70
- const sum = reduce(seq.sum)
71
-
72
- const join = compose(seq.join)(reduce)
73
-
74
- const length = reduce(seq.length)
75
-
76
- /** @type {<T>(f: (value: T) => boolean) => (c: AsyncOrSyncIterable<T>) => AsyncIterable<T>} */
77
- const takeWhile = f => c => ({
78
- async *[Symbol.asyncIterator]() {
79
- for await (const i of c) {
80
- if (!f(i)) { return }
81
- yield i
82
- }
83
- }
84
- })
85
-
86
- module.exports = {
87
- /** @readonly */
88
- concat,
89
- /** @readonly */
90
- flat,
91
- /** @readonly */
92
- map,
93
- /** @readonly */
94
- filter,
95
- /** @readonly */
96
- flatMap,
97
- /** @readonly */
98
- reduce,
99
- /** @readonly */
100
- sum,
101
- /** @readonly */
102
- length,
103
- /** @readonly */
104
- join,
105
- /** @readonly */
106
- scan,
107
- /** @readonly */
108
- exclusiveScan,
109
- /** @readonly */
110
- takeWhile,
111
- }
@@ -1,24 +0,0 @@
1
- const { map, filter, flatMap, sum } = require('.')
2
-
3
- const test = async () => {
4
- {
5
- const a = [1, 2, 3]
6
- const m = map(x => x * x)(a)
7
- const result = await sum(m)
8
- if (result !== 14) { throw 'filter' }
9
- }
10
- {
11
- const a = [1, 2, 3, 4]
12
- const f = filter(x => x !== 2)(a)
13
- const result = await sum(f)
14
- if (result !== 8) { throw 'filter' }
15
- }
16
- {
17
- const a = [1, 2]
18
- const f = flatMap(x => [x, x * x])(a)
19
- const result = await sum(f)
20
- if (result !== 8) { throw 'filter' }
21
- }
22
- }
23
-
24
- test()
@@ -1,109 +0,0 @@
1
- const { compose } = require('../../function')
2
- const seq = require('../operator')
3
-
4
- /** @type {<T>(a: Iterable<T>) => (b: Iterable<T>) => Iterable<T>} */
5
- const concat = a => b => ({
6
- *[Symbol.iterator]() {
7
- yield* a
8
- yield* b
9
- }
10
- })
11
-
12
- /** @type {<T, R>(s: seq.Scan<T, R>) => (c: Iterable<T>) => Iterable<R>} */
13
- const scan = s => c => ({
14
- *[Symbol.iterator]() {
15
- let next = s
16
- for (const i of c) {
17
- const result = next(i)
18
- next = result[1]
19
- yield result[0]
20
- }
21
- }
22
- })
23
-
24
- /** @type {<T, R>(s: seq.ExclusiveScan<T, R>) => (c: Iterable<T>) => Iterable<R>} */
25
- const exclusiveScan = ([first, s]) => c => concat([first])(scan(s)(c))
26
-
27
- /** @type {<T, R>(s: seq.ExclusiveScan<T, R>) => (c: Iterable<T>) => R} */
28
- const reduce = ([first, s]) => c => {
29
- let next = first
30
- for (const i of scan(s)(c)) {
31
- next = i
32
- }
33
- return next
34
- }
35
-
36
- const entries = scan(seq.entries)
37
-
38
- const sum = reduce(seq.sum)
39
-
40
- const length = reduce(seq.length)
41
-
42
- const join = compose(seq.join)(reduce)
43
-
44
- /** @type {<T, R>(f: (value: T) => Iterable<R>) => (c: Iterable<T>) => Iterable<R>} */
45
- const flatMap = f => c => ({
46
- *[Symbol.iterator]() {
47
- for (const i of c) {
48
- yield* f(i)
49
- }
50
- }
51
- })
52
-
53
- /** @type {<T, R>(f: (value: T) => R) => (c: Iterable<T>) => Iterable<R>} */
54
- const map = seq.map(flatMap)
55
-
56
- /** @type {<T>(f: (value: T) => boolean) => (c: Iterable<T>) => Iterable<T>} */
57
- const filter = seq.filter(flatMap)
58
-
59
- /** @type {<T>(c: Iterable<Iterable<T>>) => Iterable<T>} */
60
- const flat = flatMap(x => x)
61
-
62
- /** @type {<T>(f: (value: T) => boolean) => (c: Iterable<T>) => Iterable<T>} */
63
- const takeWhile = f => c => ({
64
- *[Symbol.iterator]() {
65
- for (const i of c) {
66
- if (!f(i)) { return }
67
- yield i
68
- }
69
- }
70
- })
71
-
72
- /** @type {<T>(_: (_: T) => boolean) => (_: Iterable<T>) => T|undefined} */
73
- const find = f => c => {
74
- for (const i of c) {
75
- if (f(i)) {
76
- return i
77
- }
78
- }
79
- return undefined
80
- }
81
-
82
- module.exports = {
83
- /** @readonly */
84
- reduce,
85
- /** @readonly */
86
- join,
87
- /** @readonly */
88
- sum,
89
- /** @readonly */
90
- length,
91
- /** @readonly */
92
- entries,
93
- /** @readonly */
94
- scan,
95
- /** @readonly */
96
- exclusiveScan,
97
- /** @readonly */
98
- flatMap,
99
- /** @readonly */
100
- map,
101
- /** @readonly */
102
- filter,
103
- /** @readonly */
104
- flat,
105
- /** @readonly */
106
- takeWhile,
107
- /** @readonly */
108
- find,
109
- }