Skip to content

Instantly share code, notes, and snippets.

@liuwenzhuang
liuwenzhuang / calc-scrollbar-size.ts
Created November 9, 2021 10:40
calc scrollbar size
const placeHolderElemAttr = {
position: 'absolute',
top: '-99999px',
left: '-99999px',
width: '100px',
height: '100px',
overflow: 'scroll'
};
interface CalcScrollbarSize {
@liuwenzhuang
liuwenzhuang / destructUserToken.js
Created October 13, 2021 11:18
babel plugin to destructUserToken
module.exports = function ({ types: t }) {
let hasUserTokenImport = false;
let defaultImportIdentifier = '';
return {
visitor: {
Program: {
enter(path) {
const children = path.node.body;
const userTokenImportIndex = children.findIndex(item => {
if (item.type !== 'ImportDeclaration') {
class GraphNode {
public neighbors: Set<GraphNode>
public color: string
constructor(public label) {
this.label = label;
this.neighbors = new Set();
this.color = null;
}
}
@liuwenzhuang
liuwenzhuang / merge_sorted_arrays.js
Created February 24, 2021 12:15
merge sorted arrays
function mergeArrays(leftArray, rightArray) {
const result = [];
let leftIndex = 0;
let rightIndex = 0;
const leftLen = leftArray.length;
const rightLen = rightArray.length;
while(result.length < leftLen + rightLen) {
if (leftIndex < leftLen && (rightIndex === rightLen || leftArray[leftIndex] < rightArray[rightIndex])) {
@liuwenzhuang
liuwenzhuang / hash-table.ts
Created February 22, 2021 04:42
use array to realize hash table
class DumpMap {
hashTable: Array<Array<[string, any]>>
constructor() {
this.hashTable = []
}
get(x: string) {
const index = hash(x)
const backets = this.hashTable[index]
if (!backets) {
@liuwenzhuang
liuwenzhuang / rxjs-keyboard-event.ts
Created December 18, 2020 03:40
rxjs-keyboard-event
import { fromEvent, of, EMPTY } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { isEmpty } from 'lodash';
function bindKeyboardShortcuts(eventName: string, keybinding: string) {
const keys = keybinding.split('.').map(key => key.toLowerCase());
const allModifierKeys = ['ctrl', 'shift', 'alt', 'cmd', 'meta']; // meta === cmd
const modifierKeys = keys.filter(key => allModifierKeys.indexOf(key) !== -1);
return fromEvent(document, eventName).pipe(
switchMap((e: KeyboardEvent) => {
@liuwenzhuang
liuwenzhuang / rxjs-loading-indicator.ts
Created December 8, 2020 03:36
rxjs loading indicator with delay opening and close immediately, open observable will be cancel if request time less than 300ms
import { iif, of, Subject } from 'rxjs';
import { switchMap, delay, finalize } from 'rxjs/operators';
import { ajax } from 'rxjs/ajax';
const loadingSubject = new Subject<boolean>();
const loading$ = loadingSubject.pipe(
switchMap(flag => {
return iif(
() => flag,
@liuwenzhuang
liuwenzhuang / task.js
Created October 23, 2020 08:53
javascript microtasks and tasks
/**
* console order is:
* main call stack start
* main callback stack end
* Promise
* mutate
* setTimeout
*
* @see https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/
* callback of Promise, MutationObserver(as microtasks) has higher privilege then setTimeout callback
@liuwenzhuang
liuwenzhuang / main.js
Last active October 23, 2020 08:54
worker and main thread communicate by postMessage and addEventListener
const worker = new Worker('worker.js')
// handle data from worker
worker.addEventListener('message', (e) => {
console.log('worker send data back:', e.data)
}, false);
// handle error
worker.addEventListener('error', (err) => {
console.log(`Error: Line ${err.lineno} in ${err.filename} : ${e.message}`);
@liuwenzhuang
liuwenzhuang / graph.ts
Created August 3, 2020 03:44
typescript realize graph by adjacency list
class Graph {
public adjList = new Map<any, any[]>();
public numberOfVertexs: number = 0;
public addVertex(vertex) {
this.adjList.set(vertex, []);
this.numberOfVertexs ++;
}
public addEdge(vertex1, vertex2) {