Skip to content

Instantly share code, notes, and snippets.

View ycmjason's full-sized avatar
😆

YCM Jason ycmjason

😆
View GitHub Profile
@ycmjason
ycmjason / conver-svg.js
Last active March 26, 2025 10:50
A more modern way to convert svg to png/jpeg and obtain the data uri.
// https://github.com/ycmjason/svg-to-img
const getImageDataURL = (image, type = 'png') => {
// pre: image is loaded
if (type === 'jpg') type = 'jpeg';
const { width, height } = image;
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
@ycmjason
ycmjason / db.js
Created June 27, 2018 21:50
A neat way to interact with mongoclient, without caring too many proxies.
const MongoClient = require('mongodb').MongoClient;
const DB_NAME = 'mydb';
const MONGO_URL = process.env.MONGO_URL;
const dbPromise = MongoClient.connect(
MONGO_URL,
{ useNewUrlParser: true },
).then(client => client.db(DB_NAME));
@ycmjason
ycmjason / db.js
Created June 27, 2018 21:50
A neat way to interact with mongoclient, without caring too many proxies.
const MongoClient = require('mongodb').MongoClient;
const DB_NAME = 'mydb';
const MONGO_URL = process.env.MONGO_URL;
const dbPromise = MongoClient.connect(
MONGO_URL,
{ useNewUrlParser: true },
).then(client => client.db(DB_NAME));
const crushOnce = (xs) => {
if (xs.length < 3) return xs;
let count = 0;
for (const x of xs) {
if (x !== xs[0]) break;
count++;
}
if (count >= 3) {
@ycmjason
ycmjason / asyncStringReplace.js
Created April 24, 2018 21:47
Async version of `string.prototype.replace`
const asyncStringReplace = async (str, regex, aReplacer) => {
regex = new RegExp(regex, regex.flags + regex.flags.includes('g')? '': 'g');
const replacedParts = [];
let match;
let i = 0;
while ((match = regex.exec(str)) !== null) {
// put non matching string
replacedParts.push(str.slice(i, match.index));
// call the async replacer function with the matched array spreaded
replacedParts.push(aReplacer(...match));
@ycmjason
ycmjason / transitions.scss
Created February 3, 2018 11:57 — forked from tobiasahlin/transitions.scss
Sass multiple transitions mixin
// Usage: @include transition(width, height 0.3s ease-in-out);
// Output: -webkit-transition(width 0.2s, height 0.3s ease-in-out);
// transition(width 0.2s, height 0.3s ease-in-out);
//
// Pass in any number of transitions
@mixin transition($transitions...) {
$unfoldedTransitions: ();
@each $transition in $transitions {
$unfoldedTransitions: append($unfoldedTransitions, unfoldTransition($transition), comma);
}
@ycmjason
ycmjason / objectAssignDeep.js
Created January 28, 2018 22:23
Deep version of Object.assign.
const objectAssignDeep = (...objs) => objs.reduce((acc, obj) => Object.assign(acc, ...Object.keys(obj).map(key => {
if (acc[key] instanceof Object && obj[key] instanceof Object) {
return { [key]: objectAssignDeep({}, acc[key], obj[key]) };
}
return { [key]: obj[key] };
})));
// Simple memoization, done
const memoize = (fn) => {
const memo = {};
return function(...args){
const hash = JSON.stringify(args);
if(hash in memo) return memo[hash];
return fn(...args);
};
};
@ycmjason
ycmjason / limitAsyncCalls.js
Last active December 15, 2017 20:59
Transform a function into the same function but with limited async calls at the same time.
const limitAsyncCalls = (fn, n) => {
const cap = n;
let executing_count = 0;
let waitings = [];
const wait = () => new Promise(res => waitings.push(res));
const execute = async (fn, args) => {
executing_count++;
const result = await fn(...args);
executing_count--;
@ycmjason
ycmjason / queue_promises
Last active December 12, 2017 13:45
Queuing the promise!
const queue = (() => {
const promises = {};
return async (name, f) => {
while(promises[name]) await promises[name];
promises[name] = f();
const res = await promises[name];
promises[name] = undefined;
return res;
};
})();