-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.js
92 lines (72 loc) · 2.33 KB
/
base.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
const it = require('./it');
const Design = require('./design');
const Deque = require('./algo/deque');
const PriorityQueue = require('./algo/priority-queue');
const life = Symbol('_.life');
function $(...args) {
if (this !== global && this instanceof $) return $.ctor.call(this, ...args);
if (!args.length) return Object.create(null);
const type = guessType(args);
const res = guessActions[type](...args);
return res;
};
Object.setPrototypeOf($, null);
$.prototype = Object.create(null);
Design.$classApply($);
$.symbol = $.life = life;
$.keepAlive = Symbol('_.keepAlive');
const func_ = function func_(func, name) {
$[name || func.name] = func;
};
func_(function makeEnum(...args) {
const obj = Object.create(null);
const inv = Object.create(null);
obj.$ = inv;
let idx = 1;
for (const arg of args) {
if (typeof arg === 'object') {
$(arg).appendObject(obj).map($.invert).toObject(inv);
} else {
while (idx in inv) idx++;
obj[arg] = idx;
inv[idx] = arg;
idx++;
}
}
return obj;
}, 'enum');
const types = $.enum('unknown', 'null', 'number', 'object', 'Iter', 'AsIt');
function guessType(args) {
let guess = types.unknown;
for (const arg of args) {
let type;
if (arg == null) {
type = types.null;
} else if (arg[Symbol.asyncIterator]) {
type = types.AsIt;
} else if (arg[Symbol.iterator]) {
type = types.Iter;
} else if (typeof arg === 'object' || typeof arg === 'function') {
type = types.object;
} else if (typeof arg === 'number') {
type = types.number;
} else continue;
if (type > guess) guess = type;
}
return guess;
}
class UnknownArgsError extends Error { message = 'unknown argument set'; };
class NotImplementedError extends Error { message = 'method not yet implemented'; };
const guessActions = {
[types.unknown]() { throw new UnknownArgsError(); },
[types.null]() { return $.Iter.void(); },
[types.number](...args) { return $.Iter.range(...args); },
[types.object](...args) { return $.Iter.objectsEntries(...args); },
[types.Iter](...args) { return $.Iter.concat(...args); },
[types.AsIt](...args) { return $.AsIt.concat(...args); },
};
Object.assign($, it);
Object.assign($, {func_, UnknownArgsError, NotImplementedError});
$.Deque = $.DQ = Deque;
$.PriorityQueue = $.PQ = PriorityQueue;
module.exports = $;