mirror of
https://github.com/be5invis/Iosevka.git
synced 2026-10-28 00:18:43 +00:00
26 lines
650 B
TypeScript
26 lines
650 B
TypeScript
import { type Dispatch, type SetStateAction, useState } from "react";
|
|
|
|
export type Ptr<T> = { val: T; set: Dispatch<SetStateAction<T>> };
|
|
export const Ptr = {
|
|
Default<T>(x: T): Ptr<T> {
|
|
return { val: x, set: () => {} };
|
|
},
|
|
|
|
Lens<T, K extends keyof T>(ptr: Ptr<T>, key: K): Ptr<T[K]> {
|
|
return {
|
|
val: ptr.val[key],
|
|
set: val => {
|
|
if (val instanceof Function) {
|
|
ptr.set((a: T) => ({ ...a, [key]: val(a[key]) }));
|
|
} else {
|
|
ptr.set((a: T) => ({ ...a, [key]: val }));
|
|
}
|
|
},
|
|
};
|
|
},
|
|
};
|
|
export function useStatePtr<T>(defaultValue: T): Ptr<T> {
|
|
const [get, set] = useState<T>(defaultValue);
|
|
return { val: get, set };
|
|
}
|