react-native-roster 0.4.8 → 0.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/src/components/schedule/schedule.types.d.ts +3 -1
- package/dist/src/components/schedule/schedule.types.d.ts.map +1 -1
- package/dist/src/components/schedule/use-schedule.d.ts.map +1 -1
- package/dist/src/components/schedule/use-schedule.js +3 -1
- package/dist/src/components/schedule/use-schedule.js.map +1 -1
- package/dist/src/core/lru.d.ts +3 -0
- package/dist/src/core/lru.d.ts.map +1 -0
- package/dist/src/core/lru.js +18 -0
- package/dist/src/core/lru.js.map +1 -0
- package/llms.txt +11 -6
- package/package.json +1 -1
- package/src/components/schedule/README.md +4 -0
- package/src/components/schedule/schedule.types.ts +3 -0
- package/src/components/schedule/use-schedule.ts +4 -1
- package/src/core/lru.ts +13 -0
package/README.md
CHANGED
|
@@ -76,6 +76,12 @@ Without Expo, follow the [Reanimated install guide](https://docs.swmansion.com/r
|
|
|
76
76
|
for 3.19 or newer. On React Native older than 0.79, turn on
|
|
77
77
|
`resolver.unstable_enablePackageExports` in Metro.
|
|
78
78
|
|
|
79
|
+
The workspace demo routes the root, `/core`, `/rrule`, and `/nativewind` imports through each
|
|
80
|
+
export's `react-native` condition on web, iOS, and Android. Metro therefore compiles TypeScript
|
|
81
|
+
source edits without rebuilding `dist`; the resolver still uses the package export map rather than
|
|
82
|
+
an alias, and leaves peer and unrelated-package resolution unchanged. Restart the demo server if a
|
|
83
|
+
source edit is not detected.
|
|
84
|
+
|
|
79
85
|
### Roster
|
|
80
86
|
|
|
81
87
|
The smallest useful roster: Alex works 09:00 to 17:00 UTC on Monday, and a table
|
|
@@ -262,9 +268,9 @@ datasets then cannot collide when they reuse lane IDs and versions. Omitting the
|
|
|
262
268
|
core-owned default, while deliberately reusing one identity shares target-warm coverage across
|
|
263
269
|
projections.
|
|
264
270
|
|
|
265
|
-
`Roster` and `
|
|
266
|
-
|
|
267
|
-
geometry and coverage.
|
|
271
|
+
Every mounted `Roster`, `Schedule`, `useRoster`, and `useSchedule` surface owns an isolated
|
|
272
|
+
identity by default. Pass a stable `cacheIdentity` only when several surfaces render the same
|
|
273
|
+
dataset and should deliberately share target-warm geometry and coverage.
|
|
268
274
|
|
|
269
275
|
Minified, with peers external: `/core` is 13.6 kB and the root entry is 51.2 kB.
|
|
270
276
|
`/rrule` adds 12.9 kB of its own code plus its two dependencies, `rrule-temporal`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ComponentType } from 'react';
|
|
2
2
|
import type { StyleProp, ViewStyle } from 'react-native';
|
|
3
|
-
import type { DayColumn, Lane, LaneGeometry, Projection, Rect, Source, Transition, Window, WindowSpec } from '../../core';
|
|
3
|
+
import type { DayColumn, Lane, LaneGeometry, Projection, Rect, ScopedCacheIdentity, Source, Transition, Window, WindowSpec } from '../../core';
|
|
4
4
|
import type { GapInput, IntervalInput } from '../layers/layers.types';
|
|
5
5
|
export type ScheduleWindowSpec = WindowSpec & {
|
|
6
6
|
span: 'day' | 'week';
|
|
@@ -11,6 +11,8 @@ export type ScheduleProjection = Extract<Projection, {
|
|
|
11
11
|
export type ScheduleInput = {
|
|
12
12
|
lane: Lane;
|
|
13
13
|
windowSpec: ScheduleWindowSpec;
|
|
14
|
+
/** Stable cache identity for deliberate reuse across surfaces rendering one dataset. */
|
|
15
|
+
cacheIdentity?: ScopedCacheIdentity;
|
|
14
16
|
minuteStep?: number;
|
|
15
17
|
/** Positive finite pixels per wall-clock hour; defaults to 48. */
|
|
16
18
|
pxPerHour?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.types.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/schedule.types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schedule.types.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/schedule.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-schedule.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-schedule.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAsB,MAAM,kBAAkB,CAAC;AAGzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAsE/D"}
|
|
@@ -8,6 +8,8 @@ const use_schedule_viewport_1 = require("./use-schedule-viewport");
|
|
|
8
8
|
function useSchedule(input) {
|
|
9
9
|
const { lane, windowSpec, minuteStep = 60, pxPerHour = 48 } = input;
|
|
10
10
|
const width = (0, react_1.useContext)(use_schedule_viewport_1.ScheduleWidth);
|
|
11
|
+
const [ownedCacheIdentity] = (0, react_1.useState)(() => ({}));
|
|
12
|
+
const cacheIdentity = input.cacheIdentity ?? ownedCacheIdentity;
|
|
11
13
|
const [clock, setClock] = (0, react_1.useState)(Date.now);
|
|
12
14
|
// The current-time indicator follows the wall clock for the mounted surface's lifetime.
|
|
13
15
|
(0, react_1.useEffect)(() => {
|
|
@@ -27,7 +29,7 @@ function useSchedule(input) {
|
|
|
27
29
|
columnWidth: width / Math.max(1, days.length),
|
|
28
30
|
days,
|
|
29
31
|
};
|
|
30
|
-
const geometry = (0, core_1.layoutLane)(lane, window, projection);
|
|
32
|
+
const geometry = (0, core_1.layoutLane)(lane, window, projection, cacheIdentity);
|
|
31
33
|
const currentPress = { input, window, projection, geometry };
|
|
32
34
|
const pressInput = (0, react_1.useRef)(currentPress);
|
|
33
35
|
pressInput.current = currentPress;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-schedule.js","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":";;;AAAA,iCAAgE;
|
|
1
|
+
{"version":3,"file":"use-schedule.js","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":";;;AAAA,iCAAgE;AAEhE,qCAAuF;AACvF,kDAA8C;AAE9C,mEAAwD;AAExD,qBAA4B,KAAoB;IAC9C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,qCAAa,CAAC,CAAC;IACxC,MAAM,CAAC,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAAsB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,kBAAkB,CAAC;IAChE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,wFAAwF;IACxF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,EAAE,GAAG,UAAU,KAAK,CAAC;QAC3E,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAC/C,MAAM,IAAI,UAAU,CAAC,4CAA4C,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAA,gBAAS,EAAC,UAAU,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAA,oBAAa,EAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,UAAU,GAAuB;QACrC,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,UAAU,CAAC,QAAQ;QACjC,SAAS;QACT,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;QAC7C,IAAI;KACL,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,iBAAU,EAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAA,cAAM,EAAC,YAAY,CAAC,CAAC;IACxC,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE;QAC5B,OAAO,SAAS,KAAK,CAAC,WAAmB,EAAE,CAAS,EAAE,CAAS;YAC7D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;YACnE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;YAClF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,WAAW;gBACpF,OAAO;YACT,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,MAAM,CAAC,KAAK,EACZ,IAAA,iBAAU,EAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAC1D,CAAC;YACF,MAAM,GAAG,GAAG,IAAA,kBAAO,EACjB,IAAI,EACJ;gBACE,GAAG,QAAQ;gBACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;gBACnE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;aAC1E,EACD,CAAC,EACD,CAAC,CACF,CAAC;YACF,IAAI,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7B,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;gBACxB,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG;gBAAE,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,MAAM;QACN,IAAI;QACJ,UAAU;QACV,QAAQ;QACR,GAAG,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC/D,KAAK;QACL,MAAM,EAAE,OAAO;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../../src/core/lru.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAIjE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMhE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.touch = touch;
|
|
4
|
+
exports.trim = trim;
|
|
5
|
+
function touch(cache, key, value) {
|
|
6
|
+
cache.delete(key);
|
|
7
|
+
cache.set(key, value);
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
function trim(cache, limit) {
|
|
11
|
+
while (cache.size > limit) {
|
|
12
|
+
const oldest = cache.keys().next();
|
|
13
|
+
if (oldest.done)
|
|
14
|
+
return;
|
|
15
|
+
cache.delete(oldest.value);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=lru.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/core/lru.ts"],"names":[],"mappings":";;;;AAAA,eAA4B,KAAgB,EAAE,GAAM,EAAE,KAAQ;IAC5D,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,cAA2B,KAAgB,EAAE,KAAa;IACxD,OAAO,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO;QACxB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
package/llms.txt
CHANGED
|
@@ -170,11 +170,14 @@ core types. Core imports standard JS and Intl only. Only /rrule imports
|
|
|
170
170
|
rrule-temporal 1.6.0 and @js-temporal/polyfill 0.5.1. Those are installed runtime
|
|
171
171
|
dependencies but cannot enter root/core bundles through library imports.
|
|
172
172
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
173
|
+
The workspace demo selects TS source for the root, /core, /rrule, and /nativewind
|
|
174
|
+
through each export's react-native condition on web, iOS, and Android. It does not
|
|
175
|
+
alias around the package export map or change conditions for peers and unrelated
|
|
176
|
+
packages. Source edits therefore need no dist rebuild; restart the demo server if
|
|
177
|
+
Metro does not detect one. Other resolvers load built CommonJS from dist/src;
|
|
178
|
+
declarations use the types condition. Build before Node export tests. Root needs a
|
|
179
|
+
native renderer or web bundler; direct Node use of root is not a substitute for a
|
|
180
|
+
React Native app. Core and /rrule work in Node/Bun.
|
|
178
181
|
|
|
179
182
|
## 0.1.0 slot prop rename
|
|
180
183
|
|
|
@@ -221,7 +224,7 @@ windows use their exact elapsed duration, including sub-minute spans. Cell times
|
|
|
221
224
|
are clamped up to window.start and rejected at or beyond window.end.
|
|
222
225
|
|
|
223
226
|
Schedule required props: lane: Lane, windowSpec: WindowSpec & {span:'day'|'week'}.
|
|
224
|
-
Optional: minuteStep (60), pxPerHour (48, positive finite), highlightSource,
|
|
227
|
+
Optional: cacheIdentity (stable ScopedCacheIdentity), minuteStep (60), pxPerHour (48, positive finite), highlightSource,
|
|
225
228
|
onNavigate, onIntervalPress, onGapPress, onCellPress, style, headerStyle,
|
|
226
229
|
gutterStyle, daysStyle, incompleteLabel, and zones below. Class twins are
|
|
227
230
|
className, headerClassName, gutterClassName, and daysClassName. No month/custom
|
|
@@ -232,6 +235,8 @@ press(columnIndex,x,y), and status:'ready'. The standalone hook uses a 280 px gr
|
|
|
232
235
|
The chassis measures width, reserves a 48 px gutter, and fits all actual day
|
|
233
236
|
columns without horizontal scrolling; the body scrolls vertically. now updates
|
|
234
237
|
every minute and is null outside the selected window.
|
|
238
|
+
Each mounted Schedule or useSchedule surface owns an isolated cache identity by default.
|
|
239
|
+
Reuse one explicit cacheIdentity only across surfaces that render the same dataset.
|
|
235
240
|
|
|
236
241
|
Props ending in Component accept ComponentType<Input>, mounted as React elements.
|
|
237
242
|
Props ending in Zone accept ReactNode; pass null to suppress a singleton default.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-roster",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.10",
|
|
4
4
|
"description": "Resource timeline and schedule components for React Native and web, with layered intervals, coverage, provenance, and explicit daylight-saving handling.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|
|
@@ -21,3 +21,7 @@ The chassis binds default component types once; ScheduleDay mounts components
|
|
|
21
21
|
with day data and passes nodes into ScheduleDayLayout. There is no black-box day
|
|
22
22
|
list to split: days, transitions, and rects already map in their owning parts.
|
|
23
23
|
Schedule has ten input-bearing component slots and no zero-argument singleton slots.
|
|
24
|
+
|
|
25
|
+
Each mounted `Schedule` or `useSchedule` surface owns an isolated `ScopedCacheIdentity` by default.
|
|
26
|
+
Pass one stable `cacheIdentity` to multiple surfaces only when they render the same dataset and
|
|
27
|
+
should share target-warm geometry and coverage.
|
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
LaneGeometry,
|
|
7
7
|
Projection,
|
|
8
8
|
Rect,
|
|
9
|
+
ScopedCacheIdentity,
|
|
9
10
|
Source,
|
|
10
11
|
Transition,
|
|
11
12
|
Window,
|
|
@@ -18,6 +19,8 @@ export type ScheduleProjection = Extract<Projection, { orientation: 'columns' }>
|
|
|
18
19
|
export type ScheduleInput = {
|
|
19
20
|
lane: Lane;
|
|
20
21
|
windowSpec: ScheduleWindowSpec;
|
|
22
|
+
/** Stable cache identity for deliberate reuse across surfaces rendering one dataset. */
|
|
23
|
+
cacheIdentity?: ScopedCacheIdentity;
|
|
21
24
|
minuteStep?: number;
|
|
22
25
|
/** Positive finite pixels per wall-clock hour; defaults to 48. */
|
|
23
26
|
pxPerHour?: number;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useContext, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import type { ScopedCacheIdentity } from '../../core';
|
|
2
3
|
import { dayColumnsFor, layoutLane, snapToStep, timeAtY, windowFor } from '../../core';
|
|
3
4
|
import { hitTest } from '../../core/hit-test';
|
|
4
5
|
import type { ScheduleInput, ScheduleModel, ScheduleProjection } from './schedule.types';
|
|
@@ -7,6 +8,8 @@ import { ScheduleWidth } from './use-schedule-viewport';
|
|
|
7
8
|
export function useSchedule(input: ScheduleInput): ScheduleModel {
|
|
8
9
|
const { lane, windowSpec, minuteStep = 60, pxPerHour = 48 } = input;
|
|
9
10
|
const width = useContext(ScheduleWidth);
|
|
11
|
+
const [ownedCacheIdentity] = useState<ScopedCacheIdentity>(() => ({}));
|
|
12
|
+
const cacheIdentity = input.cacheIdentity ?? ownedCacheIdentity;
|
|
10
13
|
const [clock, setClock] = useState(Date.now);
|
|
11
14
|
// The current-time indicator follows the wall clock for the mounted surface's lifetime.
|
|
12
15
|
useEffect(() => {
|
|
@@ -26,7 +29,7 @@ export function useSchedule(input: ScheduleInput): ScheduleModel {
|
|
|
26
29
|
columnWidth: width / Math.max(1, days.length),
|
|
27
30
|
days,
|
|
28
31
|
};
|
|
29
|
-
const geometry = layoutLane(lane, window, projection);
|
|
32
|
+
const geometry = layoutLane(lane, window, projection, cacheIdentity);
|
|
30
33
|
const currentPress = { input, window, projection, geometry };
|
|
31
34
|
const pressInput = useRef(currentPress);
|
|
32
35
|
pressInput.current = currentPress;
|
package/src/core/lru.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function touch<K, V>(cache: Map<K, V>, key: K, value: V): V {
|
|
2
|
+
cache.delete(key);
|
|
3
|
+
cache.set(key, value);
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function trim<K, V>(cache: Map<K, V>, limit: number): void {
|
|
8
|
+
while (cache.size > limit) {
|
|
9
|
+
const oldest = cache.keys().next();
|
|
10
|
+
if (oldest.done) return;
|
|
11
|
+
cache.delete(oldest.value);
|
|
12
|
+
}
|
|
13
|
+
}
|