-
Notifications
You must be signed in to change notification settings - Fork 36
/
index.ts
60 lines (47 loc) 路 1.34 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { Accessor, createSignal } from "solid-js";
interface CreateQueueProps<T> {
initialValues?: T[];
limit: number;
}
interface CreateQueueState<T> {
current: Accessor<T[]>;
queue: Accessor<T[]>;
limit: Accessor<number>;
}
interface CreateQueueReturn<T> {
state: CreateQueueState<T>;
add: (...items: T[]) => void;
update: (fn: (state: T[]) => T[]) => void;
clearQueue: () => void;
}
export function createQueue<T>(props: CreateQueueProps<T>): CreateQueueReturn<T> {
const [currentState, setCurrentState] = createSignal(
props.initialValues?.slice(0, props.limit) ?? []
);
const [queue, setQueue] = createSignal(props.initialValues?.slice(props.limit) ?? []);
const limit = () => props.limit;
const add = (...items: T[]) => {
const results = [...currentState(), ...queue(), ...items];
setCurrentState(results.slice(0, limit()) as T[]);
setQueue(results.slice(limit()) as T[]);
};
const update = (fn: (state: T[]) => T[]) => {
const results = fn([...currentState(), ...queue()] as Array<T>);
setCurrentState(results.slice(0, limit()) as T[]);
setQueue(results.slice(limit()) as T[]);
};
const clearQueue = () => {
setQueue([]);
};
const state: CreateQueueState<T> = {
current: currentState,
queue,
limit,
};
return {
state,
add,
update,
clearQueue,
};
}