mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-22 18:40:37 +03:00
improve cache code
This commit is contained in:
+8
-8
@@ -10,13 +10,15 @@ type Cache<T> = {
|
|||||||
[P in keyof T]: CacheEntry<T[P]>;
|
[P in keyof T]: CacheEntry<T[P]>;
|
||||||
};
|
};
|
||||||
|
|
||||||
type UpdateCacheProp<T> = <P extends keyof T>(prop: P, value: T[P], compare: (a?: T[P], b?: T[P]) => boolean) => void;
|
type UpdateCacheProp<T> = <P extends keyof T>(prop: P, value: T[P], compare: CacheEqualFunction<T, P> | null) => void;
|
||||||
|
|
||||||
|
type PropsToUpdate<T> = Array<keyof T> | keyof T;
|
||||||
|
|
||||||
export type CacheUpdateFunction<T, P extends keyof T> = (current?: T[P], previous?: T[P]) => T[P];
|
export type CacheUpdateFunction<T, P extends keyof T> = (current?: T[P], previous?: T[P]) => T[P];
|
||||||
|
|
||||||
export type CacheEqualFunction<T, P extends keyof T> = (a?: T[P], b?: T[P]) => boolean;
|
export type CacheEqualFunction<T, P extends keyof T> = (a?: T[P], b?: T[P]) => boolean;
|
||||||
|
|
||||||
export type CacheUpdate<T> = {
|
export type CacheChanged<T> = {
|
||||||
[P in keyof T]: boolean;
|
[P in keyof T]: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,9 +44,7 @@ export type CacheUpdateInfo<T> = {
|
|||||||
* @returns A function which can be called with wither one ar an array of properties which shall be updated. Optionally it can be called with the force param.
|
* @returns A function which can be called with wither one ar an array of properties which shall be updated. Optionally it can be called with the force param.
|
||||||
* This function returns a object which contains all cache properties as booleans which indicate whether the corresponding cache values really changed or not.
|
* This function returns a object which contains all cache properties as booleans which indicate whether the corresponding cache values really changed or not.
|
||||||
*/
|
*/
|
||||||
export const createCache = <T>(
|
export const createCache = <T>(cacheUpdateInfo: CacheUpdateInfo<T>): ((propsToUpdate?: PropsToUpdate<T>, force?: boolean) => CacheChanged<T>) => {
|
||||||
cacheUpdateInfo: CacheUpdateInfo<T>
|
|
||||||
): ((propsToUpdate?: Array<keyof T> | keyof T, force?: boolean) => CacheUpdate<T>) => {
|
|
||||||
const cache: Cache<T> = {} as T;
|
const cache: Cache<T> = {} as T;
|
||||||
const allProps: Array<keyof T> = keys(cacheUpdateInfo) as Array<keyof T>;
|
const allProps: Array<keyof T> = keys(cacheUpdateInfo) as Array<keyof T>;
|
||||||
|
|
||||||
@@ -60,8 +60,8 @@ export const createCache = <T>(
|
|||||||
cache[prop]._changed = equal ? !equal(curr, value) : curr !== value;
|
cache[prop]._changed = equal ? !equal(curr, value) : curr !== value;
|
||||||
};
|
};
|
||||||
|
|
||||||
const flush = (force?: boolean): CacheUpdate<T> => {
|
const flush = (force?: boolean): CacheChanged<T> => {
|
||||||
const result: CacheUpdate<T> = {} as CacheUpdate<T>;
|
const result: CacheChanged<T> = {} as CacheChanged<T>;
|
||||||
|
|
||||||
each(allProps, (prop: keyof T) => {
|
each(allProps, (prop: keyof T) => {
|
||||||
result[prop] = !!(cache[prop]._changed || force);
|
result[prop] = !!(cache[prop]._changed || force);
|
||||||
@@ -71,7 +71,7 @@ export const createCache = <T>(
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
return (propsToUpdate?: Array<keyof T> | keyof T, force?: boolean) => {
|
return (propsToUpdate?: PropsToUpdate<T>, force?: boolean) => {
|
||||||
const finalPropsToUpdate: Array<keyof T> =
|
const finalPropsToUpdate: Array<keyof T> =
|
||||||
(isString(propsToUpdate) ? ([propsToUpdate] as Array<keyof T>) : (propsToUpdate as Array<keyof T>)) || allProps;
|
(isString(propsToUpdate) ? ([propsToUpdate] as Array<keyof T>) : (propsToUpdate as Array<keyof T>)) || allProps;
|
||||||
each(finalPropsToUpdate, (prop) => {
|
each(finalPropsToUpdate, (prop) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user