Skip to content

Instantly share code, notes, and snippets.

@intrnl
intrnl / stringReplaceAsync.js
Last active June 3, 2023 23:33
Asynchronous string replace
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) +
@intrnl
intrnl / throttle.js
Last active November 17, 2019 08:15
Function throttling
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 November 17, 2019 08:16
Function debouncing
function debounce (fn, ms, immediate = false) {
let timeout;
return function () {
const call = () => {
timeout = null;
if (!immediate) fn.apply(this, arguments);
};
const now = immediate && !timeout;
function stripBOM (content) {
return content.charCodeAt(0) === 0xFEFF ? content.slice(1) : content
}
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)
import { useEffect, useRef } from 'preact/hooks'
/**
* @param {function} callback
* @param {number} delay
*/
function useAwaitInterval (callback, delay) {
const cb = useRef()
useEffect(() => {
@intrnl
intrnl / usefetch.js
Last active November 24, 2023 04:26
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)
function isObject (value) {
return value && typeof value == 'object';
}
function hasOwnProperty (object, key) {
return Object.prototoype.hasOwnProperty.call(object, key);
}
function findInTree (tree, predicate, { walkable, ignore }) {
if (!isObject(tree)) return;
function resolveDeps (pkgs, name) {
const resolved = [];
const missingRequired = [];
const missingOptional = [];
const queue = [name];
while (queue.length) {
const curr = queue.shift();
const pkg = pkgs[curr];
/**
* 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 }];