chore: move utils to package
This commit is contained in:
29
packages/utils/actions.ts
Normal file
29
packages/utils/actions.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Debounce a function with a given amount of time
|
||||
* @description For scrolling or other resource demanding behaviors
|
||||
*/
|
||||
export const debounce = (callback: (...args: any[]) => any, wait: number, immediate = false) => {
|
||||
let timeout: ReturnType<typeof setTimeout> | number = 0
|
||||
return (...args: any[]) => {
|
||||
const callNow: boolean = immediate && !timeout
|
||||
const next = () => callback(...args)
|
||||
clearTimeout(timeout)
|
||||
timeout = setTimeout(next, wait)
|
||||
if (callNow) next()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Throttle a function by a given amount of time
|
||||
* @description Throttling enforces a maximum number of times a function can be called over time, as in 'execute this function at most once every 100 milliseconds
|
||||
*/
|
||||
export const throttle = (fn: (...args: any[]) => any, delay: number) => {
|
||||
let lastCall = 0
|
||||
return (...args: unknown[]) => {
|
||||
const now = performance.now()
|
||||
if (now - lastCall < delay) return
|
||||
lastCall = now
|
||||
requestAnimationFrame(() => fn(...args))
|
||||
}
|
||||
}
|
||||
19
packages/utils/array.ts
Normal file
19
packages/utils/array.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Return random elements from an array
|
||||
*/
|
||||
export const getRandomItems = <T> (array: T[], amount: number): T[] => {
|
||||
const shuffled = array.slice()
|
||||
for (let i = shuffled.length - 1; i > 0; i--) {
|
||||
const j = Math.floor(Math.random() * (i + 1));
|
||||
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]
|
||||
}
|
||||
return shuffled.slice(0, amount)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return a random element from an array
|
||||
*/
|
||||
export const getRandomItem = <T extends Array<unknown>> (array: T): T[0] => {
|
||||
return getRandomItems(array, 1)[0]
|
||||
}
|
||||
17
packages/utils/index.ts
Normal file
17
packages/utils/index.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Create a delay
|
||||
*/
|
||||
export const sleep = (milliseconds: number) => {
|
||||
return new Promise(resolve => setTimeout(resolve, milliseconds))
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if an object is empty
|
||||
*/
|
||||
export const isEmpty = (obj: Object) => {
|
||||
if (obj === null || obj === undefined) {
|
||||
throw new Error('Error: Given object is not an object')
|
||||
}
|
||||
return Object.keys(obj).length === 0 && obj.constructor === Object
|
||||
}
|
||||
35
packages/utils/math.ts
Normal file
35
packages/utils/math.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Linear Interpolation
|
||||
*/
|
||||
export const lerp = (start: number, end: number, amount: number): number => {
|
||||
return (1 - amount) * start + amount * end
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clamp a number
|
||||
*/
|
||||
export const clamp = (num: number, a: number, b: number) => {
|
||||
return Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b))
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Re-maps a number from one range to another
|
||||
* @param value the incoming value to be converted
|
||||
* @param start1 lower bound of the value's current range
|
||||
* @param stop1 upper bound of the value's current range
|
||||
* @param start2 lower bound of the value's target range
|
||||
* @param stop2 upper bound of the value's target range
|
||||
* @param [withinBounds] constrain the value to the newly mapped range
|
||||
* @return remapped number
|
||||
*/
|
||||
export const map = (n: number, start1: number, stop1: number, start2: number, stop2: number, withinBounds: boolean): number => {
|
||||
const value = (n - start1) / (stop1 - start1) * (stop2 - start2) + start2
|
||||
if (!withinBounds) return value
|
||||
if (start2 < stop2) {
|
||||
return clamp(value, start2, stop2)
|
||||
} else {
|
||||
return clamp(value, stop2, start2)
|
||||
}
|
||||
}
|
||||
6
packages/utils/package.json
Normal file
6
packages/utils/package.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "utils",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"module": "index.ts"
|
||||
}
|
||||
12
packages/utils/scroll.ts
Normal file
12
packages/utils/scroll.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Scroll back to top after page transition
|
||||
*/
|
||||
export const scrollToTop = (delay?: number) => {
|
||||
const scroll = () => window.scrollTo(0,0)
|
||||
|
||||
if (delay && delay > 0) {
|
||||
return setTimeout(scroll, delay)
|
||||
} else {
|
||||
return scroll()
|
||||
}
|
||||
}
|
||||
6
packages/utils/string.ts
Normal file
6
packages/utils/string.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* Capitalize first letter
|
||||
*/
|
||||
export const capitalizeFirstLetter = (string: string) => {
|
||||
return string[0].toUpperCase() + string.slice(1)
|
||||
}
|
||||
24
packages/utils/text.ts
Normal file
24
packages/utils/text.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Split text
|
||||
* @description Split a string into words or characters
|
||||
* @returns string[]
|
||||
*/
|
||||
export const splitText = (text: string, mode = 'words'): string[] => {
|
||||
// Split by words
|
||||
if (mode === 'words') {
|
||||
const words = text
|
||||
.replace(/\\n/g, '\n')
|
||||
.replace(/\s+/g, m => m.includes('\n') ? '\n ' : ' ')
|
||||
.trim()
|
||||
.split(' ')
|
||||
|
||||
return words
|
||||
}
|
||||
// Split by chars
|
||||
else if (mode === 'chars') {
|
||||
const chars = Array.from(text).map(char => char === ' ' ? '\xa0' : char)
|
||||
return chars
|
||||
}
|
||||
|
||||
return []
|
||||
}
|
||||
Reference in New Issue
Block a user