Skip to content

Instantly share code, notes, and snippets.

View stripBOM.js
function stripBOM (content) {
return content.charCodeAt(0) === 0xFEFF ? content.slice(1) : content
}
@intrnl
intrnl / stringReplaceAsync.js
Last active Jun 28, 2019
Asynchronous string replace
View stringReplaceAsync.js
function stringReplaceAsync (string, regex, replacer) {
if (!regex.global) {
const match = regex.exec(string)
if (!match) return string
const retVal = replacer(...match, match.index, string)
if (retVal instanceof Promise) {
return retVal.then((ret) => (
string.slice(0, match.index) +
View classnames.js
function classnames (...classes) {
const arr = []
for (const name of classes) {
if (typeof name === 'string') {
arr.push(name)
}
else if (typeof name === 'object' && name !== null) {
for (let [key, value] of Object.entries(name)) {
if (value) arr.push(key)
View useawaitinterval.js
import { useEffect, useRef } from 'preact/hooks'
/**
* @param {function} callback
* @param {number} delay
*/
function useAwaitInterval (callback, delay) {
const cb = useRef()
useEffect(() => {
View usefetch.js
import { useState, useEffect } from 'preact/hooks'
/**
* @param {RequestInfo} url
* @param {RequestInit} opts
* @returns {useFetchObject}
*/
function useFetch (url, opts) {
const [response, setResponse] = useState(undefined)
const [error, setError] = useState(undefined)
View deepClone.js
/**
* Deep clones an object or array
* @param {object|array} obj Object or array to clone
* @returns {object|array} Cloned object or array
*/
function deepClone (obj) {
if (typeof obj !== 'object' || obj === null) return {};
const res = Array.isArray(obj) ? [] : {};
const queue = [{ base: res, current: obj }];
View resolveDeps.js
function resolveDeps (pkgs, name) {
const resolved = [];
const missingRequired = [];
const missingOptional = [];
const queue = [name];
while (queue.length) {
const curr = queue.shift();
const pkg = pkgs[curr];
@intrnl
intrnl / throttle.js
Last active Nov 17, 2019
Function throttling
View throttle.js
function throttle (fn, ms) {
let throttled = false;
return function () {
const call = () => fn.apply(this, arguments);
if (throttled) return;
throttled = true;
setTimeout(() => throttled = false);
@intrnl
intrnl / debounce.js
Last active Nov 17, 2019
Function debouncing
View debounce.js
function debounce (fn, ms, immediate = false) {
let timeout;
return function () {
const call = () => {
timeout = null;
if (!immediate) fn.apply(this, arguments);
};
const now = immediate && !timeout;
@intrnl
intrnl / lock.js
Last active Dec 15, 2019
Functional locking mechanism
View lock.js
class LockError extends Error {}
function createLock () {
/** @type {boolean} */
let locked = false;
/** @type {PromiseObject[]} */
let pending = [];
function acquire () {