pepka 0.13.0-beta12 → 0.14.0-beta1
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/dist/bundle.d.ts +27 -7
- package/dist/bundle.dev.js +29 -4
- package/dist/bundle.esm.js +1 -1
- package/dist/bundle.js +1 -1
- package/package.json +2 -2
- package/src/common.ts +3 -1
- package/src/curry.ts +1 -1
- package/src/quick.ts +2 -0
- package/src/safe.ts +22 -9
- package/src/strings.ts +21 -9
- package/tsconfig.json +2 -1
- package/src/common.js +0 -13
- package/src/curry.js +0 -68
- package/src/index.js +0 -6
- package/src/quick.js +0 -82
- package/src/safe.js +0 -243
- package/src/strings.js +0 -42
- package/src/types.js +0 -1
- package/src/uncurry.js +0 -3
- package/src/utils.js +0 -11
package/dist/bundle.d.ts
CHANGED
|
@@ -27,6 +27,13 @@ export declare const uncurry: <Args extends any[] = any[], ReturnT = any>(fn: Cu
|
|
|
27
27
|
export declare const toLower: (s: string) => string;
|
|
28
28
|
export declare const toUpper: (s: string) => string;
|
|
29
29
|
export declare const type: (s: any) => any;
|
|
30
|
+
export declare const typeIs: {
|
|
31
|
+
(a: symbol, b: any): (a: string) => boolean;
|
|
32
|
+
(a: string, b: symbol): (b: any) => boolean;
|
|
33
|
+
(a: string): (b: any) => boolean;
|
|
34
|
+
(a: string, b: any): boolean;
|
|
35
|
+
};
|
|
36
|
+
export declare const take: (argN: number) => (...args: any[]) => any;
|
|
30
37
|
export declare const equals: {
|
|
31
38
|
(a: symbol, b: any): (a: any) => boolean;
|
|
32
39
|
(a: any, b: symbol): (b: any) => boolean;
|
|
@@ -35,8 +42,8 @@ export declare const equals: {
|
|
|
35
42
|
};
|
|
36
43
|
export declare const ifElse: FT.Curry<AnyFunc<any, AnyArgs>>;
|
|
37
44
|
export declare const when: FT.Curry<(cond: (s: any) => boolean, pipe: (s: any) => any, s: any) => any>;
|
|
38
|
-
export type Composed<TIn, TOut> = (
|
|
39
|
-
export declare const compose: <TIn = any, TOut = any>(...fns: AnyFunc[]) => Composed<TIn, TOut>;
|
|
45
|
+
export type Composed<TIn extends any[], TOut> = (...xs: TIn) => TOut;
|
|
46
|
+
export declare const compose: <TIn extends any[] = any[], TOut = any>(...fns: AnyFunc[]) => Composed<TIn, TOut>;
|
|
40
47
|
export declare const bind: {
|
|
41
48
|
(a: symbol, b: any): (a: any) => any;
|
|
42
49
|
(a: any, b: symbol): (b: any) => any;
|
|
@@ -56,6 +63,8 @@ export declare const includes: {
|
|
|
56
63
|
(a: unknown, b: unknown[]): boolean;
|
|
57
64
|
};
|
|
58
65
|
export declare const slice: FT.Curry<(from: number, to: number, o: any[] | string) => string | any[]>;
|
|
66
|
+
export type TupleFn<ARG1 = any, ARG2 = any, Out = any> = (a: ARG1, b: ARG2) => Out;
|
|
67
|
+
export declare const flip: <ARG1 = any, ARG2 = any, Out = any>(fn: FT.Curry<TupleFn<ARG1, ARG2, Out>>) => FT.Curry<TupleFn<ARG2, ARG1, Out>>;
|
|
59
68
|
export declare const head: (b: string | unknown[]) => unknown;
|
|
60
69
|
export declare const tail: FT.Curry<(o: string | any[]) => string | any[]>;
|
|
61
70
|
export declare const add: {
|
|
@@ -70,7 +79,18 @@ export declare const subtract: {
|
|
|
70
79
|
(a: number): (b: number) => number;
|
|
71
80
|
(a: number, b: number): number;
|
|
72
81
|
};
|
|
73
|
-
export declare const
|
|
82
|
+
export declare const multiply: {
|
|
83
|
+
(a: symbol, b: number): (a: number) => number;
|
|
84
|
+
(a: number, b: symbol): (b: number) => number;
|
|
85
|
+
(a: number): (b: number) => number;
|
|
86
|
+
(a: number, b: number): number;
|
|
87
|
+
};
|
|
88
|
+
export declare const divide: {
|
|
89
|
+
(a: symbol, b: number): (a: number) => number;
|
|
90
|
+
(a: number, b: symbol): (b: number) => number;
|
|
91
|
+
(a: number): (b: number) => number;
|
|
92
|
+
(a: number, b: number): number;
|
|
93
|
+
};
|
|
74
94
|
export declare const isNil: (s: any) => boolean;
|
|
75
95
|
export declare const length: (s: any[] | string) => number;
|
|
76
96
|
export declare const always: <T = any>(s: T) => () => T;
|
|
@@ -104,10 +124,10 @@ export declare const append: {
|
|
|
104
124
|
(a: any, b: any[]): any[];
|
|
105
125
|
};
|
|
106
126
|
export declare const split: {
|
|
107
|
-
(a: symbol, b: string): (a: string) => string[];
|
|
108
|
-
(a: string, b: symbol): (b: string) => string[];
|
|
109
|
-
(a: string): (b: string) => string[];
|
|
110
|
-
(a: string, b: string): string[];
|
|
127
|
+
(a: symbol, b: string): (a: string | RegExp) => string[];
|
|
128
|
+
(a: string | RegExp, b: symbol): (b: string) => string[];
|
|
129
|
+
(a: string | RegExp): (b: string) => string[];
|
|
130
|
+
(a: string | RegExp, b: string): string[];
|
|
111
131
|
};
|
|
112
132
|
export declare const T: (...args: any[]) => true;
|
|
113
133
|
export declare const F: (...args: any[]) => false;
|
package/dist/bundle.dev.js
CHANGED
|
@@ -90,8 +90,10 @@ const type = (s) => {
|
|
|
90
90
|
return t === 'object'
|
|
91
91
|
? isNull(s) ? 'Null' : s.constructor.name
|
|
92
92
|
: caseMap[t[0]] + t.slice(1);
|
|
93
|
-
};
|
|
93
|
+
};
|
|
94
|
+
const typeIs = curry2((t, s) => type(s) === t);
|
|
94
95
|
|
|
96
|
+
// TODO: qmap, qfilter.
|
|
95
97
|
const qappend = curry2((s, xs) => { xs.push(s); return xs; });
|
|
96
98
|
const qassoc = curry3((prop, v, obj) => {
|
|
97
99
|
obj[prop] = v;
|
|
@@ -174,7 +176,17 @@ const qindexOf = curry2((x, xs) => xs.indexOf(x));
|
|
|
174
176
|
// TODO: possibly introduce a second argument limiting unfolding.
|
|
175
177
|
const uncurry = (fn) => (...args) => qreduce(((fn, arg) => fn ? fn(arg) : fn), fn, args);
|
|
176
178
|
|
|
177
|
-
// over, lensProp
|
|
179
|
+
// SomeType, totype, over, lensProp
|
|
180
|
+
// take (if not exsit in ramda):
|
|
181
|
+
/* res = code.replace(/css\`((.|\s)*?)\`/g, (_, g1) => {
|
|
182
|
+
return compressRules(g1)
|
|
183
|
+
}) ->
|
|
184
|
+
res = code.replace(/css\`((.|\s)*?)\`/g, compose(
|
|
185
|
+
compressRules,
|
|
186
|
+
take(2) // second arg
|
|
187
|
+
))
|
|
188
|
+
*/
|
|
189
|
+
const take = (argN) => (...args) => args[argN];
|
|
178
190
|
const equals = curry2((a, b) => {
|
|
179
191
|
const typea = type(a);
|
|
180
192
|
if (typea === type(b) && (typea === 'Object' || typea == 'Array')) {
|
|
@@ -198,9 +210,16 @@ const equals = curry2((a, b) => {
|
|
|
198
210
|
});
|
|
199
211
|
const ifElse = curry((cond, pipeYes, pipeNo, s) => cond(s) ? pipeYes(s) : pipeNo(s));
|
|
200
212
|
const when = curry3((cond, pipe, s) => ifElse(cond, pipe, identity, s));
|
|
201
|
-
const compose = ((...fns) => (
|
|
213
|
+
const compose = ((...fns) => (...args) => {
|
|
214
|
+
let first = true;
|
|
215
|
+
let s;
|
|
202
216
|
for (let i = length(fns) - 1; i > -1; i--) {
|
|
203
|
-
|
|
217
|
+
if (first) {
|
|
218
|
+
first = false;
|
|
219
|
+
s = fns[i](...args);
|
|
220
|
+
}
|
|
221
|
+
else
|
|
222
|
+
s = s === __ ? fns[i]() : fns[i](s);
|
|
204
223
|
}
|
|
205
224
|
return s;
|
|
206
225
|
});
|
|
@@ -225,6 +244,8 @@ const head = nth(0);
|
|
|
225
244
|
const tail = slice(1, inf); // typeshit.
|
|
226
245
|
const add = curry2((n, m) => n + m);
|
|
227
246
|
const subtract = curry2((n, m) => m - n);
|
|
247
|
+
const multiply = curry2((n, m) => n * m);
|
|
248
|
+
const divide = curry2((n, m) => n / m);
|
|
228
249
|
const flip = (fn) => curry((b, a) => fn(a, b));
|
|
229
250
|
const isNil = (s) => isNull(s) || isUndef(s);
|
|
230
251
|
const length = (s) => s.length;
|
|
@@ -466,6 +487,8 @@ var pepka = /*#__PURE__*/Object.freeze({
|
|
|
466
487
|
toLower: toLower,
|
|
467
488
|
toUpper: toUpper,
|
|
468
489
|
type: type,
|
|
490
|
+
typeIs: typeIs,
|
|
491
|
+
take: take,
|
|
469
492
|
equals: equals,
|
|
470
493
|
ifElse: ifElse,
|
|
471
494
|
when: when,
|
|
@@ -478,6 +501,8 @@ var pepka = /*#__PURE__*/Object.freeze({
|
|
|
478
501
|
tail: tail,
|
|
479
502
|
add: add,
|
|
480
503
|
subtract: subtract,
|
|
504
|
+
multiply: multiply,
|
|
505
|
+
divide: divide,
|
|
481
506
|
flip: flip,
|
|
482
507
|
isNil: isNil,
|
|
483
508
|
length: length,
|
package/dist/bundle.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=Symbol("Placeholder"),r=r=>{let t=0;for(const n of r)n!==e&&t++;return t},t=(r,t)=>{const n=r.length,s=r.slice(),c=t.length;let o=c,u=0;for(;o&&u<n;u++)s[u]===e&&(s[u]=t[c-o],o--);for(u=n;o;u++,o--)s[u]=t[c-o];return s},n=(e,s,c)=>{const o=e.length-s.length-r(c);if(o<1)return e(...t(s,c));{const r=(...r)=>n(e,t(s,c),r);return r.$args_left=o,r}},s=e=>(...t)=>e.length>r(t)?n(e,[],t):e(...t),c=r=>function(t){return t===e?r:r(t)};function o(r){return function(t,n){const s=t===e,o=arguments.length;if(1===o&&s)throw new Error("Senseless placeholder usage.");return arguments.length>1?s?c((e=>r(e,n))):r(t,n):e=>r(t,e)}}function u(e){return s(e)}const a=void 0,
|
|
1
|
+
const e=Symbol("Placeholder"),r=r=>{let t=0;for(const n of r)n!==e&&t++;return t},t=(r,t)=>{const n=r.length,s=r.slice(),c=t.length;let o=c,u=0;for(;o&&u<n;u++)s[u]===e&&(s[u]=t[c-o],o--);for(u=n;o;u++,o--)s[u]=t[c-o];return s},n=(e,s,c)=>{const o=e.length-s.length-r(c);if(o<1)return e(...t(s,c));{const r=(...r)=>n(e,t(s,c),r);return r.$args_left=o,r}},s=e=>(...t)=>e.length>r(t)?n(e,[],t):e(...t),c=r=>function(t){return t===e?r:r(t)};function o(r){return function(t,n){const s=t===e,o=arguments.length;if(1===o&&s)throw new Error("Senseless placeholder usage.");return arguments.length>1?s?c((e=>r(e,n))):r(t,n):e=>r(t,e)}}function u(e){return s(e)}const a=void 0,i=1/0,l=e=>typeof e,f=e=>null===e,h=e=>"number"==l(e),b=e=>Array.isArray(e),g=e=>"function"===l(e),p={u:"U",b:"B",n:"N",s:"S",f:"F"},y=e=>e.toLowerCase(),d=e=>e.toUpperCase(),j=e=>{const r=l(e);return"object"===r?f(e)?"Null":e.constructor.name:p[r[0]]+r.slice(1)},m=o(((e,r)=>j(r)===e)),w=o(((e,r)=>(r.push(e),r))),O=u(((e,r,t)=>(t[e]=r,t))),A=u(((e,r,t)=>t.reduce(e,r))),S=u(((e,r,t)=>{for(let n in t)switch(j(t[n])){case"Array":if(e>1&&"Array"===j(r[n]))switch(e){case 2:const s=r[n],c=t[n];for(const r in c)s[r]?S(e,s[r],c[r]):s[r]=c[r];break;case 3:r[n].push(...t[n])}else r[n]=t[n];break;case"Object":if("Object"===j(r[n])){S(e,r[n],t[n]);break}default:r[n]=t[n]}return r})),k=S(1),v=S(2),N=S(3),x=o(((e,r)=>{let t,n,s,c;for(t in e)n=e[t],[s,c]=g(n)?n(r):[n,r[t]],r[s]=c,t!==s&&delete r[t];return r})),C=o(((e,r)=>{const t=b(r);for(let n in r)e(r[n],n)||(t?r.splice(n,1):delete r[n]);return r})),P=o(((e,r)=>r.indexOf(e))),$=e=>(...r)=>A(((e,r)=>e?e(r):e),e,r),B=e=>(...r)=>r[e],E=o(((e,r)=>{const t=j(e);if(t===j(r)&&("Object"===t||"Array"==t)){if(f(e)||f(r))return e===r;if(e===r)return!0;for(const t of[e,r])for(const n in t)if(!(t===r&&n in e||t===e&&n in r&&E(e[n],r[n])))return!1;return!0}return e===r})),U=s(((e,r,t,n)=>e(n)?r(n):t(n))),_=u(((e,r,t)=>U(e,r,W,t))),F=(...r)=>(...t)=>{let n,s=!0;for(let c=T(r)-1;c>-1;c--)s?(s=!1,n=r[c](...t)):n=n===e?r[c]():r[c](n);return n},I=o(((e,r)=>e.bind(r))),L=o(((e,r)=>r[e])),q=o(((e,r)=>{if((e=>"string"===l(e))(r))return r.includes(e);for(const t of r)if(E(t,e))return!0;return!1})),z=u(((e,r,t)=>t.slice(e,h(r)?r:i))),D=e=>o(((r,t)=>e(t,r))),G=L(0),H=z(1,i),J=o(((e,r)=>e+r)),K=o(((e,r)=>r-e)),M=o(((e,r)=>e*r)),Q=o(((e,r)=>e/r)),R=e=>f(e)||(e=>e===a)(e),T=e=>e.length,V=e=>()=>e,W=e=>e,X=e=>e.trim(),Y=e=>e[T(e)-1],Z=e=>!e,ee=e=>(...r)=>{const t=e(...r);return g(t)&&t.$args_left?ee(t):Z(t)},re=e=>Object.keys(e),te=e=>Object.values(e),ne=e=>Object.entries(e),se=o(((e,r)=>e.test(r))),ce=o(((e,r)=>(e(r),r))),oe=o(((e,r)=>[...r,e])),ue=o(((e,r)=>r.split(e))),ae=V(!0),ie=V(!1),le=e=>{if("Object"===j(e)){let r=0;for(let t in e)r++;return r}return T(e)},fe=o(((e,r)=>ge(J(e),r-e))),he=e=>A(((e,r)=>q(r,e)?e:w(r,e)),[],e),be=o(((e,r)=>e.filter(D(q)(r)))),ge=o(((e,r)=>[...Array(r)].map(((r,t)=>e(t))))),pe=e=>{let r,t=!1;return(...n)=>t?r:(t=!0,r=e(...n))},ye=e=>F((r=>Je(((t,n,s)=>w(e[r-s],t)),[],e)),J(-1),T)(e),de=o(((e,r)=>e>r)),je=o(((e,r)=>e<r)),me=o(((e,r)=>r>=e)),we=o(((e,r)=>r<=e)),Oe=o(((e,r)=>r.sort(e))),Ae=o(((e,r)=>r.find(e))),Se=o(((e,r)=>r.findIndex(e))),ke=o(((e,r)=>Se(E(e),r))),ve=(e,r="log")=>ce((t=>console[r](e,t))),Ne=o(((e,r)=>{for(const[t,n]of e)if(t(r))return n(r)})),xe=u(((e,r,t)=>({...t,[e]:r}))),Ce=u(((e,r,t)=>F((n=>{return xe(n,T(e)<2?r:Ce(z(1,i,e),r,(s=t[n],f(s)||"object"!==l(s)?{}:t[n])),t);var s}),G)(e))),Pe=o(((e,r)=>r.every(e))),$e=o(((e,r)=>r.some(e))),Be=o(((e,r)=>e.every((e=>e(r))))),Ee=o(((e,r)=>e.some((e=>e(r))))),Ue=o(((e,r)=>r[e])),_e=u(((e,r,t)=>E(t[e],r))),Fe=u(((e,r,t)=>E(r[e],t[e]))),Ie=u(((e,r,t)=>U(T,(()=>R(t)?e:F(U(R,V(e),(t=>Ie(e,z(1,i,r),t))),D(Ue)(t),G)(r)),V(t),r))),Le=Ie(a),qe=u(((e,r,t)=>E(Le(e,t),r))),ze=u(((e,r,t)=>E(Le(e,r),Le(e,t)))),De=/^(.*?)(8|16|32|64)(Clamped)?Array$/,Ge=(e,r=!1)=>{const t=j(e);switch(t){case"Null":case"String":case"Number":case"Boolean":case"Symbol":return e;case"Array":return r?[...e]:We(Ge,e);case"Object":if(r)return{...e};const n={};for(let r in e)n[r]=Ge(e[r]);return n;default:return De.test(t)?e.constructor.from(e):e}},He=e=>Ge(e,!0),Je=u(((e,r,t)=>A(e,Ge(r),t))),Ke=o(((e,r)=>tr(e,r))),Me=o(((e,r)=>{const t={};for(const n of e)n in r&&(t[n]=r[n]);return t})),Qe=o(((e,r)=>tr(((r,t)=>!q(t,e)),r))),Re=e=>Je(((e,r)=>xe(...r,e)),{},e),Te=o(((e,r)=>e.concat(r))),Ve=o(((e,r)=>r.join(e))),We=o(((e,r)=>r.map(e))),Xe=o(((e,r)=>r.forEach(e))),Ye=u(((e,r,t)=>r(t)&&e(t))),Ze=e=>{switch(j(e)){case"String":case"Array":return 0==T(e);case"Object":for(const r in e)return!1;return!0;default:return null}},er=e=>{switch(j(e)){case"String":return"";case"Object":return{};case"Array":return[];default:return a}},rr=u(((e,r,t)=>t.replace(e,r))),tr=o(((e,r)=>b(r)?r.filter(e):F(Re,tr((([r,t])=>e(t,r))),ne)(r))),nr=e=>{let r,t=!1;return()=>t?r:(t=!0,r=e())},sr=o(((e,r)=>Object.assign({},e,r))),cr=o(((e,r)=>k(Ge(e),Ge(r)))),or=o(((e,r)=>v(Ge(e),Ge(r)))),ur=o(((e,r)=>N(Ge(e),Ge(r)))),ar=u(((e,r,t)=>xe(e,r(t[e]),t))),ir=o(((e,r)=>x(e,Object.assign({},r)))),lr=(()=>{const e=async(r,t,n)=>{n<t.length&&(await r(t[n]),await e(r,t,++n))};return o(((r,t)=>e(r,t,0)))})(),fr=e=>Promise.all(e),hr=o((async(e,r)=>(await e(r),r))),br=o(((e,r)=>Promise.all(r.map(e)))),gr=(()=>{const e=async(r,t,n)=>~n?await e(r,await r[n](t),--n):t;return(...r)=>t=>e(r,t,r.length-1)})(),pr=W,yr=W,dr=W,jr=e=>{const r=[],t=[],n=e.length;let s,c,o,u=0,a=0,i=!1,l=G(e),f=!1;for(u=0;u<n;u++)switch(s=e[u],s){case"{":if(!l){i=!0,a=u;break}case"}":if(!l){i=!1,r.push(""),t.push(e.slice(a+1,u));break}default:o=e[u+1],f="\\"===s,i||f&&("{"===o||"}"===o)||(c=r.length-1,c<0&&(r.push(""),c++),r[c]+=s),l=f}return e=>{const n=[],s=r.length-1;for(const c in r)u=+c,n.push(r[u]),u!==s&&n.push(Le(t[u].split("."),e));return n.join("")}};export{ie as F,ae as T,e as __,J as add,Pe as all,Be as allPass,V as always,$e as any,Ee as anyPass,oe as append,xe as assoc,Ce as assocPath,I as bind,Ye as both,Ge as clone,He as cloneShallow,ee as complement,F as compose,gr as composeAsync,Te as concat,Ne as cond,s as curry,o as curry2,u as curry3,Q as divide,dr as echo,er as empty,E as equals,ve as explore,tr as filter,Ae as find,Se as findIndex,D as flip,Xe as forEach,br as forEachAsync,lr as forEachSerial,Re as fromPairs,ge as genBy,jr as getTmpl,de as gt,me as gte,G as head,W as identity,U as ifElse,q as includes,ke as indexOf,be as intersection,Ze as isEmpty,R as isNil,Ve as join,re as keys,Y as last,T as length,je as lt,we as lte,We as map,ir as mapKeys,nr as memoize,cr as mergeDeep,ur as mergeDeepAdd,or as mergeDeepX,sr as mergeShallow,pr as mirror,M as multiply,Z as not,L as nth,Qe as omit,pe as once,ar as overProp,Le as path,qe as pathEq,Ie as pathOr,ze as pathsEq,Me as pick,Ke as pickBy,Ue as prop,_e as propEq,Fe as propsEq,w as qappend,O as qassoc,C as qfilter,P as qindexOf,x as qmapKeys,k as qmergeDeep,N as qmergeDeepAdd,v as qmergeDeepX,A as qreduce,fe as range,Je as reduce,yr as reflect,rr as replace,ye as reverse,le as sizeof,z as slice,Oe as sort,ue as split,K as subtract,H as tail,B as take,ce as tap,se as test,y as toLower,ne as toPairs,d as toUpper,X as trim,j as type,m as typeIs,$ as uncurry,he as uniq,te as values,fr as waitAll,hr as waitTap,_ as when};
|
package/dist/bundle.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const e=Symbol("Placeholder"),r=r=>{let t=0;for(const s of r)s!==e&&t++;return t},t=(r,t)=>{const s=r.length,o=r.slice(),
|
|
1
|
+
"use strict";const e=Symbol("Placeholder"),r=r=>{let t=0;for(const s of r)s!==e&&t++;return t},t=(r,t)=>{const s=r.length,o=r.slice(),p=t.length;let n=p,c=0;for(;n&&c<s;c++)o[c]===e&&(o[c]=t[p-n],n--);for(c=s;n;c++,n--)o[c]=t[p-n];return o},s=(e,o,p)=>{const n=e.length-o.length-r(p);if(n<1)return e(...t(o,p));{const r=(...r)=>s(e,t(o,p),r);return r.$args_left=n,r}},o=e=>(...t)=>e.length>r(t)?s(e,[],t):e(...t),p=r=>function(t){return t===e?r:r(t)};function n(r){return function(t,s){const o=t===e,n=arguments.length;if(1===n&&o)throw new Error("Senseless placeholder usage.");return arguments.length>1?o?p((e=>r(e,s))):r(t,s):e=>r(t,e)}}function c(e){return o(e)}const x=void 0,a=1/0,i=e=>typeof e,l=e=>null===e,u=e=>"number"==i(e),f=e=>Array.isArray(e),h=e=>"function"===i(e),d={u:"U",b:"B",n:"N",s:"S",f:"F"},m=e=>{const r=i(e);return"object"===r?l(e)?"Null":e.constructor.name:d[r[0]]+r.slice(1)},y=n(((e,r)=>m(r)===e)),g=n(((e,r)=>(r.push(e),r))),b=c(((e,r,t)=>(t[e]=r,t))),w=c(((e,r,t)=>t.reduce(e,r))),j=c(((e,r,t)=>{for(let s in t)switch(m(t[s])){case"Array":if(e>1&&"Array"===m(r[s]))switch(e){case 2:const o=r[s],p=t[s];for(const r in p)o[r]?j(e,o[r],p[r]):o[r]=p[r];break;case 3:r[s].push(...t[s])}else r[s]=t[s];break;case"Object":if("Object"===m(r[s])){j(e,r[s],t[s]);break}default:r[s]=t[s]}return r})),O=j(1),q=j(2),A=j(3),E=n(((e,r)=>{let t,s,o,p;for(t in e)s=e[t],[o,p]=h(s)?s(r):[s,r[t]],r[o]=p,t!==o&&delete r[t];return r})),k=n(((e,r)=>{const t=f(r);for(let s in r)e(r[s],s)||(t?r.splice(s,1):delete r[s]);return r})),S=n(((e,r)=>r.indexOf(e))),v=n(((e,r)=>{const t=m(e);if(t===m(r)&&("Object"===t||"Array"==t)){if(l(e)||l(r))return e===r;if(e===r)return!0;for(const t of[e,r])for(const s in t)if(!(t===r&&s in e||t===e&&s in r&&v(e[s],r[s])))return!1;return!0}return e===r})),P=o(((e,r,t,s)=>e(s)?r(s):t(s))),D=c(((e,r,t)=>P(e,r,J,t))),N=(...r)=>(...t)=>{let s,o=!0;for(let p=G(r)-1;p>-1;p--)o?(o=!1,s=r[p](...t)):s=s===e?r[p]():r[p](s);return s},B=n(((e,r)=>e.bind(r))),_=n(((e,r)=>r[e])),C=n(((e,r)=>{if((e=>"string"===i(e))(r))return r.includes(e);for(const t of r)if(v(t,e))return!0;return!1})),I=c(((e,r,t)=>t.slice(e,u(r)?r:a))),T=e=>n(((r,t)=>e(t,r))),U=_(0),$=I(1,a),z=n(((e,r)=>e+r)),F=n(((e,r)=>r-e)),K=n(((e,r)=>e*r)),L=n(((e,r)=>e/r)),X=e=>l(e)||(e=>e===x)(e),G=e=>e.length,H=e=>()=>e,J=e=>e,M=e=>!e,Q=e=>(...r)=>{const t=e(...r);return h(t)&&t.$args_left?Q(t):M(t)},R=e=>Object.entries(e),V=n(((e,r)=>e.test(r))),W=n(((e,r)=>(e(r),r))),Y=n(((e,r)=>[...r,e])),Z=n(((e,r)=>r.split(e))),ee=H(!0),re=H(!1),te=n(((e,r)=>oe(z(e),r-e))),se=n(((e,r)=>e.filter(T(C)(r)))),oe=n(((e,r)=>[...Array(r)].map(((r,t)=>e(t))))),pe=n(((e,r)=>e>r)),ne=n(((e,r)=>e<r)),ce=n(((e,r)=>r>=e)),xe=n(((e,r)=>r<=e)),ae=n(((e,r)=>r.sort(e))),ie=n(((e,r)=>r.find(e))),le=n(((e,r)=>r.findIndex(e))),ue=n(((e,r)=>le(v(e),r))),fe=n(((e,r)=>{for(const[t,s]of e)if(t(r))return s(r)})),he=c(((e,r,t)=>({...t,[e]:r}))),de=c(((e,r,t)=>N((s=>{return he(s,G(e)<2?r:de(I(1,a,e),r,(o=t[s],l(o)||"object"!==i(o)?{}:t[s])),t);var o}),U)(e))),me=n(((e,r)=>r.every(e))),ye=n(((e,r)=>r.some(e))),ge=n(((e,r)=>e.every((e=>e(r))))),be=n(((e,r)=>e.some((e=>e(r))))),we=n(((e,r)=>r[e])),je=c(((e,r,t)=>v(t[e],r))),Oe=c(((e,r,t)=>v(r[e],t[e]))),qe=c(((e,r,t)=>P(G,(()=>X(t)?e:N(P(X,H(e),(t=>qe(e,I(1,a,r),t))),T(we)(t),U)(r)),H(t),r))),Ae=qe(x),Ee=c(((e,r,t)=>v(Ae(e,t),r))),ke=c(((e,r,t)=>v(Ae(e,r),Ae(e,t)))),Se=/^(.*?)(8|16|32|64)(Clamped)?Array$/,ve=(e,r=!1)=>{const t=m(e);switch(t){case"Null":case"String":case"Number":case"Boolean":case"Symbol":return e;case"Array":return r?[...e]:Te(ve,e);case"Object":if(r)return{...e};const s={};for(let r in e)s[r]=ve(e[r]);return s;default:return Se.test(t)?e.constructor.from(e):e}},Pe=c(((e,r,t)=>w(e,ve(r),t))),De=n(((e,r)=>Fe(e,r))),Ne=n(((e,r)=>{const t={};for(const s of e)s in r&&(t[s]=r[s]);return t})),Be=n(((e,r)=>Fe(((r,t)=>!C(t,e)),r))),_e=e=>Pe(((e,r)=>he(...r,e)),{},e),Ce=n(((e,r)=>e.concat(r))),Ie=n(((e,r)=>r.join(e))),Te=n(((e,r)=>r.map(e))),Ue=n(((e,r)=>r.forEach(e))),$e=c(((e,r,t)=>r(t)&&e(t))),ze=c(((e,r,t)=>t.replace(e,r))),Fe=n(((e,r)=>f(r)?r.filter(e):N(_e,Fe((([r,t])=>e(t,r))),R)(r))),Ke=n(((e,r)=>Object.assign({},e,r))),Le=n(((e,r)=>O(ve(e),ve(r)))),Xe=n(((e,r)=>q(ve(e),ve(r)))),Ge=n(((e,r)=>A(ve(e),ve(r)))),He=c(((e,r,t)=>he(e,r(t[e]),t))),Je=n(((e,r)=>E(e,Object.assign({},r)))),Me=(()=>{const e=async(r,t,s)=>{s<t.length&&(await r(t[s]),await e(r,t,++s))};return n(((r,t)=>e(r,t,0)))})(),Qe=n((async(e,r)=>(await e(r),r))),Re=n(((e,r)=>Promise.all(r.map(e)))),Ve=(()=>{const e=async(r,t,s)=>~s?await e(r,await r[s](t),--s):t;return(...r)=>t=>e(r,t,r.length-1)})(),We=J,Ye=J,Ze=J;exports.F=re,exports.T=ee,exports.__=e,exports.add=z,exports.all=me,exports.allPass=ge,exports.always=H,exports.any=ye,exports.anyPass=be,exports.append=Y,exports.assoc=he,exports.assocPath=de,exports.bind=B,exports.both=$e,exports.clone=ve,exports.cloneShallow=e=>ve(e,!0),exports.complement=Q,exports.compose=N,exports.composeAsync=Ve,exports.concat=Ce,exports.cond=fe,exports.curry=o,exports.curry2=n,exports.curry3=c,exports.divide=L,exports.echo=Ze,exports.empty=e=>{switch(m(e)){case"String":return"";case"Object":return{};case"Array":return[];default:return x}},exports.equals=v,exports.explore=(e,r="log")=>W((t=>console[r](e,t))),exports.filter=Fe,exports.find=ie,exports.findIndex=le,exports.flip=T,exports.forEach=Ue,exports.forEachAsync=Re,exports.forEachSerial=Me,exports.fromPairs=_e,exports.genBy=oe,exports.getTmpl=e=>{const r=[],t=[],s=e.length;let o,p,n,c=0,x=0,a=!1,i=U(e),l=!1;for(c=0;c<s;c++)switch(o=e[c],o){case"{":if(!i){a=!0,x=c;break}case"}":if(!i){a=!1,r.push(""),t.push(e.slice(x+1,c));break}default:n=e[c+1],l="\\"===o,a||l&&("{"===n||"}"===n)||(p=r.length-1,p<0&&(r.push(""),p++),r[p]+=o),i=l}return e=>{const s=[],o=r.length-1;for(const p in r)c=+p,s.push(r[c]),c!==o&&s.push(Ae(t[c].split("."),e));return s.join("")}},exports.gt=pe,exports.gte=ce,exports.head=U,exports.identity=J,exports.ifElse=P,exports.includes=C,exports.indexOf=ue,exports.intersection=se,exports.isEmpty=e=>{switch(m(e)){case"String":case"Array":return 0==G(e);case"Object":for(const r in e)return!1;return!0;default:return null}},exports.isNil=X,exports.join=Ie,exports.keys=e=>Object.keys(e),exports.last=e=>e[G(e)-1],exports.length=G,exports.lt=ne,exports.lte=xe,exports.map=Te,exports.mapKeys=Je,exports.memoize=e=>{let r,t=!1;return()=>t?r:(t=!0,r=e())},exports.mergeDeep=Le,exports.mergeDeepAdd=Ge,exports.mergeDeepX=Xe,exports.mergeShallow=Ke,exports.mirror=We,exports.multiply=K,exports.not=M,exports.nth=_,exports.omit=Be,exports.once=e=>{let r,t=!1;return(...s)=>t?r:(t=!0,r=e(...s))},exports.overProp=He,exports.path=Ae,exports.pathEq=Ee,exports.pathOr=qe,exports.pathsEq=ke,exports.pick=Ne,exports.pickBy=De,exports.prop=we,exports.propEq=je,exports.propsEq=Oe,exports.qappend=g,exports.qassoc=b,exports.qfilter=k,exports.qindexOf=S,exports.qmapKeys=E,exports.qmergeDeep=O,exports.qmergeDeepAdd=A,exports.qmergeDeepX=q,exports.qreduce=w,exports.range=te,exports.reduce=Pe,exports.reflect=Ye,exports.replace=ze,exports.reverse=e=>N((r=>Pe(((t,s,o)=>g(e[r-o],t)),[],e)),z(-1),G)(e),exports.sizeof=e=>{if("Object"===m(e)){let r=0;for(let t in e)r++;return r}return G(e)},exports.slice=I,exports.sort=ae,exports.split=Z,exports.subtract=F,exports.tail=$,exports.take=e=>(...r)=>r[e],exports.tap=W,exports.test=V,exports.toLower=e=>e.toLowerCase(),exports.toPairs=R,exports.toUpper=e=>e.toUpperCase(),exports.trim=e=>e.trim(),exports.type=m,exports.typeIs=y,exports.uncurry=e=>(...r)=>w(((e,r)=>e?e(r):e),e,r),exports.uniq=e=>w(((e,r)=>C(r,e)?e:g(r,e)),[],e),exports.values=e=>Object.values(e),exports.waitAll=e=>Promise.all(e),exports.waitTap=Qe,exports.when=D;
|
package/package.json
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"prod": "npm run gentypes && npm run prod:es && npm run prod:cjs",
|
|
43
43
|
"all": "npm run dev && npm run prod"
|
|
44
44
|
},
|
|
45
|
-
"version": "0.
|
|
45
|
+
"version": "0.14.0-beta1",
|
|
46
46
|
"ava": {
|
|
47
47
|
"files": [ "./test/specs/*.ts" ],
|
|
48
48
|
"failFast": true,
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"rollup-plugin-typescript2": "^0.34.1",
|
|
70
70
|
"ts-node": "^10.9.1",
|
|
71
71
|
"tslint": "^6.1.0",
|
|
72
|
-
"typescript": "^4.9.
|
|
72
|
+
"typescript": "^4.9.4"
|
|
73
73
|
},
|
|
74
74
|
"types": "./dist/bundle.d.ts",
|
|
75
75
|
"sideEffects": false
|
package/src/common.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { curry2 } from "./curry"
|
|
1
2
|
import { to, isNull } from "./utils"
|
|
2
3
|
|
|
3
4
|
// It's faster that toUpperCase() !
|
|
@@ -12,4 +13,5 @@ export const type = (s: any) => {
|
|
|
12
13
|
return t==='object'
|
|
13
14
|
? isNull(s) ? 'Null' : s.constructor.name
|
|
14
15
|
: caseMap[t[0]] + t.slice(1)
|
|
15
|
-
}
|
|
16
|
+
}
|
|
17
|
+
export const typeIs = curry2((t: string, s: any) => type(s)===t)
|
package/src/curry.ts
CHANGED
package/src/quick.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { type } from "./common"
|
|
|
3
3
|
import { AnyObject, Reducer, AnyFunc } from "./types"
|
|
4
4
|
import { isFunc, isArray } from "./utils"
|
|
5
5
|
|
|
6
|
+
// TODO: qmap, qfilter.
|
|
7
|
+
|
|
6
8
|
export const qappend = curry2((s: any, xs: any[]) => {xs.push(s); return xs})
|
|
7
9
|
export const qassoc = curry3(
|
|
8
10
|
(prop: string, v: any, obj: AnyObject) => {
|
package/src/safe.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { F as FT } from 'ts-toolbelt'
|
|
1
2
|
import { __, curry, curry2, curry3 } from './curry'
|
|
2
3
|
import { isNum, isUndef, undef, isNull, isArray, isFunc, isStr, isObj, inf } from './utils'
|
|
3
4
|
import { qmergeDeep, qreduce, qappend, qmapKeys, qmergeDeepX, qmergeDeepAdd } from './quick'
|
|
4
|
-
import { AnyFunc, Cond, AnyObject, Reducer } from './types'
|
|
5
|
+
import { AnyFunc, Cond, AnyObject, Reducer, Curried } from './types'
|
|
5
6
|
import { type } from './common'
|
|
6
|
-
|
|
7
|
-
// over, lensProp
|
|
7
|
+
// SomeType, totype, over, lensProp
|
|
8
8
|
|
|
9
|
+
export const take = (argN: number) => (...args: any[]) => args[argN]
|
|
9
10
|
export const equals = curry2((a: any, b: any) => {
|
|
10
11
|
const typea = type(a)
|
|
11
12
|
if(typea===type(b) && (typea==='Object' || typea=='Array')) {
|
|
@@ -44,12 +45,18 @@ export const when = curry3(
|
|
|
44
45
|
s: any
|
|
45
46
|
) => ifElse(cond, pipe, identity, s)
|
|
46
47
|
)
|
|
47
|
-
type Composed<TIn, TOut> = (
|
|
48
|
+
type Composed<TIn extends any[], TOut> = (...xs: TIn) => TOut
|
|
48
49
|
export const compose = (
|
|
49
|
-
<TIn = any, TOut = any>(...fns: AnyFunc[]): Composed<TIn, TOut> =>
|
|
50
|
-
(
|
|
50
|
+
<TIn extends any[] = any[], TOut = any>(...fns: AnyFunc[]): Composed<TIn, TOut> =>
|
|
51
|
+
(...args: TIn) => {
|
|
52
|
+
let first = true
|
|
53
|
+
let s: any
|
|
51
54
|
for(let i = length(fns)-1; i>-1; i--) {
|
|
52
|
-
|
|
55
|
+
if(first) {
|
|
56
|
+
first = false
|
|
57
|
+
s = fns[i](...args)
|
|
58
|
+
} else
|
|
59
|
+
s = s===__ ? fns[i]() : fns[i](s)
|
|
53
60
|
}
|
|
54
61
|
return s as any as TOut
|
|
55
62
|
}
|
|
@@ -80,11 +87,17 @@ export const slice = curry3(
|
|
|
80
87
|
(from: number, to: number, o: any[] | string) =>
|
|
81
88
|
o.slice(from, (isNum(to)?to:inf) as number)
|
|
82
89
|
)
|
|
90
|
+
type TupleFn<ARG1=any, ARG2=any, Out=any> = (a: ARG1, b: ARG2) => Out
|
|
91
|
+
export const flip = <ARG1=any, ARG2=any, Out=any>(
|
|
92
|
+
fn: FT.Curry<TupleFn<ARG1, ARG2, Out>>
|
|
93
|
+
): FT.Curry<TupleFn<ARG2, ARG1, Out>> =>
|
|
94
|
+
curry2((b: ARG2, a: ARG1) => fn(a as any, b as any))
|
|
83
95
|
export const head = nth(0)
|
|
84
96
|
export const tail = slice(1, inf) // typeshit.
|
|
85
97
|
export const add = curry2((n: number, m: number) => n+m)
|
|
86
98
|
export const subtract = curry2((n: number, m: number) => m-n)
|
|
87
|
-
export const
|
|
99
|
+
export const multiply = curry2((n: number, m: number) => n*m)
|
|
100
|
+
export const divide = curry2((n: number, m: number) => n/m)
|
|
88
101
|
export const isNil = (s: any) => isNull(s) || isUndef(s)
|
|
89
102
|
export const length = (s: any[] | string) => s.length
|
|
90
103
|
export const always = <T=any>(s: T) => () => s
|
|
@@ -102,7 +115,7 @@ export const toPairs = (o: AnyObject | any[]) => Object.entries(o)
|
|
|
102
115
|
export const test = curry2((re: RegExp, s: string) => re.test(s))
|
|
103
116
|
export const tap = curry2((fn: Function, s: any) => { fn(s); return s })
|
|
104
117
|
export const append = curry2((s: any, xs: any[]) => [...xs, s])
|
|
105
|
-
export const split = curry2((s: string, xs: string) => xs.split(s))
|
|
118
|
+
export const split = curry2((s: string|RegExp, xs: string) => xs.split(s))
|
|
106
119
|
export const T = always<true>(true) as (...args: any[]) => true
|
|
107
120
|
export const F = always<false>(false) as (...args: any[]) => false
|
|
108
121
|
export const sizeof = (s: any[] | string | AnyObject) => {
|
package/src/strings.ts
CHANGED
|
@@ -1,30 +1,42 @@
|
|
|
1
1
|
import { AnyObject } from "./types"
|
|
2
|
-
import { path } from "./safe"
|
|
2
|
+
import { head, path } from "./safe"
|
|
3
|
+
|
|
4
|
+
type StrTmpl = ((data: AnyObject) => string)
|
|
5
|
+
const ecran = '\\'
|
|
3
6
|
|
|
4
7
|
// TODO: make it splicy, not accumulatie by symbols.
|
|
8
|
+
// Supports ecrans: '\{"json": {yes} \}'
|
|
5
9
|
// get_tmpl(one{meme}two)({meme: 42}) -> one42two
|
|
6
|
-
type StrTmpl = ((data: AnyObject) => string)
|
|
7
10
|
export const getTmpl = (tmpl: string): StrTmpl => {
|
|
8
11
|
const parts: string[] = []
|
|
9
12
|
const keymap: string[] = []
|
|
10
13
|
const len = tmpl.length
|
|
11
|
-
let i = 0, s
|
|
14
|
+
let i = 0, s, ln, start = 0, open = false,
|
|
15
|
+
hasEcran = head(tmpl), hasEcranNext = false,
|
|
16
|
+
nextChar: string
|
|
12
17
|
for(i=0; i<len; i++) {
|
|
13
18
|
s = tmpl[i]
|
|
14
19
|
switch(s) {
|
|
15
20
|
case '{':
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
if(!hasEcran) {
|
|
22
|
+
open = true; start = i;
|
|
23
|
+
break
|
|
24
|
+
}
|
|
18
25
|
case '}':
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
if(!hasEcran) {
|
|
27
|
+
open = false; parts.push('')
|
|
28
|
+
keymap.push(tmpl.slice(start+1, i))
|
|
29
|
+
break
|
|
30
|
+
}
|
|
22
31
|
default:
|
|
23
|
-
|
|
32
|
+
nextChar = tmpl[i+1]
|
|
33
|
+
hasEcranNext = s === ecran
|
|
34
|
+
if(!open && (!hasEcranNext || nextChar!=='{' && nextChar!=='}')) {
|
|
24
35
|
ln = parts.length-1
|
|
25
36
|
if(ln<0) { parts.push(''); ln++ }
|
|
26
37
|
parts[ln] += s
|
|
27
38
|
}
|
|
39
|
+
hasEcran = hasEcranNext
|
|
28
40
|
break
|
|
29
41
|
}
|
|
30
42
|
}
|
package/tsconfig.json
CHANGED
package/src/common.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { to, isNull } from "./utils";
|
|
2
|
-
// It's faster that toUpperCase() !
|
|
3
|
-
const caseMap = {
|
|
4
|
-
u: 'U', b: 'B', n: 'N', s: 'S', f: 'F'
|
|
5
|
-
};
|
|
6
|
-
export const toLower = (s) => s.toLowerCase();
|
|
7
|
-
export const toUpper = (s) => s.toUpperCase();
|
|
8
|
-
export const type = (s) => {
|
|
9
|
-
const t = to(s);
|
|
10
|
-
return t === 'object'
|
|
11
|
-
? isNull(s) ? 'Null' : s.constructor.name
|
|
12
|
-
: caseMap[t[0]] + t.slice(1);
|
|
13
|
-
};
|
package/src/curry.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export const __ = Symbol('Placeholder');
|
|
2
|
-
const countArgs = (s) => {
|
|
3
|
-
let i = 0;
|
|
4
|
-
for (const v of s)
|
|
5
|
-
v !== __ && i++;
|
|
6
|
-
return i;
|
|
7
|
-
};
|
|
8
|
-
// TODO: try to make it mutable.
|
|
9
|
-
// { 0: __, 1: 10 }, [ 11 ]
|
|
10
|
-
const addArgs = (args, _args) => {
|
|
11
|
-
const len = args.length;
|
|
12
|
-
const new_args = args.slice();
|
|
13
|
-
const _args_len = _args.length;
|
|
14
|
-
let _args_left = _args_len;
|
|
15
|
-
let i = 0;
|
|
16
|
-
for (; _args_left && i < len; i++) {
|
|
17
|
-
if (new_args[i] === __) {
|
|
18
|
-
new_args[i] = _args[_args_len - _args_left];
|
|
19
|
-
_args_left--;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
for (i = len; _args_left; i++, _args_left--) {
|
|
23
|
-
new_args[i] = _args[_args_len - _args_left];
|
|
24
|
-
}
|
|
25
|
-
return new_args;
|
|
26
|
-
};
|
|
27
|
-
const _curry = (fn, args, new_args) => {
|
|
28
|
-
const args2add = fn.length - args.length - countArgs(new_args);
|
|
29
|
-
if (args2add < 1) {
|
|
30
|
-
return fn(...addArgs(args, new_args));
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
const curried = (...__args) => _curry(fn, addArgs(args, new_args), __args);
|
|
34
|
-
curried.$args_left = args2add;
|
|
35
|
-
return curried;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
export const curry = ((fn) => ((...args) => fn.length > countArgs(args)
|
|
39
|
-
? _curry(fn, [], args)
|
|
40
|
-
: fn(...args)));
|
|
41
|
-
const endlessph = (fn) => {
|
|
42
|
-
function _endlessph(a) {
|
|
43
|
-
return a === __ ? fn : fn(a);
|
|
44
|
-
}
|
|
45
|
-
return _endlessph;
|
|
46
|
-
};
|
|
47
|
-
export function curry2(fn) {
|
|
48
|
-
function curried2(a, b) {
|
|
49
|
-
const withPlaceholder1 = a === __;
|
|
50
|
-
const aln = arguments.length;
|
|
51
|
-
if (aln === 1 && withPlaceholder1)
|
|
52
|
-
throw new Error('Senseless placeholder usage.');
|
|
53
|
-
return arguments.length > 1
|
|
54
|
-
? withPlaceholder1
|
|
55
|
-
? endlessph((a) => fn(a, b))
|
|
56
|
-
: fn(a, b)
|
|
57
|
-
: (b) => fn(a, b);
|
|
58
|
-
}
|
|
59
|
-
return curried2;
|
|
60
|
-
}
|
|
61
|
-
export function curry3(fn) {
|
|
62
|
-
// type p0 = Parameters<Func>[0]
|
|
63
|
-
// type p1 = Parameters<Func>[1]
|
|
64
|
-
// type p2 = Parameters<Func>[2]
|
|
65
|
-
// type ReturnT = ReturnType<Func>
|
|
66
|
-
// TODO: optimize.
|
|
67
|
-
return curry(fn);
|
|
68
|
-
}
|
package/src/index.js
DELETED
package/src/quick.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { curry2, curry3 } from "./curry";
|
|
2
|
-
import { type } from "./common";
|
|
3
|
-
import { isFunc, isArray } from "./utils";
|
|
4
|
-
export const qappend = curry2((s, xs) => { xs.push(s); return xs; });
|
|
5
|
-
export const qassoc = curry3((prop, v, obj) => {
|
|
6
|
-
obj[prop] = v;
|
|
7
|
-
return obj;
|
|
8
|
-
});
|
|
9
|
-
export const qreduce = curry3((fn, accum, arr) => arr.reduce(fn, accum));
|
|
10
|
-
// strategy is for arrays: 1->clean, 2->merge, 3->push.
|
|
11
|
-
const mergeDeep = curry3((strategy, o1, o2) => {
|
|
12
|
-
for (let k in o2) {
|
|
13
|
-
switch (type(o2[k])) {
|
|
14
|
-
case 'Array':
|
|
15
|
-
if (strategy > 1 && type(o1[k]) === 'Array') {
|
|
16
|
-
switch (strategy) {
|
|
17
|
-
case 2:
|
|
18
|
-
const o1k = o1[k], o2k = o2[k];
|
|
19
|
-
for (const i in o2k) {
|
|
20
|
-
if (o1k[i]) {
|
|
21
|
-
mergeDeep(strategy, o1k[i], o2k[i]);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
o1k[i] = o2k[i];
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
break;
|
|
28
|
-
case 3: o1[k].push(...o2[k]);
|
|
29
|
-
default: break;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
o1[k] = o2[k];
|
|
34
|
-
}
|
|
35
|
-
break;
|
|
36
|
-
case 'Object':
|
|
37
|
-
if (type(o1[k]) === 'Object') {
|
|
38
|
-
mergeDeep(strategy, o1[k], o2[k]);
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
default:
|
|
42
|
-
o1[k] = o2[k];
|
|
43
|
-
break;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return o1;
|
|
47
|
-
});
|
|
48
|
-
export const qmergeDeep = mergeDeep(1);
|
|
49
|
-
export const qmergeDeepX = mergeDeep(2);
|
|
50
|
-
export const qmergeDeepAdd = mergeDeep(3);
|
|
51
|
-
/** qmapKeys({ a: 'b' }, { a: 44 }) -> { b: 44 } */
|
|
52
|
-
export const qmapKeys = curry2((keyMap, o) => {
|
|
53
|
-
let k, mapped, newKey, newValue;
|
|
54
|
-
for (k in keyMap) {
|
|
55
|
-
mapped = keyMap[k];
|
|
56
|
-
[newKey, newValue] = isFunc(mapped)
|
|
57
|
-
? mapped(o)
|
|
58
|
-
: [mapped, o[k]];
|
|
59
|
-
o[newKey] = newValue;
|
|
60
|
-
if (k !== newKey) {
|
|
61
|
-
delete o[k];
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return o;
|
|
65
|
-
});
|
|
66
|
-
export const qfilter = curry2((cond, data) => {
|
|
67
|
-
const isArr = isArray(data);
|
|
68
|
-
for (let k in data) {
|
|
69
|
-
if (!cond(data[k], k)) {
|
|
70
|
-
if (isArr) {
|
|
71
|
-
data.splice(k, 1);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
// TODO: handle Maps and Sets ?
|
|
75
|
-
delete data[k];
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return data;
|
|
80
|
-
});
|
|
81
|
-
/** @deprecated */
|
|
82
|
-
export const qindexOf = curry2((x, xs) => xs.indexOf(x));
|
package/src/safe.js
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import { __, curry, curry2, curry3 } from './curry';
|
|
2
|
-
import { isNum, isUndef, undef, isNull, isArray, isFunc, isStr, isObj, inf } from './utils';
|
|
3
|
-
import { qmergeDeep, qreduce, qappend, qmapKeys, qmergeDeepX, qmergeDeepAdd } from './quick';
|
|
4
|
-
import { type } from './common';
|
|
5
|
-
// over, lensProp
|
|
6
|
-
export const equals = curry2((a, b) => {
|
|
7
|
-
const typea = type(a);
|
|
8
|
-
if (typea === type(b) && (typea === 'Object' || typea == 'Array')) {
|
|
9
|
-
if (isNull(a) || isNull(b)) {
|
|
10
|
-
return a === b;
|
|
11
|
-
}
|
|
12
|
-
if (a === b) {
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
for (const v of [a, b]) {
|
|
16
|
-
for (const k in v) {
|
|
17
|
-
if (!((v === b) && (k in a)) &&
|
|
18
|
-
!((v === a) && (k in b) && equals(a[k], b[k]))) {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
return a === b;
|
|
26
|
-
});
|
|
27
|
-
export const ifElse = curry((cond, pipeYes, pipeNo, s) => cond(s) ? pipeYes(s) : pipeNo(s));
|
|
28
|
-
export const when = curry3((cond, pipe, s) => ifElse(cond, pipe, identity, s));
|
|
29
|
-
export const compose = ((...fns) => (s = Symbol()) => {
|
|
30
|
-
for (let i = length(fns) - 1; i > -1; i--) {
|
|
31
|
-
s = s === __ ? fns[i]() : fns[i](s);
|
|
32
|
-
}
|
|
33
|
-
return s;
|
|
34
|
-
});
|
|
35
|
-
export const bind = curry2((fn, context) => fn.bind(context));
|
|
36
|
-
const _nth = (i, data) => data[i];
|
|
37
|
-
export const nth = curry2(_nth);
|
|
38
|
-
export const includes = curry2((s, ss) => {
|
|
39
|
-
if (isStr(ss)) {
|
|
40
|
-
return ss.includes(s);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
for (const a of ss) {
|
|
44
|
-
if (equals(a, s)) {
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
export const slice = curry3((from, to, o) => o.slice(from, (isNum(to) ? to : inf)));
|
|
52
|
-
export const head = nth(0);
|
|
53
|
-
export const tail = slice(1, inf); // typeshit.
|
|
54
|
-
export const add = curry2((n, m) => n + m);
|
|
55
|
-
export const subtract = curry2((n, m) => m - n);
|
|
56
|
-
export const flip = (fn) => curry((b, a) => fn(a, b));
|
|
57
|
-
export const isNil = (s) => isNull(s) || isUndef(s);
|
|
58
|
-
export const length = (s) => s.length;
|
|
59
|
-
export const always = (s) => () => s;
|
|
60
|
-
export const identity = (s) => s;
|
|
61
|
-
export const trim = (s) => s.trim();
|
|
62
|
-
export const last = (s) => s[length(s) - 1];
|
|
63
|
-
export const not = (o) => !o;
|
|
64
|
-
export const complement = (fn) => (...args) => {
|
|
65
|
-
const out = fn(...args);
|
|
66
|
-
return (isFunc(out) && out.$args_left) ? complement(out) : not(out);
|
|
67
|
-
};
|
|
68
|
-
export const keys = (o) => Object.keys(o);
|
|
69
|
-
export const values = (o) => Object.values(o);
|
|
70
|
-
export const toPairs = (o) => Object.entries(o);
|
|
71
|
-
export const test = curry2((re, s) => re.test(s));
|
|
72
|
-
export const tap = curry2((fn, s) => { fn(s); return s; });
|
|
73
|
-
export const append = curry2((s, xs) => [...xs, s]);
|
|
74
|
-
export const split = curry2((s, xs) => xs.split(s));
|
|
75
|
-
export const T = always(true);
|
|
76
|
-
export const F = always(false);
|
|
77
|
-
export const sizeof = (s) => {
|
|
78
|
-
if (type(s) === 'Object') {
|
|
79
|
-
let len = 0;
|
|
80
|
-
for (let _k in s)
|
|
81
|
-
len++;
|
|
82
|
-
return len;
|
|
83
|
-
}
|
|
84
|
-
else
|
|
85
|
-
return length(s);
|
|
86
|
-
};
|
|
87
|
-
export const range = curry2((from, to) => genBy(add(from), to - from));
|
|
88
|
-
export const uniq = (xs) => qreduce((accum, x) => includes(x, accum) ? accum : qappend(x, accum), [], xs);
|
|
89
|
-
export const intersection = curry2((xs1, xs2) => xs1.filter(flip(includes)(xs2)));
|
|
90
|
-
export const genBy = curry2((generator, length) => [...Array(length)].map((_, i) => generator(i)));
|
|
91
|
-
export const once = (fn) => {
|
|
92
|
-
let done = false, cache;
|
|
93
|
-
return (...args) => {
|
|
94
|
-
if (done) {
|
|
95
|
-
return cache;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
done = true;
|
|
99
|
-
return cache = fn(...args);
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
export const reverse = (xs) => compose((ln) => reduce((nxs, _, i) => qappend(xs[ln - i], nxs), [], xs), add(-1), length)(xs);
|
|
104
|
-
export const gt = curry2((a, b) => a > b);
|
|
105
|
-
export const lt = curry2((a, b) => a < b);
|
|
106
|
-
export const gte = curry2((a, b) => b >= a);
|
|
107
|
-
export const lte = curry2((a, b) => b <= a);
|
|
108
|
-
export const sort = curry2((sortFn, xs) => xs.sort(sortFn));
|
|
109
|
-
export const find = curry2((fn, s) => s.find(fn));
|
|
110
|
-
export const findIndex = curry2((fn, s) => s.findIndex(fn));
|
|
111
|
-
export const indexOf = curry2((x, xs) => findIndex(equals(x), xs));
|
|
112
|
-
export const explore = (caption, level = 'log') => tap((v) => console[level](caption, v));
|
|
113
|
-
export const cond = curry2((pairs, s) => {
|
|
114
|
-
for (const [cond, fn] of pairs) {
|
|
115
|
-
if (cond(s)) {
|
|
116
|
-
return fn(s);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
export const assoc = curry3((prop, v, obj) => ({
|
|
121
|
-
...obj,
|
|
122
|
-
[prop]: v
|
|
123
|
-
}));
|
|
124
|
-
export const assocPath = curry3((_path, v, o) => compose((first) => assoc(first, length(_path) < 2
|
|
125
|
-
? v
|
|
126
|
-
: assocPath(slice(1, inf, _path), v, isObj(o[first]) ? o[first] : {}), o), head)(_path));
|
|
127
|
-
export const all = curry2((pred, xs) => xs.every(pred));
|
|
128
|
-
export const any = curry2((pred, xs) => xs.some(pred));
|
|
129
|
-
export const allPass = curry2((preds, x) => preds.every((pred) => pred(x)));
|
|
130
|
-
export const anyPass = curry2((preds, x) => preds.some((pred) => pred(x)));
|
|
131
|
-
export const prop = curry2((key, o) => o[key]);
|
|
132
|
-
export const propEq = curry3((key, value, o) => equals(o[key], value));
|
|
133
|
-
export const propsEq = curry3((key, o1, o2) => equals(o1[key], o2[key]));
|
|
134
|
-
export const pathOr = curry3((_default, path, o) => ifElse(length, () => isNil(o)
|
|
135
|
-
? _default
|
|
136
|
-
: compose(ifElse(isNil, always(_default), (o) => pathOr(_default, slice(1, inf, path), o)), flip(prop)(o), head)(path), always(o), path));
|
|
137
|
-
export const path = pathOr(undef);
|
|
138
|
-
export const pathEq = curry3((_path, value, o) => equals(path(_path, o), value));
|
|
139
|
-
export const pathsEq = curry3((_path, o1, o2) => equals(path(_path, o1), path(_path, o2)));
|
|
140
|
-
const typed_arr_re = /^(.*?)(8|16|32|64)(Clamped)?Array$/;
|
|
141
|
-
export const clone = (s, shallow = false) => {
|
|
142
|
-
const t = type(s);
|
|
143
|
-
switch (t) {
|
|
144
|
-
case 'Null': return s;
|
|
145
|
-
case 'Array': return shallow ? [...s] : map(clone, s);
|
|
146
|
-
case 'Object':
|
|
147
|
-
if (shallow)
|
|
148
|
-
return { ...s };
|
|
149
|
-
const out = {};
|
|
150
|
-
for (let k in s) {
|
|
151
|
-
out[k] = clone(s[k]);
|
|
152
|
-
}
|
|
153
|
-
return out;
|
|
154
|
-
case 'String':
|
|
155
|
-
case 'Number':
|
|
156
|
-
case 'Boolean':
|
|
157
|
-
case 'Symbol':
|
|
158
|
-
return s;
|
|
159
|
-
default:
|
|
160
|
-
return typed_arr_re.test(t) ? s.constructor.from(s) : s;
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
export const cloneShallow = (s) => clone(s, true);
|
|
164
|
-
export const reduce = curry3((fn, accum, arr) => qreduce(fn, clone(accum), arr));
|
|
165
|
-
export const pickBy = curry2((cond, o) => filter(cond, o));
|
|
166
|
-
export const pick = curry2((props, o) => {
|
|
167
|
-
const out = {};
|
|
168
|
-
for (const p of props) {
|
|
169
|
-
if (p in o) {
|
|
170
|
-
out[p] = o[p];
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return out;
|
|
174
|
-
});
|
|
175
|
-
export const omit = curry2((props, o) => filter((_, k) => !includes(k, props), o));
|
|
176
|
-
export const fromPairs = (pairs) => reduce((o, pair) => assoc(...pair, o), {}, pairs);
|
|
177
|
-
export const concat = curry2(((a, b) => a.concat(b)));
|
|
178
|
-
export const join = curry2((delimeter, arr) => arr.join(delimeter));
|
|
179
|
-
export const map = curry2((pipe, arr) => arr.map(pipe));
|
|
180
|
-
export const forEach = curry2((pipe, arr) => arr.forEach(pipe));
|
|
181
|
-
export const both = curry3((cond1, cond2, s) => cond2(s) && cond1(s));
|
|
182
|
-
export const isEmpty = (s) => {
|
|
183
|
-
switch (type(s)) {
|
|
184
|
-
case 'String':
|
|
185
|
-
case 'Array': return length(s) == 0;
|
|
186
|
-
case 'Object':
|
|
187
|
-
for (const _k in s)
|
|
188
|
-
return false;
|
|
189
|
-
return true;
|
|
190
|
-
default: return null;
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
export const empty = (s) => {
|
|
194
|
-
switch (type(s)) {
|
|
195
|
-
case 'String': return '';
|
|
196
|
-
case 'Object': return {};
|
|
197
|
-
case 'Array': return [];
|
|
198
|
-
default: return undef;
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
export const replace = curry3((a, b, where
|
|
202
|
-
// @ts-ignore-next Some bug with overload.
|
|
203
|
-
) => where.replace(a, b));
|
|
204
|
-
export const filter = curry2((cond, data) => isArray(data)
|
|
205
|
-
? data.filter(cond)
|
|
206
|
-
: compose(fromPairs, filter(([k, v]) => cond(v, k)), toPairs)(data));
|
|
207
|
-
export const memoize = (fn) => {
|
|
208
|
-
let cache;
|
|
209
|
-
let cached = false;
|
|
210
|
-
return () => cached ? cache : (cached = true, cache = fn());
|
|
211
|
-
};
|
|
212
|
-
export const mergeShallow = curry2((o1, o2) => Object.assign({}, o1, o2));
|
|
213
|
-
export const mergeDeep = curry2((a, b) => qmergeDeep(clone(a), clone(b)));
|
|
214
|
-
export const mergeDeepX = curry2((a, b) => qmergeDeepX(clone(a), clone(b)));
|
|
215
|
-
export const mergeDeepAdd = curry2((a, b) => qmergeDeepAdd(clone(a), clone(b)));
|
|
216
|
-
export const overProp = curry3((prop, pipe, data) => assoc(prop, pipe(data[prop]), data));
|
|
217
|
-
/** mapKeys({ a: 'b' }, { a: 44 }) -> { b: 44 } */
|
|
218
|
-
export const mapKeys = curry2((keyMap, o) => qmapKeys(keyMap, Object.assign({}, o)));
|
|
219
|
-
// ASYNCS
|
|
220
|
-
/** One promise waits for another. */
|
|
221
|
-
export const forEachSerial = (() => {
|
|
222
|
-
const pipe = async (fn, items, i) => {
|
|
223
|
-
if (i < items.length) {
|
|
224
|
-
await fn(items[i]);
|
|
225
|
-
await pipe(fn, items, ++i);
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
return curry2((fn, items) => pipe(fn, items, 0));
|
|
229
|
-
})();
|
|
230
|
-
/** Promise.all wrapper for functional pipelining. */
|
|
231
|
-
export const waitAll = (promises) => Promise.all(promises);
|
|
232
|
-
export const waitTap = curry2(async (fn, s) => { await fn(s); return s; });
|
|
233
|
-
/** Waits for all promises mapped by the fn. */
|
|
234
|
-
export const forEachAsync = curry2((fn, items) => Promise.all(items.map(fn)));
|
|
235
|
-
/** The same as compose, but waits for promises in chains and returns a Promise. */
|
|
236
|
-
export const composeAsync = (() => {
|
|
237
|
-
const pipe = async (fns, data, i) => ~i ? await pipe(fns, await fns[i](data), --i) : data;
|
|
238
|
-
return (...fns) => (data) => pipe(fns, data, fns.length - 1);
|
|
239
|
-
})(); // as FT.Compose<'async'>
|
|
240
|
-
// ALIASES
|
|
241
|
-
export const mirror = identity;
|
|
242
|
-
export const reflect = identity;
|
|
243
|
-
export const echo = identity;
|
package/src/strings.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { path } from "./safe";
|
|
2
|
-
export const getTmpl = (tmpl) => {
|
|
3
|
-
const parts = [];
|
|
4
|
-
const keymap = [];
|
|
5
|
-
const len = tmpl.length;
|
|
6
|
-
let i = 0, s, ln, start = 0, open = false;
|
|
7
|
-
for (i = 0; i < len; i++) {
|
|
8
|
-
s = tmpl[i];
|
|
9
|
-
switch (s) {
|
|
10
|
-
case '{':
|
|
11
|
-
open = true;
|
|
12
|
-
start = i;
|
|
13
|
-
break;
|
|
14
|
-
case '}':
|
|
15
|
-
open = false;
|
|
16
|
-
parts.push('');
|
|
17
|
-
keymap.push(tmpl.slice(start + 1, i));
|
|
18
|
-
break;
|
|
19
|
-
default:
|
|
20
|
-
if (!open) {
|
|
21
|
-
ln = parts.length - 1;
|
|
22
|
-
if (ln < 0) {
|
|
23
|
-
parts.push('');
|
|
24
|
-
ln++;
|
|
25
|
-
}
|
|
26
|
-
parts[ln] += s;
|
|
27
|
-
}
|
|
28
|
-
break;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return (data) => {
|
|
32
|
-
const out = [];
|
|
33
|
-
const ln = parts.length - 1;
|
|
34
|
-
for (const j in parts) {
|
|
35
|
-
i = +j;
|
|
36
|
-
out.push(parts[i]);
|
|
37
|
-
if (i !== ln)
|
|
38
|
-
out.push(path(keymap[i].split('.'), data));
|
|
39
|
-
}
|
|
40
|
-
return out.join('');
|
|
41
|
-
};
|
|
42
|
-
};
|
package/src/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/src/uncurry.js
DELETED
package/src/utils.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const undef = undefined;
|
|
2
|
-
export const nul = null;
|
|
3
|
-
export const inf = Infinity;
|
|
4
|
-
export const to = (s) => typeof s;
|
|
5
|
-
export const isNull = (s) => s === nul;
|
|
6
|
-
export const isUndef = (s) => s === undef;
|
|
7
|
-
export const isNum = (s) => to(s) == 'number';
|
|
8
|
-
export const isArray = (s) => Array.isArray(s);
|
|
9
|
-
export const isFunc = (s) => to(s) === 'function';
|
|
10
|
-
export const isStr = (s) => to(s) === 'string';
|
|
11
|
-
export const isObj = (s) => !isNull(s) && to(s) === 'object';
|