Skip to content
This repository was archived by the owner on Apr 2, 2023. It is now read-only.

Commit 6aae558

Browse files
committed
feat: add memoize function
1 parent af94d8f commit 6aae558

27 files changed

+565
-111
lines changed
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/core/index.ts

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
export const index = (i: number) => <T>(items: T[]): T | undefined => items[i]
3+
4+
export const nth = (n: number) => index(n - 1)
5+
6+
export const first = index(0)
7+
8+
export const last = <T>(items: T[]): T => items[items.length - 1]
9+
10+
export const rest = <T>([, ...remaining]: T[]) => remaining
11+
12+
export const constant = <T>(value: T) => () => value
13+
14+
export const identity = <T>(value: T) => value
15+
16+
export const not = <Args extends any[], T>(fn: (...args: Args) => T) => (
17+
...args: Args
18+
) => !fn(...args)
19+
20+
export const equals = <T>(value: T) => (data: T): boolean => value === data
21+
22+
export const greaterThan = (value: number) => (data: number): boolean =>
23+
data > value
24+
25+
export const greaterThanEquals = (value: number) => (data: number): boolean =>
26+
data >= value
27+
28+
export const lessThan = (value: number) => (data: number): boolean =>
29+
data < value
30+
31+
export const lessThanEquals = (value: number) => (data: number): boolean =>
32+
data <= value
33+
34+
export const or = <Args extends any[]>(
35+
...options: Array<(...args: Args) => unknown>
36+
) => (...args: Args): boolean => options.some(fn => fn(...args))
37+
38+
export const and = <Args extends any[]>(
39+
...options: Array<(...args: Args) => unknown>
40+
) => (...args: Args): boolean => options.every(fn => fn(...args))
41+
42+
export const isBetween = (a: number, b: number, inclusive = false) =>
43+
inclusive
44+
? and(greaterThanEquals(a), lessThanEquals(b))
45+
: and(greaterThan(a), lessThan(b))
46+
47+
export const pluck = <U, T extends keyof U>(key: T) => (data: U): U[T] =>
48+
data[key]
49+
50+
export const omit = <U, T extends keyof U>(key: T) => (data: U): Omit<U, T> => {
51+
const cloned = { ...data }
52+
delete cloned[key]
53+
return cloned
54+
}
55+
56+
export function pipe<A, B, C, D, E>(
57+
a: (data: A) => B,
58+
b: (data: B) => C,
59+
c: (data: C) => D,
60+
d: (data: D) => E,
61+
): (data: A) => E
62+
export function pipe<A, B, C, D>(
63+
a: (data: A) => B,
64+
b: (data: B) => C,
65+
c: (data: C) => D,
66+
): (data: A) => D
67+
export function pipe<A, B, C>(
68+
a: (data: A) => B,
69+
b: (data: B) => C,
70+
): (data: A) => C
71+
export function pipe(...fns: ((data: any) => any)[]) {
72+
return (data: any) => fns.reduce((sum, fn) => fn(sum), data)
73+
}
74+
75+
export function apply<T, A>(fn: (a: A) => T): (data: [A]) => T
76+
export function apply<T, A, B>(fn: (a: A, b: B) => T): (data: [A, B]) => T
77+
export function apply<T, A, B, C>(
78+
fn: (a: A, b: B, c: C) => T,
79+
): (data: [A, B, C]) => T
80+
export function apply<T>(fn: (...args: any[]) => T): (args: any) => T {
81+
return (args: any) => fn(...args)
82+
}
83+
84+
export const map = <T, U>(fn: (a: T) => U) => (data: T[]): U[] => data.map(fn)
85+
export const chain = <T, U>(fn: (a: T) => U) => (data: T): U => fn(data)
86+
87+
type Predicate<T> = (data: T) => unknown
88+
type Transform<T, U> = (data: T) => U
89+
type Condition<T, U> = [Predicate<T>, Transform<T, U>]
90+
91+
export function cond<T, U>(
92+
conditions: Condition<T, U>[],
93+
): (data: T) => U | undefined
94+
export function cond<T, U>(
95+
conditions: Condition<T, U>[],
96+
orElse: Transform<T, U>,
97+
): (data: T) => U
98+
export function cond<T, U>(
99+
conditions: Condition<T, U>[],
100+
orElse?: Transform<T, U>,
101+
): (data: T) => U | undefined {
102+
return (data: T) => {
103+
const found = conditions.find(([predicate]) => predicate(data))
104+
105+
if (found) {
106+
return found[1](data)
107+
}
108+
109+
return orElse ? orElse(data) : undefined
110+
}
111+
}
112+
113+
export function isPlainObject(obj: unknown) {
114+
// Basic check for Type object that's not null
115+
if (typeof obj == "object" && obj !== null) {
116+
// If Object.getPrototypeOf supported, use it
117+
if (typeof Object.getPrototypeOf == "function") {
118+
const proto = Object.getPrototypeOf(obj)
119+
return proto === Object.prototype || proto === null
120+
}
121+
122+
// Otherwise, use internal class
123+
// This should be reliable as if getPrototypeOf not supported, is pre-ES5
124+
return Object.prototype.toString.call(obj) == "[object Object]"
125+
}
126+
127+
// Not an object
128+
return false
129+
}
130+
131+
export const isUndefined = (data: unknown) => data === undefined

