@spare/util
Advanced tools
Comparing version 0.0.5 to 0.0.6
@@ -7,7 +7,5 @@ 'use strict'; | ||
var typen = require('typen'); | ||
var matrix = require('@vect/matrix'); | ||
var vector = require('@vect/vector'); | ||
const { | ||
isNumeric | ||
} = typen.Num; | ||
const noop = () => {}; | ||
@@ -54,2 +52,6 @@ /** | ||
const { | ||
isNumeric | ||
} = typen.Num; | ||
const lpad = (tx, pd, ansi = false, fill) => ansi && lange.hasAnsi(tx) ? tx.padStart(tx.length + pd - lange.lange(tx), fill) : tx.padStart(pd, fill); | ||
@@ -79,35 +81,2 @@ const rpad = (tx, pd, ansi = false, fill) => ansi && lange.hasAnsi(tx) ? tx.padEnd(tx.length + pd - lange.lange(tx), fill) : tx.padEnd(pd, fill); | ||
/** | ||
* | ||
* @param {*[][]} mx | ||
* @returns {number[]} | ||
*/ | ||
const coins = mx => mx[0].map((_, i) => i); | ||
const width = mx => mx[0].length; | ||
/** | ||
* Transpose a 2d-array. | ||
* @param {*[][]} mx | ||
* @returns {*[][]} | ||
*/ | ||
const tr = mx => coins(mx).map(n => mx.map(r => r[n])); | ||
/** | ||
* | ||
* @param {*[]} a | ||
* @param {*[]} b | ||
* @param {function(*,*,number?)} zipper | ||
* @return {*[]} | ||
*/ | ||
function zip(a, b, zipper) { | ||
const { | ||
length | ||
} = a, | ||
arr = Array(length); | ||
for (let i = 0; i < length; i++) arr[i] = zipper(a[i], b[i], i); | ||
return arr; | ||
} | ||
const rn = '\r\n'; | ||
@@ -138,3 +107,4 @@ const tb = ' '; | ||
})); | ||
const indexMaxLen = (arr, base = 0) => ~~Math.log10(arr.length + base) + 1; | ||
const intDigits = num => (num = ~~Math.log10(Math.abs(num)), ++num); | ||
const indexMaxLen = (arr, base = 0) => intDigits(arr.length + base); | ||
@@ -235,64 +205,941 @@ /** | ||
const { | ||
isNumeric: isNumeric$1 | ||
} = typen.Num; | ||
/** | ||
* | ||
* @param {*} x | ||
* @return {string} | ||
*/ | ||
const lpad$1 = (tx, pd, ansi = false, fill) => ansi && lange.hasAnsi(tx) ? tx.padStart(tx.length + pd - lange.lange(tx), fill) : tx.padStart(pd, fill); | ||
const rpad$1 = (tx, pd, ansi = false, fill) => ansi && lange.hasAnsi(tx) ? tx.padEnd(tx.length + pd - lange.lange(tx), fill) : tx.padEnd(pd, fill); | ||
const totx$1 = x => `${x}`; | ||
const npad$1 = (tx, ref, pd, ansi = false, fill) => isNumeric$1(ref) ? lpad$1(tx, pd, ansi, fill) : rpad$1(tx, pd, ansi, fill); // export const isVisual = visual => | ||
const isTab$1 = c => c === '\t' || c === ' '; | ||
const tabify$1 = tx => { | ||
var _tx; | ||
const i = (_tx = tx, deNaTab$1(_tx)); | ||
return endsBracs$1(tx) ? tx : `${tx.substring(0, i)}[${tx.substring(i)}]`; | ||
}; | ||
const deNaTab$1 = tx => { | ||
let i = 0; | ||
for (let { | ||
length | ||
} = tx; i < length; i++) if (!isTab$1(tx.charAt(i))) return i; | ||
return i; | ||
}; | ||
const endsBracs$1 = tx => tx.endsWith(')') || tx.endsWith(']'); | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
class Callable extends Function { | ||
constructor(f) { | ||
super(); | ||
Reflect.setPrototypeOf(f, new.target.prototype); | ||
return f; | ||
} | ||
} | ||
class Zu { | ||
/** | ||
* Generate a random integer between [min, max]. | ||
* Both min & max are inclusive. | ||
* @param {Number} min Int | ||
* @param {Number} max Int | ||
* @returns {Number} Int | ||
* @deprecated Prefer Roulett.between in npm package Roulett | ||
*/ | ||
static randBetween(min, max) { | ||
return ~~(Math.random() * (max - min + 1)) + min; | ||
} | ||
/** | ||
* Generate a random integer between [min, max). | ||
* Notice: min is inclusive & max is exclusive. | ||
* @param {Number} min Int | ||
* @param {Number} max(exclusive) Int | ||
* @returns {Number} Int | ||
* @deprecated Prefer Roulett.rand in npm package Roulett | ||
*/ | ||
static rand(min, max) { | ||
return ~~(Math.random() * (max - min)) + min; | ||
} | ||
static almostEquals(x, y, epsilon) { | ||
return Math.abs(x - y) < epsilon; | ||
} | ||
static almostInt(x, epsilon) { | ||
// let rounded = Math.round(x) | ||
// return rounded - epsilon < x && rounded + epsilon > x | ||
return Math.abs(x - Math.round(x)) < epsilon; | ||
} | ||
/** | ||
* | ||
* @param {number} x | ||
* @returns {number} | ||
*/ | ||
static intExponent(x) { | ||
return ~~Math.log10(x); | ||
} | ||
/** | ||
* | ||
* @param {number} x | ||
* @returns {number} | ||
*/ | ||
static round(x) { | ||
return x + (x > 0 ? 0.5 : -0.5) << 0; | ||
} | ||
} // ? x => Math.log10(x) | ||
/** | ||
* | ||
* @param {*[][]} mx | ||
* @returns {number[]} | ||
* @param {number} n | ||
* @param {number} h | ||
* @param {number} a | ||
* @param {number} l | ||
* @returns {number} | ||
*/ | ||
const coins$1 = mx => mx[0].map((_, i) => i); | ||
const hf = (n, h, a, l) => { | ||
const k = (n + h / 30) % 12; | ||
return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); | ||
}; | ||
const { | ||
round | ||
} = Zu; // export const round = x => ~~x | ||
class Hsl { | ||
/** | ||
* | ||
* @param {number} h | ||
* @param {number} s | ||
* @param {number} l | ||
* @returns {number[]} | ||
*/ | ||
static toRgb([h, s, l]) { | ||
s /= 100; | ||
l /= 100; | ||
const a = s * Math.min(l, 1 - l), | ||
r = hf(0, h, a, l), | ||
g = hf(8, h, a, l), | ||
b = hf(4, h, a, l); | ||
return [round(r * 0xFF), round(g * 0xFF), round(b * 0xFF)]; // return [r * 0xFF & 0xFF, g * 0xFF & 0xFF, b * 0xFF & 0xFF] | ||
} | ||
} | ||
const hue = (r, g, b, max, dif) => { | ||
if (dif === 0) return 0; | ||
switch (max) { | ||
case r: | ||
return ((g - b) / dif + (g < b ? 6 : 0)) % 6; | ||
case g: | ||
return (b - r) / dif + 2; | ||
case b: | ||
return (r - g) / dif + 4; | ||
} | ||
}; | ||
const bound = ([r, g, b]) => { | ||
let ma = r, | ||
mi = r; | ||
if (g > r) { | ||
ma = g; | ||
} else { | ||
mi = g; | ||
} | ||
if (b > ma) ma = b; | ||
if (b < mi) mi = b; | ||
return { | ||
max: ma, | ||
sum: ma + mi, | ||
dif: ma - mi | ||
}; | ||
}; | ||
const expandHex = (hex, hi) => { | ||
hi = hi || hex.length; | ||
let x = ''; | ||
for (let i = 0, el; i < hi; i++) { | ||
el = hex[i]; | ||
x += el + el; | ||
} // for (let c of hex) x += c + c | ||
return x; | ||
}; | ||
class Rgb { | ||
/** | ||
* !dif: dif===0 | ||
* @param {number} r - [0,255] | ||
* @param {number} g - [0,255] | ||
* @param {number} b - [0,255] | ||
* @returns {[number,number,number]} [Hue([0,360]), Saturation([0,100]), Lightness([0,100])] | ||
*/ | ||
static toHsl([r, g, b]) { | ||
r /= 255; | ||
g /= 255; | ||
b /= 255; | ||
const { | ||
max, | ||
sum, | ||
dif | ||
} = bound([r, g, b]); | ||
let h = hue(r, g, b, max, dif) * 60, | ||
s = !dif ? 0 : sum > 1 ? dif / (2 - sum) : dif / sum, | ||
l = sum / 2; | ||
return [round(h), round(s * 1000) / 10, round(l * 1000) / 10]; | ||
} | ||
/** | ||
* | ||
* @param {number} r | ||
* @param {number} g | ||
* @param {number} b | ||
* @returns {string} | ||
*/ | ||
static toHex([r, g, b]) { | ||
// [r, g, b] = [Math.round(r), Math.round(g), Math.round(b)] | ||
return '#' + (((r & 0xFF) << 16) + ((g & 0xFF) << 8) + (b & 0xFF)).toString(16).toUpperCase().padStart(6, '0'); | ||
} | ||
static fromHex(hex) { | ||
if (hex.charAt(0) === '#') hex = hex.substring(1); | ||
if (!hex[3]) hex = expandHex(hex); | ||
const n = parseInt(hex, 16); | ||
return [n >> 16 & 0xFF, n >> 8 & 0xFF, n & 0xFF]; | ||
} | ||
} | ||
function _defineProperty$1(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
const ADD_FORE = '38;2'; | ||
const CLR_FORE = '39'; | ||
const ESC = '\u001b'; | ||
const Effects = { | ||
bold: ['1', '22'], | ||
italic: ['3', '23'], | ||
underline: ['4', '24'], | ||
inverse: ['7', '27'] | ||
}; | ||
const ConsoleColors = { | ||
black: '30', | ||
red: '31', | ||
green: '32', | ||
yellow: '33', | ||
blue: '34', | ||
magenta: '35', | ||
cyan: '36', | ||
white: '37', | ||
grey: '90' | ||
}; | ||
const br$1 = config => `${ESC}[${config.join(';')}m`; | ||
const render = (tx, { | ||
color, | ||
head, | ||
tail | ||
} = {}) => { | ||
let h = Array.isArray(color) ? [ADD_FORE].concat(color.slice(0, 3)) : [ConsoleColors[color] || ConsoleColors.white], | ||
t = [CLR_FORE], | ||
ve; | ||
if (head && (ve = Object.values(head)) && ve.length) h = h.concat(ve); | ||
if (tail && (ve = Object.values(tail)) && ve.length) t = t.concat(ve); | ||
return br$1(h) + tx + br$1(t); | ||
}; | ||
const rgbToLong = ([r, g, b]) => ((r & 0xFF) << 16) + ((g & 0xFF) << 8) + (b & 0xFF); | ||
let _Symbol$toPrimitive; // let n = 0 | ||
_Symbol$toPrimitive = Symbol.toPrimitive; | ||
class Hatsu extends Callable { | ||
/** @property {{color:([*,*,*]), head:{}, tail:{}}} */ | ||
constructor(rgb) { | ||
super(msg => render(msg, this.config)); | ||
_defineProperty$1(this, "config", void 0); | ||
this.config = { | ||
color: rgb, | ||
head: {}, | ||
tail: {} | ||
}; | ||
return new Proxy(this, { | ||
/** | ||
* | ||
* @param target | ||
* @param p | ||
* @param receiver | ||
* @returns {Hatsu|function(string):string} | ||
*/ | ||
get(target, p, receiver) { | ||
if (p in target) return target[p]; | ||
if (p.startsWith('ext')) return (p = p.slice(3).toLowerCase()) in Effects ? target.removeEffect(p) : (target.clear(), receiver); | ||
const { | ||
config | ||
} = target; | ||
if (p in Effects && !(p in config)) return [config.head[p], config.tail[p]] = Effects[p], receiver; | ||
if (p in ConsoleColors) return config.color = p, receiver; | ||
return receiver; | ||
} | ||
}); | ||
} | ||
[_Symbol$toPrimitive](h) { | ||
const { | ||
config | ||
} = this; | ||
switch (h) { | ||
case 'string': | ||
case 'default': | ||
return render(config.color, config); | ||
case 'number': | ||
return Array.isArray(config.color) ? rgbToLong(config.color) : Number.NaN; | ||
default: | ||
throw new Error('ink Symbol.toPrimitive error'); | ||
} | ||
} | ||
/** | ||
* | ||
* @param {number[]} arr | ||
* @returns {Hatsu|function} | ||
*/ | ||
static rgb(arr) { | ||
return new Hatsu(arr); | ||
} | ||
/** | ||
* | ||
* @param str | ||
* @returns {Hatsu|function} | ||
*/ | ||
static hex(str) { | ||
return Hatsu.rgb(Rgb.fromHex(str)); | ||
} | ||
/** | ||
* | ||
* @param arr | ||
* @returns {Hatsu|function} | ||
*/ | ||
static hsl(arr) { | ||
return Hatsu.rgb(Hsl.toRgb(arr)); | ||
} | ||
rgb(rgb, text) { | ||
const { | ||
config | ||
} = this; | ||
config.color = rgb; | ||
return text ? render(text, config) : this; | ||
} | ||
hex(hex, text) { | ||
const { | ||
config | ||
} = this; | ||
config.color = Rgb.fromHex(hex); | ||
return text ? render(text, config) : this; | ||
} | ||
removeEffect(effect) { | ||
const { | ||
config | ||
} = this; | ||
delete config.head[effect]; | ||
delete config.tail[effect]; | ||
return this; | ||
} | ||
clear() { | ||
const { | ||
config | ||
} = this; | ||
config.head = {}; | ||
config.tail = {}; | ||
return this; | ||
} | ||
} | ||
const red = { | ||
base: '#F44336', | ||
lighten_5: '#FFEBEE', | ||
lighten_4: '#FFCDD2', | ||
lighten_3: '#EF9A9A', | ||
lighten_2: '#E57373', | ||
lighten_1: '#EF5350', | ||
darken_1: '#E53935', | ||
darken_2: '#D32F2F', | ||
darken_3: '#C62828', | ||
darken_4: '#B71C1C', | ||
accent_1: '#FF8A80', | ||
accent_2: '#FF5252', | ||
accent_3: '#FF1744', | ||
accent_4: '#D50000' | ||
}; | ||
const pink = { | ||
base: '#E91E63', | ||
lighten_5: '#FCE4EC', | ||
lighten_4: '#F8BBD0', | ||
lighten_3: '#F48FB1', | ||
lighten_2: '#F06292', | ||
lighten_1: '#EC407A', | ||
darken_1: '#D81B60', | ||
darken_2: '#C2185B', | ||
darken_3: '#AD1457', | ||
darken_4: '#880E4F', | ||
accent_1: '#FF80AB', | ||
accent_2: '#FF4081', | ||
accent_3: '#F50057', | ||
accent_4: '#C51162' | ||
}; | ||
const purple = { | ||
base: '#9C27B0', | ||
lighten_5: '#F3E5F5', | ||
lighten_4: '#E1BEE7', | ||
lighten_3: '#CE93D8', | ||
lighten_2: '#BA68C8', | ||
lighten_1: '#AB47BC', | ||
darken_1: '#8E24AA', | ||
darken_2: '#7B1FA2', | ||
darken_3: '#6A1B9A', | ||
darken_4: '#4A148C', | ||
accent_1: '#EA80FC', | ||
accent_2: '#E040FB', | ||
accent_3: '#D500F9', | ||
accent_4: '#AA00FF' | ||
}; | ||
const deepPurple = { | ||
base: '#673AB7', | ||
lighten_5: '#EDE7F6', | ||
lighten_4: '#D1C4E9', | ||
lighten_3: '#B39DDB', | ||
lighten_2: '#9575CD', | ||
lighten_1: '#7E57C2', | ||
darken_1: '#5E35B1', | ||
darken_2: '#512DA8', | ||
darken_3: '#4527A0', | ||
darken_4: '#311B92', | ||
accent_1: '#B388FF', | ||
accent_2: '#7C4DFF', | ||
accent_3: '#651FFF', | ||
accent_4: '#6200EA' | ||
}; | ||
const indigo = { | ||
base: '#3F51B5', | ||
lighten_5: '#E8EAF6', | ||
lighten_4: '#C5CAE9', | ||
lighten_3: '#9FA8DA', | ||
lighten_2: '#7986CB', | ||
lighten_1: '#5C6BC0', | ||
darken_1: '#3949AB', | ||
darken_2: '#303F9F', | ||
darken_3: '#283593', | ||
darken_4: '#1A237E', | ||
accent_1: '#8C9EFF', | ||
accent_2: '#536DFE', | ||
accent_3: '#3D5AFE', | ||
accent_4: '#304FFE' | ||
}; | ||
const blue = { | ||
base: '#2196F3', | ||
lighten_5: '#E3F2FD', | ||
lighten_4: '#BBDEFB', | ||
lighten_3: '#90CAF9', | ||
lighten_2: '#64B5F6', | ||
lighten_1: '#42A5F5', | ||
darken_1: '#1E88E5', | ||
darken_2: '#1976D2', | ||
darken_3: '#1565C0', | ||
darken_4: '#0D47A1', | ||
accent_1: '#82B1FF', | ||
accent_2: '#448AFF', | ||
accent_3: '#2979FF', | ||
accent_4: '#2962FF' | ||
}; | ||
const lightBlue = { | ||
base: '#03A9F4', | ||
lighten_5: '#E1F5FE', | ||
lighten_4: '#B3E5FC', | ||
lighten_3: '#81D4FA', | ||
lighten_2: '#4FC3F7', | ||
lighten_1: '#29B6F6', | ||
darken_1: '#039BE5', | ||
darken_2: '#0288D1', | ||
darken_3: '#0277BD', | ||
darken_4: '#01579B', | ||
accent_1: '#80D8FF', | ||
accent_2: '#40C4FF', | ||
accent_3: '#00B0FF', | ||
accent_4: '#0091EA' | ||
}; | ||
const cyan = { | ||
base: '#00BCD4', | ||
lighten_5: '#E0F7FA', | ||
lighten_4: '#B2EBF2', | ||
lighten_3: '#80DEEA', | ||
lighten_2: '#4DD0E1', | ||
lighten_1: '#26C6DA', | ||
darken_1: '#00ACC1', | ||
darken_2: '#0097A7', | ||
darken_3: '#00838F', | ||
darken_4: '#006064', | ||
accent_1: '#84FFFF', | ||
accent_2: '#18FFFF', | ||
accent_3: '#00E5FF', | ||
accent_4: '#00B8D4' | ||
}; | ||
const teal = { | ||
base: '#009688', | ||
lighten_5: '#E0F2F1', | ||
lighten_4: '#B2DFDB', | ||
lighten_3: '#80CBC4', | ||
lighten_2: '#4DB6AC', | ||
lighten_1: '#26A69A', | ||
darken_1: '#00897B', | ||
darken_2: '#00796B', | ||
darken_3: '#00695C', | ||
darken_4: '#004D40', | ||
accent_1: '#A7FFEB', | ||
accent_2: '#64FFDA', | ||
accent_3: '#1DE9B6', | ||
accent_4: '#00BFA5' | ||
}; | ||
const green = { | ||
base: '#4CAF50', | ||
lighten_5: '#E8F5E9', | ||
lighten_4: '#C8E6C9', | ||
lighten_3: '#A5D6A7', | ||
lighten_2: '#81C784', | ||
lighten_1: '#66BB6A', | ||
darken_1: '#43A047', | ||
darken_2: '#388E3C', | ||
darken_3: '#2E7D32', | ||
darken_4: '#1B5E20', | ||
accent_1: '#B9F6CA', | ||
accent_2: '#69F0AE', | ||
accent_3: '#00E676', | ||
accent_4: '#00C853' | ||
}; | ||
const lightGreen = { | ||
base: '#8BC34A', | ||
lighten_5: '#F1F8E9', | ||
lighten_4: '#DCEDC8', | ||
lighten_3: '#C5E1A5', | ||
lighten_2: '#AED581', | ||
lighten_1: '#9CCC65', | ||
darken_1: '#7CB342', | ||
darken_2: '#689F38', | ||
darken_3: '#558B2F', | ||
darken_4: '#33691E', | ||
accent_1: '#CCFF90', | ||
accent_2: '#B2FF59', | ||
accent_3: '#76FF03', | ||
accent_4: '#64DD17' | ||
}; | ||
const lime = { | ||
base: '#CDDC39', | ||
lighten_5: '#F9FBE7', | ||
lighten_4: '#F0F4C3', | ||
lighten_3: '#E6EE9C', | ||
lighten_2: '#DCE775', | ||
lighten_1: '#D4E157', | ||
darken_1: '#C0CA33', | ||
darken_2: '#AFB42B', | ||
darken_3: '#9E9D24', | ||
darken_4: '#827717', | ||
accent_1: '#F4FF81', | ||
accent_2: '#EEFF41', | ||
accent_3: '#C6FF00', | ||
accent_4: '#AEEA00' | ||
}; | ||
const yellow = { | ||
base: '#FFEB3B', | ||
lighten_5: '#FFFDE7', | ||
lighten_4: '#FFF9C4', | ||
lighten_3: '#FFF59D', | ||
lighten_2: '#FFF176', | ||
lighten_1: '#FFEE58', | ||
darken_1: '#FDD835', | ||
darken_2: '#FBC02D', | ||
darken_3: '#F9A825', | ||
darken_4: '#F57F17', | ||
accent_1: '#FFFF8D', | ||
accent_2: '#FFFF00', | ||
accent_3: '#FFEA00', | ||
accent_4: '#FFD600' | ||
}; | ||
const amber = { | ||
base: '#FFC107', | ||
lighten_5: '#FFF8E1', | ||
lighten_4: '#FFECB3', | ||
lighten_3: '#FFE082', | ||
lighten_2: '#FFD54F', | ||
lighten_1: '#FFCA28', | ||
darken_1: '#FFB300', | ||
darken_2: '#FFA000', | ||
darken_3: '#FF8F00', | ||
darken_4: '#FF6F00', | ||
accent_1: '#FFE57F', | ||
accent_2: '#FFD740', | ||
accent_3: '#FFC400', | ||
accent_4: '#FFAB00' | ||
}; | ||
const orange = { | ||
base: '#FF9800', | ||
lighten_5: '#FFF3E0', | ||
lighten_4: '#FFE0B2', | ||
lighten_3: '#FFCC80', | ||
lighten_2: '#FFB74D', | ||
lighten_1: '#FFA726', | ||
darken_1: '#FB8C00', | ||
darken_2: '#F57C00', | ||
darken_3: '#EF6C00', | ||
darken_4: '#E65100', | ||
accent_1: '#FFD180', | ||
accent_2: '#FFAB40', | ||
accent_3: '#FF9100', | ||
accent_4: '#FF6D00' | ||
}; | ||
const deepOrange = { | ||
base: '#FF5722', | ||
lighten_5: '#FBE9E7', | ||
lighten_4: '#FFCCBC', | ||
lighten_3: '#FFAB91', | ||
lighten_2: '#FF8A65', | ||
lighten_1: '#FF7043', | ||
darken_1: '#F4511E', | ||
darken_2: '#E64A19', | ||
darken_3: '#D84315', | ||
darken_4: '#BF360C', | ||
accent_1: '#FF9E80', | ||
accent_2: '#FF6E40', | ||
accent_3: '#FF3D00', | ||
accent_4: '#DD2C00' | ||
}; | ||
const brown = { | ||
base: '#795548', | ||
lighten_5: '#EFEBE9', | ||
lighten_4: '#D7CCC8', | ||
lighten_3: '#BCAAA4', | ||
lighten_2: '#A1887F', | ||
lighten_1: '#8D6E63', | ||
darken_1: '#6D4C41', | ||
darken_2: '#5D4037', | ||
darken_3: '#4E342E', | ||
darken_4: '#3E2723', | ||
accent_1: '#D2BEB6', | ||
accent_2: '#B59387', | ||
accent_3: '#A27767', | ||
accent_4: '#855F51' | ||
}; | ||
const blueGrey = { | ||
base: '#607D8B', | ||
lighten_5: '#ECEFF1', | ||
lighten_4: '#CFD8DC', | ||
lighten_3: '#B0BEC5', | ||
lighten_2: '#90A4AE', | ||
lighten_1: '#78909C', | ||
darken_1: '#546E7A', | ||
darken_2: '#455A64', | ||
darken_3: '#37474F', | ||
darken_4: '#263238', | ||
accent_1: '#B7C9D1', | ||
accent_2: '#89A5B3', | ||
accent_3: '#6A8EA0', | ||
accent_4: '#547383' | ||
}; | ||
const grey = { | ||
base: '#9E9E9E', | ||
lighten_5: '#FAFAFA', | ||
lighten_4: '#F5F5F5', | ||
lighten_3: '#EEEEEE', | ||
lighten_2: '#E0E0E0', | ||
lighten_1: '#BDBDBD', | ||
darken_1: '#757575', | ||
darken_2: '#616161', | ||
darken_3: '#424242', | ||
darken_4: '#212121', | ||
accent_1: '#C4C4C4', | ||
accent_2: '#9E9E9E', | ||
accent_3: '#858585', | ||
accent_4: '#6B6B6B' | ||
}; | ||
/** | ||
* Transpose a 2d-array. | ||
* @param {*[][]} mx | ||
* @returns {*[][]} | ||
* | ||
* @param {Object} palett | ||
* @returns {Object|{colors:string[],degrees:string[]}} | ||
*/ | ||
const addProps = palett => { | ||
Reflect.defineProperty(palett, 'colors', { | ||
get() { | ||
return Object.keys(palett); | ||
}, | ||
const tr$1 = mx => coins$1(mx).map(n => mx.map(r => r[n])); | ||
enumerable: false | ||
}); | ||
Reflect.defineProperty(palett, 'degrees', { | ||
get() { | ||
for (let color in palett) return Object.keys(palett[color]); | ||
}, | ||
enumerable: false | ||
}); | ||
return palett; | ||
}; | ||
var _red$pink$purple$deep; | ||
/** | ||
* | ||
* @param {*[]} a | ||
* @param {*[]} b | ||
* @param {function(*,*,number?)} zipper | ||
* @return {*[]} | ||
* @type {Object.<string,Object<string,Object>>} | ||
* @property {string[]} colors | ||
* @property {string[]} degrees | ||
*/ | ||
function zip$1(a, b, zipper) { | ||
const { | ||
length | ||
} = a, | ||
arr = Array(length); | ||
const Palett = (_red$pink$purple$deep = { | ||
red, | ||
pink, | ||
purple, | ||
deepPurple, | ||
indigo, | ||
blue, | ||
lightBlue, | ||
cyan, | ||
teal, | ||
green, | ||
lightGreen, | ||
lime, | ||
yellow, | ||
amber, | ||
orange, | ||
deepOrange, | ||
brown, | ||
blueGrey, | ||
grey | ||
}, addProps(_red$pink$purple$deep)); | ||
const { | ||
hex | ||
} = Hatsu; | ||
const Thm = { | ||
brm: hex(Palett.blueGrey.base), | ||
br: hex(Palett.orange.lighten_3), | ||
pr: hex(Palett.indigo.lighten_1) | ||
}; | ||
for (let i = 0; i < length; i++) arr[i] = zipper(a[i], b[i], i); | ||
const bracketMain = tx => Thm.brm('[') + tx + Thm.brm(']'); | ||
return arr; | ||
const bracket = tx => Thm.br('[') + tx + Thm.br(']'); | ||
const parenthesis = tx => Thm.pr('(') + tx + Thm.pr(')'); | ||
const render$1 = (tx, { | ||
indent, | ||
stream | ||
}) => { | ||
if (tx === null || tx === void 0 ? void 0 : tx.length) stream.push(tx); | ||
return ' '.repeat(indent << 1) + stream.join(' '); | ||
}; | ||
const preset = (label, ...items) => { | ||
var _label; | ||
let stream = [], | ||
indent, | ||
len; | ||
if (label && (label = String(label)) && (len = label.length) && (indent = (_label = label, deNaTab$1(_label))) < len) { | ||
var _label$slice; | ||
stream.push((_label$slice = label.slice(indent), bracketMain(_label$slice))); | ||
} | ||
if (items.length) { | ||
var _items$map$join; | ||
stream.push((_items$map$join = items.map(totx$1).join(','), parenthesis(_items$map$join))); | ||
} | ||
return { | ||
indent, | ||
stream | ||
}; | ||
}; | ||
let _Symbol$toPrimitive$1; | ||
class Callable$1 extends Function { | ||
constructor(f) { | ||
super(); | ||
Reflect.setPrototypeOf(f, new.target.prototype); | ||
return f; | ||
} | ||
} | ||
const DASH$1 = '-'; | ||
const SPACE$1 = ' '; | ||
const FAChars$1 = { | ||
dash: DASH$1, | ||
space: SPACE$1 | ||
}; | ||
/** | ||
* | ||
* @param {Array<?string>} arr | ||
* @param ansi | ||
* @type {object<string,string>} | ||
*/ | ||
const maxLen$1 = (arr, ansi = false) => ansi ? Math.max(...arr.map(x => x ? lange.lange(x) : 0)) : Math.max(...arr.map(x => { | ||
var _ref; | ||
return (_ref = x === null || x === void 0 ? void 0 : x.length) !== null && _ref !== void 0 ? _ref : 0; | ||
})); | ||
_Symbol$toPrimitive$1 = Symbol.toPrimitive; | ||
class Ink extends Callable$1 { | ||
/** @type {number} */ | ||
/** @type {string[]} */ | ||
constructor(label, ...items) { | ||
super(tx => render$1(tx, this)); | ||
_defineProperty(this, "indent", void 0); | ||
_defineProperty(this, "stream", void 0); | ||
this.cr(label, ...items); | ||
return new Proxy(this, { | ||
/** @returns {Ink|function(...string):Ink} */ | ||
get(target, p, receiver) { | ||
var _String; | ||
if (p in target) return target[p]; | ||
target.stream.push((_String = String(p), bracket(_String))); | ||
return (...items) => { | ||
var _items$map$join; | ||
target.stream.push((_items$map$join = items.map(totx$1).join(', '), parenthesis(_items$map$join))); | ||
return receiver; | ||
}; | ||
} | ||
}); | ||
} | ||
[_Symbol$toPrimitive$1](h) { | ||
switch (h) { | ||
case 'string': | ||
case 'default': | ||
return render$1(null, this); | ||
case 'number': | ||
return this.indent; | ||
default: | ||
throw new Error('ink Symbol.toPrimitive error'); | ||
} | ||
} | ||
cr(label, ...items) { | ||
const { | ||
indent, | ||
stream | ||
} = preset(label, ...items); | ||
this.indent = indent; | ||
this.stream = stream; | ||
return this; | ||
} | ||
asc() { | ||
this.indent++; | ||
return this; | ||
} | ||
desc() { | ||
this.indent--; | ||
return this; | ||
} | ||
tag(key, ...items) { | ||
var _ref, _key, _items$map$join2; | ||
this.stream.push((_ref = (_key = key, totx$1(_key)), tabify$1(_ref))); | ||
if (items.length) this.stream.push((_items$map$join2 = items.map(totx$1).join(','), parenthesis(_items$map$join2))); | ||
return this; | ||
} | ||
br(...items) { | ||
this.stream.push(items.map(parenthesis).join(',')); | ||
return this; | ||
} | ||
p(...items) { | ||
this.stream.push(...items); | ||
return this; | ||
} | ||
get tx() { | ||
return render$1(null, this); | ||
} | ||
get say() { | ||
return render$1(null, this); | ||
} | ||
toString() { | ||
return render$1(null, this); | ||
} | ||
} | ||
const ink = new Ink(); | ||
const FullAngleReg = /[\u4e00-\u9fa5]|[\uff00-\uffff]/; | ||
@@ -360,7 +1207,7 @@ /** | ||
}); | ||
const pads = tr$1([head].concat(text)).map(col => maxLen$1(col, ansi)), | ||
[h, hr, rows] = [zip$1(head, pads, (x, p) => lpad$1(x, p, ansi)), pads.map(l => '-'.repeat(l)), formatMatrix({ | ||
text: text, | ||
raw: raw, | ||
dye: dye, | ||
const pads = matrix.transpose([head].concat(text)).map(col => maxLen(col, ansi)), | ||
[h, hr, rows] = [vector.zipper(head, pads, (x, p) => lpad(x, p, ansi)), pads.map(l => '-'.repeat(l)), formatMatrix({ | ||
text, | ||
raw, | ||
dye, | ||
pads, | ||
@@ -397,3 +1244,3 @@ ansi | ||
space | ||
} = FAChars$1; | ||
} = FAChars; | ||
/** | ||
@@ -404,10 +1251,10 @@ * | ||
const pads = tr$1([head].concat(text)).map(col => ({ | ||
pd: maxLen$1(col, ansi), | ||
const pads = matrix.transpose([head].concat(text)).map(col => ({ | ||
pd: maxLen(col, ansi), | ||
cn: col.some(hasChn) | ||
})), | ||
[h, hr, rows] = [zip$1(head, pads, (x, { | ||
[h, hr, rows] = [vector.zipper(head, pads, (x, { | ||
cn, | ||
pd | ||
}) => cn ? rpad$1(toFullAngle(x), pd, ansi, space) : rpad$1(x, pd, ansi)), pads.map(p => (p.cn ? dash : '-').repeat(p.pd)), dye ? text.map((text, i) => zip$1(text, pads, (tx, { | ||
}) => cn ? rpad(toFullAngle(x), pd, ansi, space) : rpad(x, pd, ansi)), pads.map(p => (p.cn ? dash : '-').repeat(p.pd)), dye ? text.map((text, i) => vector.zipper(text, pads, (tx, { | ||
cn, | ||
@@ -418,7 +1265,7 @@ pd | ||
return cn ? (_npad = npad$1(toFullAngle(tx), raw[i][j], pd, ansi, space), dye[i][j](_npad)) : (_npad2 = npad$1(tx, raw[i][j], pd, ansi), dye[i][j](_npad2)); | ||
})) : text.map((text, i) => zip$1(text, pads, (tx, { | ||
return cn ? (_npad = npad(toFullAngle(tx), raw[i][j], pd, ansi, space), dye[i][j](_npad)) : (_npad2 = npad(tx, raw[i][j], pd, ansi), dye[i][j](_npad2)); | ||
})) : text.map((text, i) => vector.zipper(text, pads, (tx, { | ||
cn, | ||
pd | ||
}, j) => cn ? npad$1(toFullAngle(tx), raw[i][j], pd, ansi, space) : npad$1(tx, raw[i][j], pd, ansi)))]; | ||
}, j) => cn ? npad(toFullAngle(tx), raw[i][j], pd, ansi, space) : npad(tx, raw[i][j], pd, ansi)))]; | ||
return { | ||
@@ -442,3 +1289,2 @@ head: h, | ||
exports.br = br; | ||
exports.coins = coins; | ||
exports.deNaTab = deNaTab; | ||
@@ -450,2 +1296,3 @@ exports.endsBracs = endsBracs; | ||
exports.indexMaxLen = indexMaxLen; | ||
exports.intDigits = intDigits; | ||
exports.isNumeric = isNumeric; | ||
@@ -466,6 +1313,3 @@ exports.isTab = isTab; | ||
exports.totx = totx; | ||
exports.tr = tr; | ||
exports.vecPad = vecPad; | ||
exports.vecPalPad = vecPalPad; | ||
exports.width = width; | ||
exports.zip = zip; |
import { hasAnsi, lange } from '@spare/lange'; | ||
import { Num, OBJ } from 'typen'; | ||
import { transpose } from '@vect/matrix'; | ||
import { zipper } from '@vect/vector'; | ||
const { | ||
isNumeric | ||
} = Num; | ||
const noop = () => {}; | ||
@@ -49,2 +47,6 @@ /** | ||
const { | ||
isNumeric | ||
} = Num; | ||
const lpad = (tx, pd, ansi = false, fill) => ansi && hasAnsi(tx) ? tx.padStart(tx.length + pd - lange(tx), fill) : tx.padStart(pd, fill); | ||
@@ -74,35 +76,2 @@ const rpad = (tx, pd, ansi = false, fill) => ansi && hasAnsi(tx) ? tx.padEnd(tx.length + pd - lange(tx), fill) : tx.padEnd(pd, fill); | ||
/** | ||
* | ||
* @param {*[][]} mx | ||
* @returns {number[]} | ||
*/ | ||
const coins = mx => mx[0].map((_, i) => i); | ||
const width = mx => mx[0].length; | ||
/** | ||
* Transpose a 2d-array. | ||
* @param {*[][]} mx | ||
* @returns {*[][]} | ||
*/ | ||
const tr = mx => coins(mx).map(n => mx.map(r => r[n])); | ||
/** | ||
* | ||
* @param {*[]} a | ||
* @param {*[]} b | ||
* @param {function(*,*,number?)} zipper | ||
* @return {*[]} | ||
*/ | ||
function zip(a, b, zipper) { | ||
const { | ||
length | ||
} = a, | ||
arr = Array(length); | ||
for (let i = 0; i < length; i++) arr[i] = zipper(a[i], b[i], i); | ||
return arr; | ||
} | ||
const rn = '\r\n'; | ||
@@ -133,3 +102,4 @@ const tb = ' '; | ||
})); | ||
const indexMaxLen = (arr, base = 0) => ~~Math.log10(arr.length + base) + 1; | ||
const intDigits = num => (num = ~~Math.log10(Math.abs(num)), ++num); | ||
const indexMaxLen = (arr, base = 0) => intDigits(arr.length + base); | ||
@@ -230,64 +200,941 @@ /** | ||
const { | ||
isNumeric: isNumeric$1 | ||
} = Num; | ||
/** | ||
* | ||
* @param {*} x | ||
* @return {string} | ||
*/ | ||
const lpad$1 = (tx, pd, ansi = false, fill) => ansi && hasAnsi(tx) ? tx.padStart(tx.length + pd - lange(tx), fill) : tx.padStart(pd, fill); | ||
const rpad$1 = (tx, pd, ansi = false, fill) => ansi && hasAnsi(tx) ? tx.padEnd(tx.length + pd - lange(tx), fill) : tx.padEnd(pd, fill); | ||
const totx$1 = x => `${x}`; | ||
const npad$1 = (tx, ref, pd, ansi = false, fill) => isNumeric$1(ref) ? lpad$1(tx, pd, ansi, fill) : rpad$1(tx, pd, ansi, fill); // export const isVisual = visual => | ||
const isTab$1 = c => c === '\t' || c === ' '; | ||
const tabify$1 = tx => { | ||
var _tx; | ||
const i = (_tx = tx, deNaTab$1(_tx)); | ||
return endsBracs$1(tx) ? tx : `${tx.substring(0, i)}[${tx.substring(i)}]`; | ||
}; | ||
const deNaTab$1 = tx => { | ||
let i = 0; | ||
for (let { | ||
length | ||
} = tx; i < length; i++) if (!isTab$1(tx.charAt(i))) return i; | ||
return i; | ||
}; | ||
const endsBracs$1 = tx => tx.endsWith(')') || tx.endsWith(']'); | ||
function _defineProperty(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
class Callable extends Function { | ||
constructor(f) { | ||
super(); | ||
Reflect.setPrototypeOf(f, new.target.prototype); | ||
return f; | ||
} | ||
} | ||
class Zu { | ||
/** | ||
* Generate a random integer between [min, max]. | ||
* Both min & max are inclusive. | ||
* @param {Number} min Int | ||
* @param {Number} max Int | ||
* @returns {Number} Int | ||
* @deprecated Prefer Roulett.between in npm package Roulett | ||
*/ | ||
static randBetween(min, max) { | ||
return ~~(Math.random() * (max - min + 1)) + min; | ||
} | ||
/** | ||
* Generate a random integer between [min, max). | ||
* Notice: min is inclusive & max is exclusive. | ||
* @param {Number} min Int | ||
* @param {Number} max(exclusive) Int | ||
* @returns {Number} Int | ||
* @deprecated Prefer Roulett.rand in npm package Roulett | ||
*/ | ||
static rand(min, max) { | ||
return ~~(Math.random() * (max - min)) + min; | ||
} | ||
static almostEquals(x, y, epsilon) { | ||
return Math.abs(x - y) < epsilon; | ||
} | ||
static almostInt(x, epsilon) { | ||
// let rounded = Math.round(x) | ||
// return rounded - epsilon < x && rounded + epsilon > x | ||
return Math.abs(x - Math.round(x)) < epsilon; | ||
} | ||
/** | ||
* | ||
* @param {number} x | ||
* @returns {number} | ||
*/ | ||
static intExponent(x) { | ||
return ~~Math.log10(x); | ||
} | ||
/** | ||
* | ||
* @param {number} x | ||
* @returns {number} | ||
*/ | ||
static round(x) { | ||
return x + (x > 0 ? 0.5 : -0.5) << 0; | ||
} | ||
} // ? x => Math.log10(x) | ||
/** | ||
* | ||
* @param {*[][]} mx | ||
* @returns {number[]} | ||
* @param {number} n | ||
* @param {number} h | ||
* @param {number} a | ||
* @param {number} l | ||
* @returns {number} | ||
*/ | ||
const coins$1 = mx => mx[0].map((_, i) => i); | ||
const hf = (n, h, a, l) => { | ||
const k = (n + h / 30) % 12; | ||
return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); | ||
}; | ||
const { | ||
round | ||
} = Zu; // export const round = x => ~~x | ||
class Hsl { | ||
/** | ||
* | ||
* @param {number} h | ||
* @param {number} s | ||
* @param {number} l | ||
* @returns {number[]} | ||
*/ | ||
static toRgb([h, s, l]) { | ||
s /= 100; | ||
l /= 100; | ||
const a = s * Math.min(l, 1 - l), | ||
r = hf(0, h, a, l), | ||
g = hf(8, h, a, l), | ||
b = hf(4, h, a, l); | ||
return [round(r * 0xFF), round(g * 0xFF), round(b * 0xFF)]; // return [r * 0xFF & 0xFF, g * 0xFF & 0xFF, b * 0xFF & 0xFF] | ||
} | ||
} | ||
const hue = (r, g, b, max, dif) => { | ||
if (dif === 0) return 0; | ||
switch (max) { | ||
case r: | ||
return ((g - b) / dif + (g < b ? 6 : 0)) % 6; | ||
case g: | ||
return (b - r) / dif + 2; | ||
case b: | ||
return (r - g) / dif + 4; | ||
} | ||
}; | ||
const bound = ([r, g, b]) => { | ||
let ma = r, | ||
mi = r; | ||
if (g > r) { | ||
ma = g; | ||
} else { | ||
mi = g; | ||
} | ||
if (b > ma) ma = b; | ||
if (b < mi) mi = b; | ||
return { | ||
max: ma, | ||
sum: ma + mi, | ||
dif: ma - mi | ||
}; | ||
}; | ||
const expandHex = (hex, hi) => { | ||
hi = hi || hex.length; | ||
let x = ''; | ||
for (let i = 0, el; i < hi; i++) { | ||
el = hex[i]; | ||
x += el + el; | ||
} // for (let c of hex) x += c + c | ||
return x; | ||
}; | ||
class Rgb { | ||
/** | ||
* !dif: dif===0 | ||
* @param {number} r - [0,255] | ||
* @param {number} g - [0,255] | ||
* @param {number} b - [0,255] | ||
* @returns {[number,number,number]} [Hue([0,360]), Saturation([0,100]), Lightness([0,100])] | ||
*/ | ||
static toHsl([r, g, b]) { | ||
r /= 255; | ||
g /= 255; | ||
b /= 255; | ||
const { | ||
max, | ||
sum, | ||
dif | ||
} = bound([r, g, b]); | ||
let h = hue(r, g, b, max, dif) * 60, | ||
s = !dif ? 0 : sum > 1 ? dif / (2 - sum) : dif / sum, | ||
l = sum / 2; | ||
return [round(h), round(s * 1000) / 10, round(l * 1000) / 10]; | ||
} | ||
/** | ||
* | ||
* @param {number} r | ||
* @param {number} g | ||
* @param {number} b | ||
* @returns {string} | ||
*/ | ||
static toHex([r, g, b]) { | ||
// [r, g, b] = [Math.round(r), Math.round(g), Math.round(b)] | ||
return '#' + (((r & 0xFF) << 16) + ((g & 0xFF) << 8) + (b & 0xFF)).toString(16).toUpperCase().padStart(6, '0'); | ||
} | ||
static fromHex(hex) { | ||
if (hex.charAt(0) === '#') hex = hex.substring(1); | ||
if (!hex[3]) hex = expandHex(hex); | ||
const n = parseInt(hex, 16); | ||
return [n >> 16 & 0xFF, n >> 8 & 0xFF, n & 0xFF]; | ||
} | ||
} | ||
function _defineProperty$1(obj, key, value) { | ||
if (key in obj) { | ||
Object.defineProperty(obj, key, { | ||
value: value, | ||
enumerable: true, | ||
configurable: true, | ||
writable: true | ||
}); | ||
} else { | ||
obj[key] = value; | ||
} | ||
return obj; | ||
} | ||
const ADD_FORE = '38;2'; | ||
const CLR_FORE = '39'; | ||
const ESC = '\u001b'; | ||
const Effects = { | ||
bold: ['1', '22'], | ||
italic: ['3', '23'], | ||
underline: ['4', '24'], | ||
inverse: ['7', '27'] | ||
}; | ||
const ConsoleColors = { | ||
black: '30', | ||
red: '31', | ||
green: '32', | ||
yellow: '33', | ||
blue: '34', | ||
magenta: '35', | ||
cyan: '36', | ||
white: '37', | ||
grey: '90' | ||
}; | ||
const br$1 = config => `${ESC}[${config.join(';')}m`; | ||
const render = (tx, { | ||
color, | ||
head, | ||
tail | ||
} = {}) => { | ||
let h = Array.isArray(color) ? [ADD_FORE].concat(color.slice(0, 3)) : [ConsoleColors[color] || ConsoleColors.white], | ||
t = [CLR_FORE], | ||
ve; | ||
if (head && (ve = Object.values(head)) && ve.length) h = h.concat(ve); | ||
if (tail && (ve = Object.values(tail)) && ve.length) t = t.concat(ve); | ||
return br$1(h) + tx + br$1(t); | ||
}; | ||
const rgbToLong = ([r, g, b]) => ((r & 0xFF) << 16) + ((g & 0xFF) << 8) + (b & 0xFF); | ||
let _Symbol$toPrimitive; // let n = 0 | ||
_Symbol$toPrimitive = Symbol.toPrimitive; | ||
class Hatsu extends Callable { | ||
/** @property {{color:([*,*,*]), head:{}, tail:{}}} */ | ||
constructor(rgb) { | ||
super(msg => render(msg, this.config)); | ||
_defineProperty$1(this, "config", void 0); | ||
this.config = { | ||
color: rgb, | ||
head: {}, | ||
tail: {} | ||
}; | ||
return new Proxy(this, { | ||
/** | ||
* | ||
* @param target | ||
* @param p | ||
* @param receiver | ||
* @returns {Hatsu|function(string):string} | ||
*/ | ||
get(target, p, receiver) { | ||
if (p in target) return target[p]; | ||
if (p.startsWith('ext')) return (p = p.slice(3).toLowerCase()) in Effects ? target.removeEffect(p) : (target.clear(), receiver); | ||
const { | ||
config | ||
} = target; | ||
if (p in Effects && !(p in config)) return [config.head[p], config.tail[p]] = Effects[p], receiver; | ||
if (p in ConsoleColors) return config.color = p, receiver; | ||
return receiver; | ||
} | ||
}); | ||
} | ||
[_Symbol$toPrimitive](h) { | ||
const { | ||
config | ||
} = this; | ||
switch (h) { | ||
case 'string': | ||
case 'default': | ||
return render(config.color, config); | ||
case 'number': | ||
return Array.isArray(config.color) ? rgbToLong(config.color) : Number.NaN; | ||
default: | ||
throw new Error('ink Symbol.toPrimitive error'); | ||
} | ||
} | ||
/** | ||
* | ||
* @param {number[]} arr | ||
* @returns {Hatsu|function} | ||
*/ | ||
static rgb(arr) { | ||
return new Hatsu(arr); | ||
} | ||
/** | ||
* | ||
* @param str | ||
* @returns {Hatsu|function} | ||
*/ | ||
static hex(str) { | ||
return Hatsu.rgb(Rgb.fromHex(str)); | ||
} | ||
/** | ||
* | ||
* @param arr | ||
* @returns {Hatsu|function} | ||
*/ | ||
static hsl(arr) { | ||
return Hatsu.rgb(Hsl.toRgb(arr)); | ||
} | ||
rgb(rgb, text) { | ||
const { | ||
config | ||
} = this; | ||
config.color = rgb; | ||
return text ? render(text, config) : this; | ||
} | ||
hex(hex, text) { | ||
const { | ||
config | ||
} = this; | ||
config.color = Rgb.fromHex(hex); | ||
return text ? render(text, config) : this; | ||
} | ||
removeEffect(effect) { | ||
const { | ||
config | ||
} = this; | ||
delete config.head[effect]; | ||
delete config.tail[effect]; | ||
return this; | ||
} | ||
clear() { | ||
const { | ||
config | ||
} = this; | ||
config.head = {}; | ||
config.tail = {}; | ||
return this; | ||
} | ||
} | ||
const red = { | ||
base: '#F44336', | ||
lighten_5: '#FFEBEE', | ||
lighten_4: '#FFCDD2', | ||
lighten_3: '#EF9A9A', | ||
lighten_2: '#E57373', | ||
lighten_1: '#EF5350', | ||
darken_1: '#E53935', | ||
darken_2: '#D32F2F', | ||
darken_3: '#C62828', | ||
darken_4: '#B71C1C', | ||
accent_1: '#FF8A80', | ||
accent_2: '#FF5252', | ||
accent_3: '#FF1744', | ||
accent_4: '#D50000' | ||
}; | ||
const pink = { | ||
base: '#E91E63', | ||
lighten_5: '#FCE4EC', | ||
lighten_4: '#F8BBD0', | ||
lighten_3: '#F48FB1', | ||
lighten_2: '#F06292', | ||
lighten_1: '#EC407A', | ||
darken_1: '#D81B60', | ||
darken_2: '#C2185B', | ||
darken_3: '#AD1457', | ||
darken_4: '#880E4F', | ||
accent_1: '#FF80AB', | ||
accent_2: '#FF4081', | ||
accent_3: '#F50057', | ||
accent_4: '#C51162' | ||
}; | ||
const purple = { | ||
base: '#9C27B0', | ||
lighten_5: '#F3E5F5', | ||
lighten_4: '#E1BEE7', | ||
lighten_3: '#CE93D8', | ||
lighten_2: '#BA68C8', | ||
lighten_1: '#AB47BC', | ||
darken_1: '#8E24AA', | ||
darken_2: '#7B1FA2', | ||
darken_3: '#6A1B9A', | ||
darken_4: '#4A148C', | ||
accent_1: '#EA80FC', | ||
accent_2: '#E040FB', | ||
accent_3: '#D500F9', | ||
accent_4: '#AA00FF' | ||
}; | ||
const deepPurple = { | ||
base: '#673AB7', | ||
lighten_5: '#EDE7F6', | ||
lighten_4: '#D1C4E9', | ||
lighten_3: '#B39DDB', | ||
lighten_2: '#9575CD', | ||
lighten_1: '#7E57C2', | ||
darken_1: '#5E35B1', | ||
darken_2: '#512DA8', | ||
darken_3: '#4527A0', | ||
darken_4: '#311B92', | ||
accent_1: '#B388FF', | ||
accent_2: '#7C4DFF', | ||
accent_3: '#651FFF', | ||
accent_4: '#6200EA' | ||
}; | ||
const indigo = { | ||
base: '#3F51B5', | ||
lighten_5: '#E8EAF6', | ||
lighten_4: '#C5CAE9', | ||
lighten_3: '#9FA8DA', | ||
lighten_2: '#7986CB', | ||
lighten_1: '#5C6BC0', | ||
darken_1: '#3949AB', | ||
darken_2: '#303F9F', | ||
darken_3: '#283593', | ||
darken_4: '#1A237E', | ||
accent_1: '#8C9EFF', | ||
accent_2: '#536DFE', | ||
accent_3: '#3D5AFE', | ||
accent_4: '#304FFE' | ||
}; | ||
const blue = { | ||
base: '#2196F3', | ||
lighten_5: '#E3F2FD', | ||
lighten_4: '#BBDEFB', | ||
lighten_3: '#90CAF9', | ||
lighten_2: '#64B5F6', | ||
lighten_1: '#42A5F5', | ||
darken_1: '#1E88E5', | ||
darken_2: '#1976D2', | ||
darken_3: '#1565C0', | ||
darken_4: '#0D47A1', | ||
accent_1: '#82B1FF', | ||
accent_2: '#448AFF', | ||
accent_3: '#2979FF', | ||
accent_4: '#2962FF' | ||
}; | ||
const lightBlue = { | ||
base: '#03A9F4', | ||
lighten_5: '#E1F5FE', | ||
lighten_4: '#B3E5FC', | ||
lighten_3: '#81D4FA', | ||
lighten_2: '#4FC3F7', | ||
lighten_1: '#29B6F6', | ||
darken_1: '#039BE5', | ||
darken_2: '#0288D1', | ||
darken_3: '#0277BD', | ||
darken_4: '#01579B', | ||
accent_1: '#80D8FF', | ||
accent_2: '#40C4FF', | ||
accent_3: '#00B0FF', | ||
accent_4: '#0091EA' | ||
}; | ||
const cyan = { | ||
base: '#00BCD4', | ||
lighten_5: '#E0F7FA', | ||
lighten_4: '#B2EBF2', | ||
lighten_3: '#80DEEA', | ||
lighten_2: '#4DD0E1', | ||
lighten_1: '#26C6DA', | ||
darken_1: '#00ACC1', | ||
darken_2: '#0097A7', | ||
darken_3: '#00838F', | ||
darken_4: '#006064', | ||
accent_1: '#84FFFF', | ||
accent_2: '#18FFFF', | ||
accent_3: '#00E5FF', | ||
accent_4: '#00B8D4' | ||
}; | ||
const teal = { | ||
base: '#009688', | ||
lighten_5: '#E0F2F1', | ||
lighten_4: '#B2DFDB', | ||
lighten_3: '#80CBC4', | ||
lighten_2: '#4DB6AC', | ||
lighten_1: '#26A69A', | ||
darken_1: '#00897B', | ||
darken_2: '#00796B', | ||
darken_3: '#00695C', | ||
darken_4: '#004D40', | ||
accent_1: '#A7FFEB', | ||
accent_2: '#64FFDA', | ||
accent_3: '#1DE9B6', | ||
accent_4: '#00BFA5' | ||
}; | ||
const green = { | ||
base: '#4CAF50', | ||
lighten_5: '#E8F5E9', | ||
lighten_4: '#C8E6C9', | ||
lighten_3: '#A5D6A7', | ||
lighten_2: '#81C784', | ||
lighten_1: '#66BB6A', | ||
darken_1: '#43A047', | ||
darken_2: '#388E3C', | ||
darken_3: '#2E7D32', | ||
darken_4: '#1B5E20', | ||
accent_1: '#B9F6CA', | ||
accent_2: '#69F0AE', | ||
accent_3: '#00E676', | ||
accent_4: '#00C853' | ||
}; | ||
const lightGreen = { | ||
base: '#8BC34A', | ||
lighten_5: '#F1F8E9', | ||
lighten_4: '#DCEDC8', | ||
lighten_3: '#C5E1A5', | ||
lighten_2: '#AED581', | ||
lighten_1: '#9CCC65', | ||
darken_1: '#7CB342', | ||
darken_2: '#689F38', | ||
darken_3: '#558B2F', | ||
darken_4: '#33691E', | ||
accent_1: '#CCFF90', | ||
accent_2: '#B2FF59', | ||
accent_3: '#76FF03', | ||
accent_4: '#64DD17' | ||
}; | ||
const lime = { | ||
base: '#CDDC39', | ||
lighten_5: '#F9FBE7', | ||
lighten_4: '#F0F4C3', | ||
lighten_3: '#E6EE9C', | ||
lighten_2: '#DCE775', | ||
lighten_1: '#D4E157', | ||
darken_1: '#C0CA33', | ||
darken_2: '#AFB42B', | ||
darken_3: '#9E9D24', | ||
darken_4: '#827717', | ||
accent_1: '#F4FF81', | ||
accent_2: '#EEFF41', | ||
accent_3: '#C6FF00', | ||
accent_4: '#AEEA00' | ||
}; | ||
const yellow = { | ||
base: '#FFEB3B', | ||
lighten_5: '#FFFDE7', | ||
lighten_4: '#FFF9C4', | ||
lighten_3: '#FFF59D', | ||
lighten_2: '#FFF176', | ||
lighten_1: '#FFEE58', | ||
darken_1: '#FDD835', | ||
darken_2: '#FBC02D', | ||
darken_3: '#F9A825', | ||
darken_4: '#F57F17', | ||
accent_1: '#FFFF8D', | ||
accent_2: '#FFFF00', | ||
accent_3: '#FFEA00', | ||
accent_4: '#FFD600' | ||
}; | ||
const amber = { | ||
base: '#FFC107', | ||
lighten_5: '#FFF8E1', | ||
lighten_4: '#FFECB3', | ||
lighten_3: '#FFE082', | ||
lighten_2: '#FFD54F', | ||
lighten_1: '#FFCA28', | ||
darken_1: '#FFB300', | ||
darken_2: '#FFA000', | ||
darken_3: '#FF8F00', | ||
darken_4: '#FF6F00', | ||
accent_1: '#FFE57F', | ||
accent_2: '#FFD740', | ||
accent_3: '#FFC400', | ||
accent_4: '#FFAB00' | ||
}; | ||
const orange = { | ||
base: '#FF9800', | ||
lighten_5: '#FFF3E0', | ||
lighten_4: '#FFE0B2', | ||
lighten_3: '#FFCC80', | ||
lighten_2: '#FFB74D', | ||
lighten_1: '#FFA726', | ||
darken_1: '#FB8C00', | ||
darken_2: '#F57C00', | ||
darken_3: '#EF6C00', | ||
darken_4: '#E65100', | ||
accent_1: '#FFD180', | ||
accent_2: '#FFAB40', | ||
accent_3: '#FF9100', | ||
accent_4: '#FF6D00' | ||
}; | ||
const deepOrange = { | ||
base: '#FF5722', | ||
lighten_5: '#FBE9E7', | ||
lighten_4: '#FFCCBC', | ||
lighten_3: '#FFAB91', | ||
lighten_2: '#FF8A65', | ||
lighten_1: '#FF7043', | ||
darken_1: '#F4511E', | ||
darken_2: '#E64A19', | ||
darken_3: '#D84315', | ||
darken_4: '#BF360C', | ||
accent_1: '#FF9E80', | ||
accent_2: '#FF6E40', | ||
accent_3: '#FF3D00', | ||
accent_4: '#DD2C00' | ||
}; | ||
const brown = { | ||
base: '#795548', | ||
lighten_5: '#EFEBE9', | ||
lighten_4: '#D7CCC8', | ||
lighten_3: '#BCAAA4', | ||
lighten_2: '#A1887F', | ||
lighten_1: '#8D6E63', | ||
darken_1: '#6D4C41', | ||
darken_2: '#5D4037', | ||
darken_3: '#4E342E', | ||
darken_4: '#3E2723', | ||
accent_1: '#D2BEB6', | ||
accent_2: '#B59387', | ||
accent_3: '#A27767', | ||
accent_4: '#855F51' | ||
}; | ||
const blueGrey = { | ||
base: '#607D8B', | ||
lighten_5: '#ECEFF1', | ||
lighten_4: '#CFD8DC', | ||
lighten_3: '#B0BEC5', | ||
lighten_2: '#90A4AE', | ||
lighten_1: '#78909C', | ||
darken_1: '#546E7A', | ||
darken_2: '#455A64', | ||
darken_3: '#37474F', | ||
darken_4: '#263238', | ||
accent_1: '#B7C9D1', | ||
accent_2: '#89A5B3', | ||
accent_3: '#6A8EA0', | ||
accent_4: '#547383' | ||
}; | ||
const grey = { | ||
base: '#9E9E9E', | ||
lighten_5: '#FAFAFA', | ||
lighten_4: '#F5F5F5', | ||
lighten_3: '#EEEEEE', | ||
lighten_2: '#E0E0E0', | ||
lighten_1: '#BDBDBD', | ||
darken_1: '#757575', | ||
darken_2: '#616161', | ||
darken_3: '#424242', | ||
darken_4: '#212121', | ||
accent_1: '#C4C4C4', | ||
accent_2: '#9E9E9E', | ||
accent_3: '#858585', | ||
accent_4: '#6B6B6B' | ||
}; | ||
/** | ||
* Transpose a 2d-array. | ||
* @param {*[][]} mx | ||
* @returns {*[][]} | ||
* | ||
* @param {Object} palett | ||
* @returns {Object|{colors:string[],degrees:string[]}} | ||
*/ | ||
const addProps = palett => { | ||
Reflect.defineProperty(palett, 'colors', { | ||
get() { | ||
return Object.keys(palett); | ||
}, | ||
const tr$1 = mx => coins$1(mx).map(n => mx.map(r => r[n])); | ||
enumerable: false | ||
}); | ||
Reflect.defineProperty(palett, 'degrees', { | ||
get() { | ||
for (let color in palett) return Object.keys(palett[color]); | ||
}, | ||
enumerable: false | ||
}); | ||
return palett; | ||
}; | ||
var _red$pink$purple$deep; | ||
/** | ||
* | ||
* @param {*[]} a | ||
* @param {*[]} b | ||
* @param {function(*,*,number?)} zipper | ||
* @return {*[]} | ||
* @type {Object.<string,Object<string,Object>>} | ||
* @property {string[]} colors | ||
* @property {string[]} degrees | ||
*/ | ||
function zip$1(a, b, zipper) { | ||
const { | ||
length | ||
} = a, | ||
arr = Array(length); | ||
const Palett = (_red$pink$purple$deep = { | ||
red, | ||
pink, | ||
purple, | ||
deepPurple, | ||
indigo, | ||
blue, | ||
lightBlue, | ||
cyan, | ||
teal, | ||
green, | ||
lightGreen, | ||
lime, | ||
yellow, | ||
amber, | ||
orange, | ||
deepOrange, | ||
brown, | ||
blueGrey, | ||
grey | ||
}, addProps(_red$pink$purple$deep)); | ||
const { | ||
hex | ||
} = Hatsu; | ||
const Thm = { | ||
brm: hex(Palett.blueGrey.base), | ||
br: hex(Palett.orange.lighten_3), | ||
pr: hex(Palett.indigo.lighten_1) | ||
}; | ||
for (let i = 0; i < length; i++) arr[i] = zipper(a[i], b[i], i); | ||
const bracketMain = tx => Thm.brm('[') + tx + Thm.brm(']'); | ||
return arr; | ||
const bracket = tx => Thm.br('[') + tx + Thm.br(']'); | ||
const parenthesis = tx => Thm.pr('(') + tx + Thm.pr(')'); | ||
const render$1 = (tx, { | ||
indent, | ||
stream | ||
}) => { | ||
if (tx === null || tx === void 0 ? void 0 : tx.length) stream.push(tx); | ||
return ' '.repeat(indent << 1) + stream.join(' '); | ||
}; | ||
const preset = (label, ...items) => { | ||
var _label; | ||
let stream = [], | ||
indent, | ||
len; | ||
if (label && (label = String(label)) && (len = label.length) && (indent = (_label = label, deNaTab$1(_label))) < len) { | ||
var _label$slice; | ||
stream.push((_label$slice = label.slice(indent), bracketMain(_label$slice))); | ||
} | ||
if (items.length) { | ||
var _items$map$join; | ||
stream.push((_items$map$join = items.map(totx$1).join(','), parenthesis(_items$map$join))); | ||
} | ||
return { | ||
indent, | ||
stream | ||
}; | ||
}; | ||
let _Symbol$toPrimitive$1; | ||
class Callable$1 extends Function { | ||
constructor(f) { | ||
super(); | ||
Reflect.setPrototypeOf(f, new.target.prototype); | ||
return f; | ||
} | ||
} | ||
const DASH$1 = '-'; | ||
const SPACE$1 = ' '; | ||
const FAChars$1 = { | ||
dash: DASH$1, | ||
space: SPACE$1 | ||
}; | ||
/** | ||
* | ||
* @param {Array<?string>} arr | ||
* @param ansi | ||
* @type {object<string,string>} | ||
*/ | ||
const maxLen$1 = (arr, ansi = false) => ansi ? Math.max(...arr.map(x => x ? lange(x) : 0)) : Math.max(...arr.map(x => { | ||
var _ref; | ||
return (_ref = x === null || x === void 0 ? void 0 : x.length) !== null && _ref !== void 0 ? _ref : 0; | ||
})); | ||
_Symbol$toPrimitive$1 = Symbol.toPrimitive; | ||
class Ink extends Callable$1 { | ||
/** @type {number} */ | ||
/** @type {string[]} */ | ||
constructor(label, ...items) { | ||
super(tx => render$1(tx, this)); | ||
_defineProperty(this, "indent", void 0); | ||
_defineProperty(this, "stream", void 0); | ||
this.cr(label, ...items); | ||
return new Proxy(this, { | ||
/** @returns {Ink|function(...string):Ink} */ | ||
get(target, p, receiver) { | ||
var _String; | ||
if (p in target) return target[p]; | ||
target.stream.push((_String = String(p), bracket(_String))); | ||
return (...items) => { | ||
var _items$map$join; | ||
target.stream.push((_items$map$join = items.map(totx$1).join(', '), parenthesis(_items$map$join))); | ||
return receiver; | ||
}; | ||
} | ||
}); | ||
} | ||
[_Symbol$toPrimitive$1](h) { | ||
switch (h) { | ||
case 'string': | ||
case 'default': | ||
return render$1(null, this); | ||
case 'number': | ||
return this.indent; | ||
default: | ||
throw new Error('ink Symbol.toPrimitive error'); | ||
} | ||
} | ||
cr(label, ...items) { | ||
const { | ||
indent, | ||
stream | ||
} = preset(label, ...items); | ||
this.indent = indent; | ||
this.stream = stream; | ||
return this; | ||
} | ||
asc() { | ||
this.indent++; | ||
return this; | ||
} | ||
desc() { | ||
this.indent--; | ||
return this; | ||
} | ||
tag(key, ...items) { | ||
var _ref, _key, _items$map$join2; | ||
this.stream.push((_ref = (_key = key, totx$1(_key)), tabify$1(_ref))); | ||
if (items.length) this.stream.push((_items$map$join2 = items.map(totx$1).join(','), parenthesis(_items$map$join2))); | ||
return this; | ||
} | ||
br(...items) { | ||
this.stream.push(items.map(parenthesis).join(',')); | ||
return this; | ||
} | ||
p(...items) { | ||
this.stream.push(...items); | ||
return this; | ||
} | ||
get tx() { | ||
return render$1(null, this); | ||
} | ||
get say() { | ||
return render$1(null, this); | ||
} | ||
toString() { | ||
return render$1(null, this); | ||
} | ||
} | ||
const ink = new Ink(); | ||
const FullAngleReg = /[\u4e00-\u9fa5]|[\uff00-\uffff]/; | ||
@@ -355,7 +1202,7 @@ /** | ||
}); | ||
const pads = tr$1([head].concat(text)).map(col => maxLen$1(col, ansi)), | ||
[h, hr, rows] = [zip$1(head, pads, (x, p) => lpad$1(x, p, ansi)), pads.map(l => '-'.repeat(l)), formatMatrix({ | ||
text: text, | ||
raw: raw, | ||
dye: dye, | ||
const pads = transpose([head].concat(text)).map(col => maxLen(col, ansi)), | ||
[h, hr, rows] = [zipper(head, pads, (x, p) => lpad(x, p, ansi)), pads.map(l => '-'.repeat(l)), formatMatrix({ | ||
text, | ||
raw, | ||
dye, | ||
pads, | ||
@@ -392,3 +1239,3 @@ ansi | ||
space | ||
} = FAChars$1; | ||
} = FAChars; | ||
/** | ||
@@ -399,10 +1246,10 @@ * | ||
const pads = tr$1([head].concat(text)).map(col => ({ | ||
pd: maxLen$1(col, ansi), | ||
const pads = transpose([head].concat(text)).map(col => ({ | ||
pd: maxLen(col, ansi), | ||
cn: col.some(hasChn) | ||
})), | ||
[h, hr, rows] = [zip$1(head, pads, (x, { | ||
[h, hr, rows] = [zipper(head, pads, (x, { | ||
cn, | ||
pd | ||
}) => cn ? rpad$1(toFullAngle(x), pd, ansi, space) : rpad$1(x, pd, ansi)), pads.map(p => (p.cn ? dash : '-').repeat(p.pd)), dye ? text.map((text, i) => zip$1(text, pads, (tx, { | ||
}) => cn ? rpad(toFullAngle(x), pd, ansi, space) : rpad(x, pd, ansi)), pads.map(p => (p.cn ? dash : '-').repeat(p.pd)), dye ? text.map((text, i) => zipper(text, pads, (tx, { | ||
cn, | ||
@@ -413,7 +1260,7 @@ pd | ||
return cn ? (_npad = npad$1(toFullAngle(tx), raw[i][j], pd, ansi, space), dye[i][j](_npad)) : (_npad2 = npad$1(tx, raw[i][j], pd, ansi), dye[i][j](_npad2)); | ||
})) : text.map((text, i) => zip$1(text, pads, (tx, { | ||
return cn ? (_npad = npad(toFullAngle(tx), raw[i][j], pd, ansi, space), dye[i][j](_npad)) : (_npad2 = npad(tx, raw[i][j], pd, ansi), dye[i][j](_npad2)); | ||
})) : text.map((text, i) => zipper(text, pads, (tx, { | ||
cn, | ||
pd | ||
}, j) => cn ? npad$1(toFullAngle(tx), raw[i][j], pd, ansi, space) : npad$1(tx, raw[i][j], pd, ansi)))]; | ||
}, j) => cn ? npad(toFullAngle(tx), raw[i][j], pd, ansi, space) : npad(tx, raw[i][j], pd, ansi)))]; | ||
return { | ||
@@ -426,2 +1273,2 @@ head: h, | ||
export { AEU, DASH, FAChars, RN, SPACE, TB, aeu, afterNaTab, bc, beforeNaTab, br, coins, deNaTab, endsBracs, formatMatrix, formatTable, formatVector, indexMaxLen, isNumeric, isTab, isVisual, lpad, maxLen, noop, npad, padVector, pr, readCrop, rn, rpad, tabify, tb, totx, tr, vecPad, vecPalPad, width, zip }; | ||
export { AEU, DASH, FAChars, RN, SPACE, TB, aeu, afterNaTab, bc, beforeNaTab, br, deNaTab, endsBracs, formatMatrix, formatTable, formatVector, indexMaxLen, intDigits, isNumeric, isTab, isVisual, lpad, maxLen, noop, npad, padVector, pr, readCrop, rn, rpad, tabify, tb, totx, vecPad, vecPalPad }; |
{ | ||
"name": "@spare/util", | ||
"version": "0.0.5", | ||
"version": "0.0.6", | ||
"description": "A util toolset for @spare.", | ||
@@ -18,3 +18,5 @@ "main": "dist/index.cjs.js", | ||
"dependencies": { | ||
"@spare/lange": "^0.0.5", | ||
"@spare/lange": "^0.0.6", | ||
"@vect/matrix": "^0.0.17", | ||
"@vect/vector": "^0.0.17", | ||
"typen": "^0.1.9" | ||
@@ -38,3 +40,3 @@ }, | ||
"homepage": "https://github.com/hoyeungw/spare#readme", | ||
"gitHead": "7895b3e77293b1eecd777df0d79d9fc4506b722d" | ||
"gitHead": "026b65cd7566cd2bda3e7eaa0bcb03c97671bebf" | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
55445
2227
4
+ Added@vect/matrix@^0.0.17
+ Added@vect/vector@^0.0.17
+ Added@aryth/comparer@0.0.8(transitive)
+ Added@spare/lange@0.0.6(transitive)
+ Added@vect/column-getter@0.0.17(transitive)
+ Added@vect/columns-mapper@0.0.17(transitive)
+ Added@vect/matrix@0.0.17(transitive)
+ Added@vect/matrix-indicator@0.0.17(transitive)
+ Added@vect/matrix-init@0.0.17(transitive)
+ Added@vect/matrix-mapper@0.0.17(transitive)
+ Added@vect/matrix-margin@0.0.17(transitive)
+ Added@vect/matrix-quantifier@0.0.17(transitive)
+ Added@vect/matrix-size@0.0.17(transitive)
+ Added@vect/matrix-transpose@0.0.17(transitive)
+ Added@vect/matrix-zipper@0.0.17(transitive)
+ Added@vect/vector@0.0.17(transitive)
+ Added@vect/vector-indicator@0.0.17(transitive)
+ Added@vect/vector-mapper@0.0.17(transitive)
+ Added@vect/vector-margin@0.0.17(transitive)
+ Added@vect/vector-zipper@0.0.17(transitive)
- Removed@spare/lange@0.0.5(transitive)
Updated@spare/lange@^0.0.6