src/index.ts

+2-111
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,2 @@
1-
/* eslint-disable @typescript-eslint/no-explicit-any */
2-
export const index = (i: number) => <T>(items: T[]): T | undefined => items[i]
3-
4-
export const nth = (n: number) => index(n - 1)
5-
6-
export const first = index(0)
7-
8-
export const last = <T>(items: T[]): T => items[items.length - 1]
9-
10-
export const rest = <T>([, ...remaining]: T[]) => remaining
11-
12-
export const constant = <T>(value: T) => () => value
13-
14-
export const identity = <T>(value: T) => value
15-
16-
export const not = <Args extends any[], T>(fn: (...args: Args) => T) => (
17-
...args: Args
18-
) => !fn(...args)
19-
20-
export const equals = <T>(value: T) => (data: T): boolean => value === data
21-
22-
export const greaterThan = (value: number) => (data: number): boolean =>
23-
data > value
24-
25-
export const greaterThanEquals = (value: number) => (data: number): boolean =>
26-
data >= value
27-
28-
export const lessThan = (value: number) => (data: number): boolean =>
29-
data < value
30-
31-
export const lessThanEquals = (value: number) => (data: number): boolean =>
32-
data <= value
33-
34-
export const or = <Args extends any[]>(
35-
...options: Array<(...args: Args) => unknown>
36-
) => (...args: Args): boolean => options.some(fn => fn(...args))
37-
38-
export const and = <Args extends any[]>(
39-
...options: Array<(...args: Args) => unknown>
40-
) => (...args: Args): boolean => options.every(fn => fn(...args))
41-
42-
export const isBetween = (a: number, b: number, inclusive = false) =>
43-
inclusive
44-
? and(greaterThanEquals(a), lessThanEquals(b))
45-
: and(greaterThan(a), lessThan(b))
46-
47-
export const pluck = <U, T extends keyof U>(key: T) => (data: U): U[T] =>
48-
data[key]
49-
50-
export const omit = <U, T extends keyof U>(key: T) => (data: U): Omit<U, T> => {
51-
const cloned = { ...data }
52-
delete cloned[key]
53-
return cloned
54-
}
55-
56-
export function pipe<A, B, C, D, E>(
57-
a: (data: A) => B,
58-
b: (data: B) => C,
59-
c: (data: C) => D,
60-
d: (data: D) => E,
61-
): (data: A) => E
62-
export function pipe<A, B, C, D>(
63-
a: (data: A) => B,
64-
b: (data: B) => C,
65-
c: (data: C) => D,
66-
): (data: A) => D
67-
export function pipe<A, B, C>(
68-
a: (data: A) => B,
69-
b: (data: B) => C,
70-
): (data: A) => C
71-
export function pipe(...fns: ((data: any) => any)[]) {
72-
return (data: any) => fns.reduce((sum, fn) => fn(sum), data)
73-
}
74-
75-
export function apply<T, A>(fn: (a: A) => T): (data: [A]) => T
76-
export function apply<T, A, B>(fn: (a: A, b: B) => T): (data: [A, B]) => T
77-
export function apply<T, A, B, C>(
78-
fn: (a: A, b: B, c: C) => T,
79-
): (data: [A, B, C]) => T
80-
export function apply<T>(fn: (...args: any[]) => T): (args: any) => T {
81-
return (args: any) => fn(...args)
82-
}
83-
84-
export const map = <T, U>(fn: (a: T) => U) => (data: T[]): U[] => data.map(fn)
85-
export const chain = <T, U>(fn: (a: T) => U) => (data: T): U => fn(data)
86-
87-
type Predicate<T> = (data: T) => unknown
88-
type Transform<T, U> = (data: T) => U
89-
type Condition<T, U> = [Predicate<T>, Transform<T, U>]
90-
91-
export function cond<T, U>(
92-
conditions: Condition<T, U>[],
93-
): (data: T) => U | undefined
94-
export function cond<T, U>(
95-
conditions: Condition<T, U>[],
96-
orElse: Transform<T, U>,
97-
): (data: T) => U
98-
export function cond<T, U>(
99-
conditions: Condition<T, U>[],
100-
orElse?: Transform<T, U>,
101-
): (data: T) => U | undefined {
102-
return (data: T) => {
103-
const found = conditions.find(([predicate]) => predicate(data))
104-
105-
if (found) {
106-
return found[1](data)
107-
}
108-
109-
return orElse ? orElse(data) : undefined
110-
}
111-
}
1+
export * from "./core/index"
2+
export * from "./memo/index"

0 commit comments

Comments
 (0)