foldkit-primitives 0.15.3 → 0.16.0
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/dist/device/fullscreen.d.ts +28 -0
- package/dist/device/fullscreen.d.ts.map +1 -0
- package/dist/device/fullscreen.js +69 -0
- package/dist/device/fullscreen.js.map +1 -0
- package/dist/device/geolocation.d.ts +56 -0
- package/dist/device/geolocation.d.ts.map +1 -0
- package/dist/device/geolocation.js +87 -0
- package/dist/device/geolocation.js.map +1 -0
- package/dist/device/index.d.ts +5 -0
- package/dist/device/index.js +6 -0
- package/dist/device/media-devices.d.ts +88 -0
- package/dist/device/media-devices.d.ts.map +1 -0
- package/dist/device/media-devices.js +117 -0
- package/dist/device/media-devices.js.map +1 -0
- package/dist/device/media-stream.d.ts +93 -0
- package/dist/device/media-stream.d.ts.map +1 -0
- package/dist/device/media-stream.js +106 -0
- package/dist/device/media-stream.js.map +1 -0
- package/dist/device/permissions.d.ts +106 -0
- package/dist/device/permissions.d.ts.map +1 -0
- package/dist/device/permissions.js +143 -0
- package/dist/device/permissions.js.map +1 -0
- package/dist/dom/autofocus.d.ts +15 -0
- package/dist/dom/autofocus.d.ts.map +1 -0
- package/dist/dom/autofocus.js +22 -0
- package/dist/dom/autofocus.js.map +1 -0
- package/dist/dom/clipboard.d.ts +30 -0
- package/dist/dom/clipboard.d.ts.map +1 -0
- package/dist/dom/clipboard.js +50 -0
- package/dist/dom/clipboard.js.map +1 -0
- package/dist/dom/editable-text.d.ts +72 -0
- package/dist/dom/editable-text.d.ts.map +1 -0
- package/dist/dom/editable-text.js +232 -0
- package/dist/dom/editable-text.js.map +1 -0
- package/dist/dom/fluid-hover.d.ts +93 -0
- package/dist/dom/fluid-hover.d.ts.map +1 -0
- package/dist/dom/fluid-hover.js +294 -0
- package/dist/dom/fluid-hover.js.map +1 -0
- package/dist/dom/focus-scope.d.ts +21 -0
- package/dist/dom/focus-scope.d.ts.map +1 -0
- package/dist/dom/focus-scope.js +93 -0
- package/dist/dom/focus-scope.js.map +1 -0
- package/dist/dom/follow-tab-stop.d.ts +11 -0
- package/dist/dom/follow-tab-stop.d.ts.map +1 -0
- package/dist/dom/follow-tab-stop.js +54 -0
- package/dist/dom/follow-tab-stop.js.map +1 -0
- package/dist/dom/image-decode.d.ts +27 -0
- package/dist/dom/image-decode.d.ts.map +1 -0
- package/dist/dom/image-decode.js +50 -0
- package/dist/dom/image-decode.js.map +1 -0
- package/dist/dom/index.d.ts +24 -0
- package/dist/dom/index.js +25 -0
- package/dist/dom/input-mask.d.ts +35 -0
- package/dist/dom/input-mask.d.ts.map +1 -0
- package/dist/dom/input-mask.js +90 -0
- package/dist/dom/input-mask.js.map +1 -0
- package/dist/dom/keep-in-view.d.ts +16 -0
- package/dist/dom/keep-in-view.d.ts.map +1 -0
- package/dist/dom/keep-in-view.js +38 -0
- package/dist/dom/keep-in-view.js.map +1 -0
- package/dist/dom/keyboard-inset.d.ts +29 -0
- package/dist/dom/keyboard-inset.d.ts.map +1 -0
- package/dist/dom/keyboard-inset.js +45 -0
- package/dist/dom/keyboard-inset.js.map +1 -0
- package/dist/dom/layers.d.ts +6 -0
- package/dist/dom/layers.d.ts.map +1 -0
- package/dist/dom/layers.js +35 -0
- package/dist/dom/layers.js.map +1 -0
- package/dist/dom/measure.d.ts +42 -0
- package/dist/dom/measure.d.ts.map +1 -0
- package/dist/dom/measure.js +123 -0
- package/dist/dom/measure.js.map +1 -0
- package/dist/dom/move.d.ts +45 -0
- package/dist/dom/move.d.ts.map +1 -0
- package/dist/dom/move.js +96 -0
- package/dist/dom/move.js.map +1 -0
- package/dist/dom/pointed-links.d.ts +13 -0
- package/dist/dom/pointed-links.d.ts.map +1 -0
- package/dist/dom/pointed-links.js +59 -0
- package/dist/dom/pointed-links.js.map +1 -0
- package/dist/dom/pointer-drag.d.ts +132 -0
- package/dist/dom/pointer-drag.d.ts.map +1 -0
- package/dist/dom/pointer-drag.js +307 -0
- package/dist/dom/pointer-drag.js.map +1 -0
- package/dist/dom/pointer-position.d.ts +133 -0
- package/dist/dom/pointer-position.d.ts.map +1 -0
- package/dist/dom/pointer-position.js +173 -0
- package/dist/dom/pointer-position.js.map +1 -0
- package/dist/dom/script-loader.d.ts +12 -0
- package/dist/dom/script-loader.d.ts.map +1 -0
- package/dist/dom/script-loader.js +54 -0
- package/dist/dom/script-loader.js.map +1 -0
- package/dist/dom/scroll-bars.d.ts +52 -0
- package/dist/dom/scroll-bars.d.ts.map +1 -0
- package/dist/dom/scroll-bars.js +259 -0
- package/dist/dom/scroll-bars.js.map +1 -0
- package/dist/dom/scroll-settle.d.ts +33 -0
- package/dist/dom/scroll-settle.d.ts.map +1 -0
- package/dist/dom/scroll-settle.js +84 -0
- package/dist/dom/scroll-settle.js.map +1 -0
- package/dist/dom/scroll.d.ts +21 -0
- package/dist/dom/scroll.d.ts.map +1 -0
- package/dist/dom/scroll.js +141 -0
- package/dist/dom/scroll.js.map +1 -0
- package/dist/dom/share.d.ts +19 -0
- package/dist/dom/share.d.ts.map +1 -0
- package/dist/dom/share.js +41 -0
- package/dist/dom/share.js.map +1 -0
- package/dist/dom/swipe.d.ts +121 -0
- package/dist/dom/swipe.d.ts.map +1 -0
- package/dist/dom/swipe.js +291 -0
- package/dist/dom/swipe.js.map +1 -0
- package/dist/dom/targets.d.ts +45 -0
- package/dist/dom/targets.d.ts.map +1 -0
- package/dist/dom/targets.js +70 -0
- package/dist/dom/targets.js.map +1 -0
- package/dist/dom/track-box.d.ts +61 -0
- package/dist/dom/track-box.d.ts.map +1 -0
- package/dist/dom/track-box.js +131 -0
- package/dist/dom/track-box.js.map +1 -0
- package/dist/events/active-element.d.ts +15 -0
- package/dist/events/active-element.d.ts.map +1 -0
- package/dist/events/active-element.js +33 -0
- package/dist/events/active-element.js.map +1 -0
- package/dist/events/hotkeys.d.ts +22 -0
- package/dist/events/hotkeys.d.ts.map +1 -0
- package/dist/events/hotkeys.js +56 -0
- package/dist/events/hotkeys.js.map +1 -0
- package/dist/events/idle.d.ts +29 -0
- package/dist/events/idle.d.ts.map +1 -0
- package/dist/events/idle.js +51 -0
- package/dist/events/idle.js.map +1 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.js +10 -0
- package/dist/{input-modality-BY-bSrEc.d.mts → events/input-modality.d.ts} +9 -12
- package/dist/events/input-modality.d.ts.map +1 -0
- package/dist/{input-modality-BXD383jg.mjs → events/input-modality.js} +3 -4
- package/dist/events/input-modality.js.map +1 -0
- package/dist/events/keyboard.d.ts +30 -0
- package/dist/events/keyboard.d.ts.map +1 -0
- package/dist/events/keyboard.js +55 -0
- package/dist/events/keyboard.js.map +1 -0
- package/dist/events/pointer.d.ts +15 -0
- package/dist/events/pointer.d.ts.map +1 -0
- package/dist/events/pointer.js +28 -0
- package/dist/events/pointer.js.map +1 -0
- package/dist/events/scroll.d.ts +16 -0
- package/dist/events/scroll.d.ts.map +1 -0
- package/dist/events/scroll.js +29 -0
- package/dist/events/scroll.js.map +1 -0
- package/dist/events/visibility.d.ts +25 -0
- package/dist/events/visibility.d.ts.map +1 -0
- package/dist/events/visibility.js +28 -0
- package/dist/events/visibility.js.map +1 -0
- package/dist/events/window-size.d.ts +30 -0
- package/dist/events/window-size.d.ts.map +1 -0
- package/dist/events/window-size.js +63 -0
- package/dist/events/window-size.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/interaction/bundle-behavior.d.ts +37 -0
- package/dist/interaction/bundle-behavior.d.ts.map +1 -0
- package/dist/interaction/bundle-behavior.js +34 -0
- package/dist/interaction/bundle-behavior.js.map +1 -0
- package/dist/interaction/dismiss-layer.d.ts +100 -0
- package/dist/interaction/dismiss-layer.d.ts.map +1 -0
- package/dist/interaction/dismiss-layer.js +140 -0
- package/dist/interaction/dismiss-layer.js.map +1 -0
- package/dist/interaction/editable-text.d.ts +13 -0
- package/dist/interaction/editable-text.d.ts.map +1 -0
- package/dist/interaction/editable-text.js +17 -0
- package/dist/interaction/editable-text.js.map +1 -0
- package/dist/interaction/focus-scope.d.ts +21 -0
- package/dist/interaction/focus-scope.d.ts.map +1 -0
- package/dist/interaction/focus-scope.js +25 -0
- package/dist/interaction/focus-scope.js.map +1 -0
- package/dist/interaction/focus-visible.d.ts +9 -0
- package/dist/interaction/focus-visible.d.ts.map +1 -0
- package/dist/interaction/focus-visible.js +10 -0
- package/dist/interaction/focus-visible.js.map +1 -0
- package/dist/interaction/grid-navigation.d.ts +73 -0
- package/dist/interaction/grid-navigation.d.ts.map +1 -0
- package/dist/interaction/grid-navigation.js +137 -0
- package/dist/interaction/grid-navigation.js.map +1 -0
- package/dist/interaction/index.d.ts +21 -0
- package/dist/interaction/index.js +21 -0
- package/dist/interaction/layers.d.ts +12 -0
- package/dist/interaction/layers.d.ts.map +1 -0
- package/dist/interaction/layers.js +14 -0
- package/dist/interaction/layers.js.map +1 -0
- package/dist/interaction/list-navigation.d.ts +105 -0
- package/dist/interaction/list-navigation.d.ts.map +1 -0
- package/dist/interaction/list-navigation.js +168 -0
- package/dist/interaction/list-navigation.js.map +1 -0
- package/dist/interaction/live-announce.d.ts +70 -0
- package/dist/interaction/live-announce.d.ts.map +1 -0
- package/dist/interaction/live-announce.js +115 -0
- package/dist/interaction/live-announce.js.map +1 -0
- package/dist/interaction/long-press.d.ts +102 -0
- package/dist/interaction/long-press.d.ts.map +1 -0
- package/dist/interaction/long-press.js +115 -0
- package/dist/interaction/long-press.js.map +1 -0
- package/dist/interaction/move.d.ts +10 -0
- package/dist/interaction/move.d.ts.map +1 -0
- package/dist/interaction/move.js +17 -0
- package/dist/interaction/move.js.map +1 -0
- package/dist/interaction/overlay.d.ts +45 -0
- package/dist/interaction/overlay.d.ts.map +1 -0
- package/dist/interaction/overlay.js +57 -0
- package/dist/interaction/overlay.js.map +1 -0
- package/dist/interaction/placing.d.ts +86 -0
- package/dist/interaction/placing.d.ts.map +1 -0
- package/dist/interaction/placing.js +239 -0
- package/dist/interaction/placing.js.map +1 -0
- package/dist/interaction/pointer-drag.d.ts +23 -0
- package/dist/interaction/pointer-drag.d.ts.map +1 -0
- package/dist/interaction/pointer-drag.js +21 -0
- package/dist/interaction/pointer-drag.js.map +1 -0
- package/dist/interaction/press.d.ts +152 -0
- package/dist/interaction/press.d.ts.map +1 -0
- package/dist/interaction/press.js +229 -0
- package/dist/interaction/press.js.map +1 -0
- package/dist/interaction/roving-tabindex.d.ts +85 -0
- package/dist/interaction/roving-tabindex.d.ts.map +1 -0
- package/dist/interaction/roving-tabindex.js +142 -0
- package/dist/interaction/roving-tabindex.js.map +1 -0
- package/dist/interaction/selection.d.ts +72 -0
- package/dist/interaction/selection.d.ts.map +1 -0
- package/dist/interaction/selection.js +129 -0
- package/dist/interaction/selection.js.map +1 -0
- package/dist/interaction/targets.d.ts +15 -0
- package/dist/interaction/targets.d.ts.map +1 -0
- package/dist/interaction/targets.js +20 -0
- package/dist/interaction/targets.js.map +1 -0
- package/dist/interaction/tree-navigation.d.ts +111 -0
- package/dist/interaction/tree-navigation.d.ts.map +1 -0
- package/dist/interaction/tree-navigation.js +207 -0
- package/dist/interaction/tree-navigation.js.map +1 -0
- package/dist/interaction/typeahead.d.ts +73 -0
- package/dist/interaction/typeahead.d.ts.map +1 -0
- package/dist/interaction/typeahead.js +113 -0
- package/dist/interaction/typeahead.js.map +1 -0
- package/dist/internal.d.ts +16 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/{internal-DP-xLKbT.mjs → internal.js} +8 -7
- package/dist/internal.js.map +1 -0
- package/dist/media/breakpoints.d.ts +37 -0
- package/dist/media/breakpoints.d.ts.map +1 -0
- package/dist/media/breakpoints.js +64 -0
- package/dist/media/breakpoints.js.map +1 -0
- package/dist/media/index.d.ts +3 -0
- package/dist/media/index.js +4 -0
- package/dist/media/mediaquery.d.ts +40 -0
- package/dist/media/mediaquery.d.ts.map +1 -0
- package/dist/media/mediaquery.js +42 -0
- package/dist/media/mediaquery.js.map +1 -0
- package/dist/media/platform.d.ts +30 -0
- package/dist/media/platform.d.ts.map +1 -0
- package/dist/media/platform.js +50 -0
- package/dist/media/platform.js.map +1 -0
- package/dist/motion/index.d.ts +5 -0
- package/dist/motion/index.js +5 -0
- package/dist/motion/motion.d.ts +16 -0
- package/dist/motion/motion.d.ts.map +1 -0
- package/dist/motion/motion.js +25 -0
- package/dist/motion/motion.js.map +1 -0
- package/dist/motion/presence.d.ts +37 -0
- package/dist/motion/presence.d.ts.map +1 -0
- package/dist/motion/presence.js +65 -0
- package/dist/motion/presence.js.map +1 -0
- package/dist/motion/spring.d.ts +50 -0
- package/dist/motion/spring.d.ts.map +1 -0
- package/dist/motion/spring.js +92 -0
- package/dist/motion/spring.js.map +1 -0
- package/dist/motion/tween.d.ts +44 -0
- package/dist/motion/tween.d.ts.map +1 -0
- package/dist/motion/tween.js +65 -0
- package/dist/motion/tween.js.map +1 -0
- package/dist/net/broadcast.d.ts +39 -0
- package/dist/net/broadcast.d.ts.map +1 -0
- package/dist/net/broadcast.js +73 -0
- package/dist/net/broadcast.js.map +1 -0
- package/dist/net/index.d.ts +5 -0
- package/dist/net/index.js +6 -0
- package/dist/net/online.d.ts +24 -0
- package/dist/net/online.d.ts.map +1 -0
- package/dist/net/online.js +26 -0
- package/dist/net/online.js.map +1 -0
- package/dist/net/sharedHost.d.ts +64 -0
- package/dist/net/sharedHost.d.ts.map +1 -0
- package/dist/net/sharedHost.js +124 -0
- package/dist/net/sharedHost.js.map +1 -0
- package/dist/net/sse.d.ts +115 -0
- package/dist/net/sse.d.ts.map +1 -0
- package/dist/net/sse.js +138 -0
- package/dist/net/sse.js.map +1 -0
- package/dist/net/websocket.d.ts +172 -0
- package/dist/net/websocket.d.ts.map +1 -0
- package/dist/net/websocket.js +199 -0
- package/dist/net/websocket.js.map +1 -0
- package/dist/observers/bounds.d.ts +24 -0
- package/dist/observers/bounds.d.ts.map +1 -0
- package/dist/observers/bounds.js +51 -0
- package/dist/observers/bounds.js.map +1 -0
- package/dist/observers/index.d.ts +4 -0
- package/dist/observers/index.js +5 -0
- package/dist/observers/intersection.d.ts +18 -0
- package/dist/observers/intersection.d.ts.map +1 -0
- package/dist/observers/intersection.js +33 -0
- package/dist/observers/intersection.js.map +1 -0
- package/dist/observers/mutation.d.ts +25 -0
- package/dist/observers/mutation.d.ts.map +1 -0
- package/dist/observers/mutation.js +53 -0
- package/dist/observers/mutation.js.map +1 -0
- package/dist/observers/resize.d.ts +18 -0
- package/dist/observers/resize.d.ts.map +1 -0
- package/dist/observers/resize.js +33 -0
- package/dist/observers/resize.js.map +1 -0
- package/dist/state/history.d.ts +115 -0
- package/dist/state/history.d.ts.map +1 -0
- package/dist/state/history.js +167 -0
- package/dist/state/history.js.map +1 -0
- package/dist/state/index.d.ts +6 -0
- package/dist/state/index.js +7 -0
- package/dist/state/locale.d.ts +27 -0
- package/dist/state/locale.d.ts.map +1 -0
- package/dist/state/locale.js +25 -0
- package/dist/state/locale.js.map +1 -0
- package/dist/state/pagination.d.ts +53 -0
- package/dist/state/pagination.d.ts.map +1 -0
- package/dist/state/pagination.js +72 -0
- package/dist/state/pagination.js.map +1 -0
- package/dist/state/range.d.ts +9 -0
- package/dist/state/range.d.ts.map +1 -0
- package/dist/state/range.js +18 -0
- package/dist/state/range.js.map +1 -0
- package/dist/state/selection.d.ts +47 -0
- package/dist/state/selection.d.ts.map +1 -0
- package/dist/state/selection.js +39 -0
- package/dist/state/selection.js.map +1 -0
- package/dist/state/virtual.d.ts +201 -0
- package/dist/state/virtual.d.ts.map +1 -0
- package/dist/state/{index.mjs → virtual.js} +11 -313
- package/dist/state/virtual.js.map +1 -0
- package/dist/time/debounce.d.ts +43 -0
- package/dist/time/debounce.d.ts.map +1 -0
- package/dist/time/debounce.js +65 -0
- package/dist/time/debounce.js.map +1 -0
- package/dist/time/index.d.ts +6 -0
- package/dist/time/index.js +7 -0
- package/dist/time/interval.d.ts +37 -0
- package/dist/time/interval.d.ts.map +1 -0
- package/dist/time/interval.js +52 -0
- package/dist/time/interval.js.map +1 -0
- package/dist/time/relative.d.ts +8 -0
- package/dist/time/relative.d.ts.map +1 -0
- package/dist/time/relative.js +27 -0
- package/dist/time/relative.js.map +1 -0
- package/dist/time/throttle.d.ts +38 -0
- package/dist/time/throttle.d.ts.map +1 -0
- package/dist/time/throttle.js +39 -0
- package/dist/time/throttle.js.map +1 -0
- package/dist/time/ticks.d.ts +21 -0
- package/dist/time/ticks.d.ts.map +1 -0
- package/dist/time/ticks.js +30 -0
- package/dist/time/ticks.js.map +1 -0
- package/dist/time/timer.d.ts +32 -0
- package/dist/time/timer.d.ts.map +1 -0
- package/dist/time/timer.js +50 -0
- package/dist/time/timer.js.map +1 -0
- package/package.json +31 -31
- package/dist/device/index.d.mts +0 -345
- package/dist/device/index.d.mts.map +0 -1
- package/dist/device/index.mjs +0 -498
- package/dist/device/index.mjs.map +0 -1
- package/dist/dom/index.d.mts +0 -750
- package/dist/dom/index.d.mts.map +0 -1
- package/dist/dom/index.mjs +0 -1857
- package/dist/dom/index.mjs.map +0 -1
- package/dist/editable-text-1D31qthY.d.mts +0 -319
- package/dist/editable-text-1D31qthY.d.mts.map +0 -1
- package/dist/events/index.d.mts +0 -184
- package/dist/events/index.d.mts.map +0 -1
- package/dist/events/index.mjs +0 -315
- package/dist/events/index.mjs.map +0 -1
- package/dist/follow-tab-stop-Caog2qg1.mjs +0 -863
- package/dist/follow-tab-stop-Caog2qg1.mjs.map +0 -1
- package/dist/index-CmmxqSEi.d.mts +0 -149
- package/dist/index-CmmxqSEi.d.mts.map +0 -1
- package/dist/index.d.mts +0 -12
- package/dist/index.mjs +0 -12
- package/dist/input-modality-BXD383jg.mjs.map +0 -1
- package/dist/input-modality-BY-bSrEc.d.mts.map +0 -1
- package/dist/interaction/index.d.mts +0 -1194
- package/dist/interaction/index.d.mts.map +0 -1
- package/dist/interaction/index.mjs +0 -2012
- package/dist/interaction/index.mjs.map +0 -1
- package/dist/internal-DP-xLKbT.mjs.map +0 -1
- package/dist/media/index.d.mts +0 -109
- package/dist/media/index.d.mts.map +0 -1
- package/dist/media/index.mjs +0 -149
- package/dist/media/index.mjs.map +0 -1
- package/dist/motion/index.d.mts +0 -2
- package/dist/motion/index.mjs +0 -1
- package/dist/motion-DmFDppRn.mjs +0 -240
- package/dist/motion-DmFDppRn.mjs.map +0 -1
- package/dist/net/index.d.mts +0 -348
- package/dist/net/index.d.mts.map +0 -1
- package/dist/net/index.mjs +0 -535
- package/dist/net/index.mjs.map +0 -1
- package/dist/observers/index.d.mts +0 -84
- package/dist/observers/index.d.mts.map +0 -1
- package/dist/observers/index.mjs +0 -159
- package/dist/observers/index.mjs.map +0 -1
- package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
- package/dist/state/index.d.mts +0 -444
- package/dist/state/index.d.mts.map +0 -1
- package/dist/state/index.mjs.map +0 -1
- package/dist/time/index.d.mts +0 -179
- package/dist/time/index.d.mts.map +0 -1
- package/dist/time/index.mjs +0 -242
- package/dist/time/index.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative.d.ts","names":[],"sources":["../../src/time/relative.ts"],"mappings":";;;;;;qBAMa,qBAAkB,MAAU,MAAI,IAAM,MAAI"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/time/relative.ts
|
|
2
|
+
/**
|
|
3
|
+
* Relative time as a pure function: picks the unit (seconds through years)
|
|
4
|
+
* and delegates the wording to `Intl.RelativeTimeFormat`, so locales come
|
|
5
|
+
* from the platform, not a phrase table. `from` is the earlier moment;
|
|
6
|
+
* swap the arguments for future phrasing ("in 3 days").
|
|
7
|
+
*/
|
|
8
|
+
const formatRelativeTime = (from, to, locale = "en") => {
|
|
9
|
+
const format = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
|
|
10
|
+
const seconds = Math.round((to.getTime() - from.getTime()) / 1e3);
|
|
11
|
+
const abs = Math.abs(seconds);
|
|
12
|
+
if (abs < 60) return format.format(-seconds, "second");
|
|
13
|
+
const minutes = Math.round(seconds / 60);
|
|
14
|
+
if (abs < 3600) return format.format(-minutes, "minute");
|
|
15
|
+
const hours = Math.round(seconds / 3600);
|
|
16
|
+
if (abs < 86400) return format.format(-hours, "hour");
|
|
17
|
+
const days = Math.round(seconds / 86400);
|
|
18
|
+
if (abs < 604800) return format.format(-days, "day");
|
|
19
|
+
const weeks = Math.round(seconds / 604800);
|
|
20
|
+
if (abs < 2592e3) return format.format(-weeks, "week");
|
|
21
|
+
const months = Math.round(seconds / 2592e3);
|
|
22
|
+
if (abs < 31536e3) return format.format(-months, "month");
|
|
23
|
+
return format.format(-Math.round(seconds / 31536e3), "year");
|
|
24
|
+
};
|
|
25
|
+
export { formatRelativeTime };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=relative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative.js","names":[],"sources":["../../src/time/relative.ts"],"sourcesContent":["/**\n * Relative time as a pure function: picks the unit (seconds through years)\n * and delegates the wording to `Intl.RelativeTimeFormat`, so locales come\n * from the platform, not a phrase table. `from` is the earlier moment;\n * swap the arguments for future phrasing (\"in 3 days\").\n */\nexport const formatRelativeTime = (from: Date, to: Date, locale = 'en'): string => {\n const format = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' })\n const seconds = Math.round((to.getTime() - from.getTime()) / 1000)\n const abs = Math.abs(seconds)\n if (abs < 60) return format.format(-seconds, 'second')\n const minutes = Math.round(seconds / 60)\n if (abs < 60 * 60) return format.format(-minutes, 'minute')\n const hours = Math.round(seconds / (60 * 60))\n if (abs < 24 * 60 * 60) return format.format(-hours, 'hour')\n const days = Math.round(seconds / (24 * 60 * 60))\n if (abs < 7 * 24 * 60 * 60) return format.format(-days, 'day')\n const weeks = Math.round(seconds / (7 * 24 * 60 * 60))\n if (abs < 30 * 24 * 60 * 60) return format.format(-weeks, 'week')\n const months = Math.round(seconds / (30 * 24 * 60 * 60))\n if (abs < 365 * 24 * 60 * 60) return format.format(-months, 'month')\n return format.format(-Math.round(seconds / (365 * 24 * 60 * 60)), 'year')\n}\n"],"mappings":";;;;;;;AAMA,MAAa,sBAAsB,MAAY,IAAU,SAAS,SAAiB;CACjF,MAAM,SAAS,IAAI,KAAK,mBAAmB,QAAQ,EAAE,SAAS,OAAO,CAAC;CACtE,MAAM,UAAU,KAAK,OAAO,GAAG,QAAQ,IAAI,KAAK,QAAQ,KAAK,GAAI;CACjE,MAAM,MAAM,KAAK,IAAI,OAAO;CAC5B,IAAI,MAAM,IAAI,OAAO,OAAO,OAAO,CAAC,SAAS,QAAQ;CACrD,MAAM,UAAU,KAAK,MAAM,UAAU,EAAE;CACvC,IAAI,MAAM,MAAS,OAAO,OAAO,OAAO,CAAC,SAAS,QAAQ;CAC1D,MAAM,QAAQ,KAAK,MAAM,UAAW,IAAQ;CAC5C,IAAI,MAAM,OAAc,OAAO,OAAO,OAAO,CAAC,OAAO,MAAM;CAC3D,MAAM,OAAO,KAAK,MAAM,UAAW,KAAa;CAChD,IAAI,MAAM,QAAkB,OAAO,OAAO,OAAO,CAAC,MAAM,KAAK;CAC7D,MAAM,QAAQ,KAAK,MAAM,UAAW,MAAiB;CACrD,IAAI,MAAM,QAAmB,OAAO,OAAO,OAAO,CAAC,OAAO,MAAM;CAChE,MAAM,SAAS,KAAK,MAAM,UAAW,MAAkB;CACvD,IAAI,MAAM,SAAoB,OAAO,OAAO,OAAO,CAAC,QAAQ,OAAO;CACnE,OAAO,OAAO,OAAO,CAAC,KAAK,MAAM,UAAW,OAAmB,GAAG,MAAM;AAC1E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { Bundle } from "foldkit-bundle";
|
|
3
|
+
export declare const ThrottleModel: Schema.Struct<{
|
|
4
|
+
readonly lastAt: Schema.NullOr<Schema.Number>;
|
|
5
|
+
}>;
|
|
6
|
+
export type ThrottleModel = typeof ThrottleModel.Type;
|
|
7
|
+
export declare const ThrottleMessage: import("foldkit/message").MessageUnion<{
|
|
8
|
+
readonly Attempted: {};
|
|
9
|
+
readonly Evaluated: {
|
|
10
|
+
now: Schema.Number;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
export type ThrottleMessage = typeof ThrottleMessage.Type;
|
|
14
|
+
export declare const Throttled: Schema.TaggedStruct<"Throttled", {
|
|
15
|
+
readonly at: Schema.Number;
|
|
16
|
+
}>;
|
|
17
|
+
export type Throttled = typeof Throttled.Type;
|
|
18
|
+
/**
|
|
19
|
+
* Leading-edge throttle as a bundle: the first `Attempted` in an interval
|
|
20
|
+
* surfaces a `Throttled` OutMessage, the rest are dropped. `Attempted`
|
|
21
|
+
* reads the clock through a Command, so the check runs against Effect time
|
|
22
|
+
* and tests drive it with TestClock. Trailing-edge needs are Debounce's:
|
|
23
|
+
* pair the two rather than adding a second timer here.
|
|
24
|
+
*/
|
|
25
|
+
export declare const Throttle: Bundle.Bundle<"Throttle", {
|
|
26
|
+
readonly intervalMs: number;
|
|
27
|
+
}, {
|
|
28
|
+
readonly lastAt: number | null;
|
|
29
|
+
}, {
|
|
30
|
+
readonly _tag: "Attempted";
|
|
31
|
+
} | {
|
|
32
|
+
readonly _tag: "Evaluated";
|
|
33
|
+
readonly now: number;
|
|
34
|
+
}, {
|
|
35
|
+
readonly _tag: "Throttled";
|
|
36
|
+
readonly at: number;
|
|
37
|
+
}, never, never, void, {}, {}>;
|
|
38
|
+
//# sourceMappingURL=throttle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.d.ts","names":[],"sources":["../../src/time/throttle.ts"],"mappings":";;qBAKa,eAAa,OAAA;;;YACd,uBAAuB,cAAc;qBAEpC,2CAAe;;;IAEb,KAAG,OAAA;;;YAEN,yBAAyB,gBAAgB;qBAExC,WAAS,OAAA;;;YACV,mBAAmB,UAAU;;;;;;;;qBAS5B,UAAQ,OAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Clock, Effect, Schema } from "effect";
|
|
2
|
+
import { defineMessageUnion } from "foldkit/message";
|
|
3
|
+
import { Bundle } from "foldkit-bundle";
|
|
4
|
+
// src/time/throttle.ts
|
|
5
|
+
const ThrottleModel = Schema.Struct({ lastAt: Schema.NullOr(Schema.Number) });
|
|
6
|
+
const ThrottleMessage = defineMessageUnion({
|
|
7
|
+
Attempted: {},
|
|
8
|
+
Evaluated: { now: Schema.Number }
|
|
9
|
+
});
|
|
10
|
+
const Throttled = Schema.TaggedStruct("Throttled", { at: Schema.Number });
|
|
11
|
+
/**
|
|
12
|
+
* Leading-edge throttle as a bundle: the first `Attempted` in an interval
|
|
13
|
+
* surfaces a `Throttled` OutMessage, the rest are dropped. `Attempted`
|
|
14
|
+
* reads the clock through a Command, so the check runs against Effect time
|
|
15
|
+
* and tests drive it with TestClock. Trailing-edge needs are Debounce's:
|
|
16
|
+
* pair the two rather than adding a second timer here.
|
|
17
|
+
*/
|
|
18
|
+
const Throttle = Bundle.make("Throttle", {
|
|
19
|
+
Model: ThrottleModel,
|
|
20
|
+
Message: ThrottleMessage,
|
|
21
|
+
args: Schema.Struct({ intervalMs: Schema.Number.pipe(Schema.check(Schema.isGreaterThan(0)), Schema.check(Schema.isFinite())) }),
|
|
22
|
+
init: () => ({ model: { lastAt: null } }),
|
|
23
|
+
update: (model, message, args) => ThrottleMessage.match(message, {
|
|
24
|
+
Attempted: () => ({
|
|
25
|
+
model,
|
|
26
|
+
commands: [{
|
|
27
|
+
name: "Throttle.evaluate",
|
|
28
|
+
effect: Effect.map(Clock.currentTimeMillis, (now) => ThrottleMessage.Evaluated({ now }))
|
|
29
|
+
}]
|
|
30
|
+
}),
|
|
31
|
+
Evaluated: ({ now }) => model.lastAt === null || now - model.lastAt >= args.intervalMs ? {
|
|
32
|
+
model: { lastAt: now },
|
|
33
|
+
outMessage: Throttled.make({ at: now })
|
|
34
|
+
} : { model }
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
export { Throttle, ThrottleMessage, ThrottleModel, Throttled };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.js","names":[],"sources":["../../src/time/throttle.ts"],"sourcesContent":["import { Clock, Effect, Schema } from 'effect'\nimport { defineMessageUnion } from 'foldkit/message'\nimport type * as Update from 'foldkit/update'\nimport { Bundle } from 'foldkit-bundle'\n\nexport const ThrottleModel = Schema.Struct({ lastAt: Schema.NullOr(Schema.Number) })\nexport type ThrottleModel = typeof ThrottleModel.Type\n\nexport const ThrottleMessage = defineMessageUnion({\n Attempted: {},\n Evaluated: { now: Schema.Number },\n})\nexport type ThrottleMessage = typeof ThrottleMessage.Type\n\nexport const Throttled = Schema.TaggedStruct('Throttled', { at: Schema.Number })\nexport type Throttled = typeof Throttled.Type\n\n/**\n * Leading-edge throttle as a bundle: the first `Attempted` in an interval\n * surfaces a `Throttled` OutMessage, the rest are dropped. `Attempted`\n * reads the clock through a Command, so the check runs against Effect time\n * and tests drive it with TestClock. Trailing-edge needs are Debounce's:\n * pair the two rather than adding a second timer here.\n */\nexport const Throttle = Bundle.make('Throttle', {\n Model: ThrottleModel,\n Message: ThrottleMessage,\n args: Schema.Struct({\n intervalMs: Schema.Number.pipe(\n Schema.check(Schema.isGreaterThan(0)),\n Schema.check(Schema.isFinite()),\n ),\n }),\n init: () => ({ model: { lastAt: null } }),\n update: (model, message, args) =>\n ThrottleMessage.match<Update.ReturnWithOutMessage<ThrottleModel, ThrottleMessage, Throttled>>(\n message,\n {\n Attempted: () => ({\n model,\n commands: [\n {\n name: 'Throttle.evaluate',\n effect: Effect.map(Clock.currentTimeMillis, now =>\n ThrottleMessage.Evaluated({ now }),\n ),\n },\n ],\n }),\n // First attempt ever, or the interval has passed: fire and stamp.\n Evaluated: ({ now }) =>\n model.lastAt === null || now - model.lastAt >= args.intervalMs\n ? { model: { lastAt: now }, outMessage: Throttled.make({ at: now }) }\n : { model },\n },\n ),\n})\n"],"mappings":";;;;AAKA,MAAa,gBAAgB,OAAO,OAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAM,EAAE,CAAC;AAGnF,MAAa,kBAAkB,mBAAmB;CAChD,WAAW,CAAC;CACZ,WAAW,EAAE,KAAK,OAAO,OAAO;AAClC,CAAC;AAGD,MAAa,YAAY,OAAO,aAAa,aAAa,EAAE,IAAI,OAAO,OAAO,CAAC;;;;;;;;AAU/E,MAAa,WAAW,OAAO,KAAK,YAAY;CAC9C,OAAO;CACP,SAAS;CACT,MAAM,OAAO,OAAO,EAClB,YAAY,OAAO,OAAO,KACxB,OAAO,MAAM,OAAO,cAAc,CAAC,CAAC,GACpC,OAAO,MAAM,OAAO,SAAS,CAAC,CAChC,EACF,CAAC;CACD,aAAa,EAAE,OAAO,EAAE,QAAQ,KAAK,EAAE;CACvC,SAAS,OAAO,SAAS,SACvB,gBAAgB,MACd,SACA;EACE,kBAAkB;GAChB;GACA,UAAU,CACR;IACE,MAAM;IACN,QAAQ,OAAO,IAAI,MAAM,oBAAmB,QAC1C,gBAAgB,UAAU,EAAE,IAAI,CAAC,CACnC;GACF,CACF;EACF;EAEA,YAAY,EAAE,UACZ,MAAM,WAAW,QAAQ,MAAM,MAAM,UAAU,KAAK,aAChD;GAAE,OAAO,EAAE,QAAQ,IAAI;GAAG,YAAY,UAAU,KAAK,EAAE,IAAI,IAAI,CAAC;EAAE,IAClE,EAAE,MAAM;CAChB,CACF;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Option, Schema } from "effect";
|
|
2
|
+
import * as Subscription from "foldkit/subscription";
|
|
3
|
+
declare const TickDependencies: {
|
|
4
|
+
intervalMs: Schema.Option<Schema.Number>;
|
|
5
|
+
};
|
|
6
|
+
type TickDependencies = {
|
|
7
|
+
readonly intervalMs: Option.Option<number>;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Ticks while `intervalMs` answers `Some`, each tick one interval after the
|
|
11
|
+
* last and the first one interval after starting. A changed interval applies
|
|
12
|
+
* from the next tick, with no restart; other Model changes do nothing.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ticks: <Model, Message>(config: {
|
|
15
|
+
/** The time between ticks for this Model, in milliseconds; `None` stops the clock. */
|
|
16
|
+
readonly intervalMs: (model: Model) => Option.Option<number>;
|
|
17
|
+
/** The Message a tick sends, given its time on Effect's clock. */
|
|
18
|
+
readonly onTick: (at: number) => Message;
|
|
19
|
+
}) => Subscription.Subscription<Model, Message, TickDependencies>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=ticks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticks.d.ts","names":[],"sources":["../../src/time/ticks.ts"],"mappings":";;cASM;EAAqB,YAAU,OAAA,OAAA,OAAA;;KAChC;WAA8B,YAAY,OAAO;;;;;;;qBAezC,QAAS,OAAO,SAAO;;WAEzB,aAAa,OAAO,UAAU,OAAO;;WAErC,SAAS,eAAe;MAC/B,aAAa,aAAa,OAAO,SAAS"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Clock, Effect, Option, Schema, Stream } from "effect";
|
|
2
|
+
import * as Subscription from "foldkit/subscription";
|
|
3
|
+
// src/time/ticks.ts
|
|
4
|
+
/**
|
|
5
|
+
* A clock the parent owns, as an entry: whether it ticks and how fast are
|
|
6
|
+
* functions of the parent's Model, so nothing keeps a second running flag or
|
|
7
|
+
* interval beside the state they derive from (a game's phase and score).
|
|
8
|
+
* Timer and Interval are built on it, for a clock that owns its own flag.
|
|
9
|
+
*/
|
|
10
|
+
const TickDependencies = { intervalMs: Schema.Option(Schema.Number) };
|
|
11
|
+
const checked = (intervalMs) => {
|
|
12
|
+
if (Option.isSome(intervalMs) && !(intervalMs.value > 0 && Number.isFinite(intervalMs.value))) throw new Error(`ticks: intervalMs must be positive and finite, got ${intervalMs.value}`);
|
|
13
|
+
return intervalMs;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Ticks while `intervalMs` answers `Some`, each tick one interval after the
|
|
17
|
+
* last and the first one interval after starting. A changed interval applies
|
|
18
|
+
* from the next tick, with no restart; other Model changes do nothing.
|
|
19
|
+
*/
|
|
20
|
+
const ticks = (config) => Subscription.make()((entry) => ({ ticks: entry(TickDependencies, {
|
|
21
|
+
modelToDependencies: (model) => ({ intervalMs: checked(config.intervalMs(model)) }),
|
|
22
|
+
keepAliveEquivalence: (a, b) => Option.isSome(a.intervalMs) === Option.isSome(b.intervalMs),
|
|
23
|
+
dependenciesToStream: ({ intervalMs }, readDependencies) => Option.match(intervalMs, {
|
|
24
|
+
onNone: () => Stream.empty,
|
|
25
|
+
onSome: (started) => Stream.fromEffectRepeat(Effect.suspend(() => Effect.sleep(Option.getOrElse(readDependencies().intervalMs, () => started))).pipe(Effect.andThen(Clock.currentTimeMillis), Effect.map(config.onTick)))
|
|
26
|
+
})
|
|
27
|
+
}) })).ticks;
|
|
28
|
+
export { ticks };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=ticks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticks.js","names":[],"sources":["../../src/time/ticks.ts"],"sourcesContent":["/**\n * A clock the parent owns, as an entry: whether it ticks and how fast are\n * functions of the parent's Model, so nothing keeps a second running flag or\n * interval beside the state they derive from (a game's phase and score).\n * Timer and Interval are built on it, for a clock that owns its own flag.\n */\nimport { Clock, Effect, Option, Schema, Stream } from 'effect'\nimport * as Subscription from 'foldkit/subscription'\n\nconst TickDependencies = { intervalMs: Schema.Option(Schema.Number) }\ntype TickDependencies = { readonly intervalMs: Option.Option<number> }\n\nconst checked = (intervalMs: Option.Option<number>): Option.Option<number> => {\n // A zero, negative or non-finite interval would spin or never tick; the\n // runtime crashes on a defect here, which names the mistake where it is made.\n if (Option.isSome(intervalMs) && !(intervalMs.value > 0 && Number.isFinite(intervalMs.value)))\n throw new Error(`ticks: intervalMs must be positive and finite, got ${intervalMs.value}`)\n return intervalMs\n}\n\n/**\n * Ticks while `intervalMs` answers `Some`, each tick one interval after the\n * last and the first one interval after starting. A changed interval applies\n * from the next tick, with no restart; other Model changes do nothing.\n */\nexport const ticks = <Model, Message>(config: {\n /** The time between ticks for this Model, in milliseconds; `None` stops the clock. */\n readonly intervalMs: (model: Model) => Option.Option<number>\n /** The Message a tick sends, given its time on Effect's clock. */\n readonly onTick: (at: number) => Message\n}): Subscription.Subscription<Model, Message, TickDependencies> =>\n Subscription.make<Model, Message>()(entry => ({\n ticks: entry(TickDependencies, {\n modelToDependencies: model => ({ intervalMs: checked(config.intervalMs(model)) }),\n // Stopping and starting restart the stream; a new interval does not, so\n // a clock that speeds up keeps its phase instead of ticking at once.\n keepAliveEquivalence: (a, b) => Option.isSome(a.intervalMs) === Option.isSome(b.intervalMs),\n dependenciesToStream: ({ intervalMs }, readDependencies) =>\n Option.match(intervalMs, {\n onNone: () => Stream.empty,\n onSome: started =>\n Stream.fromEffectRepeat(\n Effect.suspend(() =>\n Effect.sleep(Option.getOrElse(readDependencies().intervalMs, () => started)),\n ).pipe(Effect.andThen(Clock.currentTimeMillis), Effect.map(config.onTick)),\n ),\n }),\n }),\n })).ticks\n"],"mappings":";;;;;;;;;AASA,MAAM,mBAAmB,EAAE,YAAY,OAAO,OAAO,OAAO,MAAM,EAAE;AAGpE,MAAM,WAAW,eAA6D;CAG5E,IAAI,OAAO,OAAO,UAAU,KAAK,EAAE,WAAW,QAAQ,KAAK,OAAO,SAAS,WAAW,KAAK,IACzF,MAAM,IAAI,MAAM,sDAAsD,WAAW,OAAO;CAC1F,OAAO;AACT;;;;;;AAOA,MAAa,SAAyB,WAMpC,aAAa,KAAqB,CAAC,EAAC,WAAU,EAC5C,OAAO,MAAM,kBAAkB;CAC7B,sBAAqB,WAAU,EAAE,YAAY,QAAQ,OAAO,WAAW,KAAK,CAAC,EAAE;CAG/E,uBAAuB,GAAG,MAAM,OAAO,OAAO,EAAE,UAAU,MAAM,OAAO,OAAO,EAAE,UAAU;CAC1F,uBAAuB,EAAE,cAAc,qBACrC,OAAO,MAAM,YAAY;EACvB,cAAc,OAAO;EACrB,SAAQ,YACN,OAAO,iBACL,OAAO,cACL,OAAO,MAAM,OAAO,UAAU,iBAAiB,CAAC,CAAC,kBAAkB,OAAO,CAAC,CAC7E,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,iBAAiB,GAAG,OAAO,IAAI,OAAO,MAAM,CAAC,CAC3E;CACJ,CAAC;AACL,CAAC,EACH,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { Bundle } from "foldkit-bundle";
|
|
3
|
+
export declare const TimerModel: Schema.Struct<{
|
|
4
|
+
readonly count: Schema.Number;
|
|
5
|
+
readonly running: Schema.Boolean;
|
|
6
|
+
}>;
|
|
7
|
+
export type TimerModel = typeof TimerModel.Type;
|
|
8
|
+
export declare const TimerMessage: import("foldkit/message").MessageUnion<{
|
|
9
|
+
readonly Started: {};
|
|
10
|
+
readonly Stopped: {};
|
|
11
|
+
readonly Ticked: {};
|
|
12
|
+
}>;
|
|
13
|
+
export type TimerMessage = typeof TimerMessage.Type;
|
|
14
|
+
/**
|
|
15
|
+
* A timer as a bundle: a count in the Model, advanced by a tick stream while
|
|
16
|
+
* running. The clock is Effect's, so tests drive it with TestClock instead of
|
|
17
|
+
* waiting. For a clock whose running or interval the parent's Model decides,
|
|
18
|
+
* use the `ticks` entry instead.
|
|
19
|
+
*/
|
|
20
|
+
export declare const Timer: Bundle.Bundle<"Timer", {
|
|
21
|
+
readonly intervalMs: number;
|
|
22
|
+
}, {
|
|
23
|
+
readonly count: number;
|
|
24
|
+
readonly running: boolean;
|
|
25
|
+
}, {
|
|
26
|
+
readonly _tag: "Started";
|
|
27
|
+
} | {
|
|
28
|
+
readonly _tag: "Stopped";
|
|
29
|
+
} | {
|
|
30
|
+
readonly _tag: "Ticked";
|
|
31
|
+
}, never, never, never, void, {}, {}>;
|
|
32
|
+
//# sourceMappingURL=timer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.d.ts","names":[],"sources":["../../src/time/timer.ts"],"mappings":";;qBAKa,YAAU,OAAA;;;;YACX,oBAAoB,WAAW;qBAE9B,wCAAY;;;;;YAKb,sBAAsB,aAAa;;;;;;;qBAQlC,OAAK,OAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Option, Schema } from "effect";
|
|
2
|
+
import { defineMessageUnion } from "foldkit/message";
|
|
3
|
+
import { Bundle } from "foldkit-bundle";
|
|
4
|
+
import { ticks } from "./ticks.js";
|
|
5
|
+
// src/time/timer.ts
|
|
6
|
+
const TimerModel = Schema.Struct({
|
|
7
|
+
count: Schema.Number,
|
|
8
|
+
running: Schema.Boolean
|
|
9
|
+
});
|
|
10
|
+
const TimerMessage = defineMessageUnion({
|
|
11
|
+
Started: {},
|
|
12
|
+
Stopped: {},
|
|
13
|
+
Ticked: {}
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* A timer as a bundle: a count in the Model, advanced by a tick stream while
|
|
17
|
+
* running. The clock is Effect's, so tests drive it with TestClock instead of
|
|
18
|
+
* waiting. For a clock whose running or interval the parent's Model decides,
|
|
19
|
+
* use the `ticks` entry instead.
|
|
20
|
+
*/
|
|
21
|
+
const Timer = Bundle.make("Timer", {
|
|
22
|
+
Model: TimerModel,
|
|
23
|
+
Message: TimerMessage,
|
|
24
|
+
args: Schema.Struct({ intervalMs: Schema.Number.pipe(Schema.check(Schema.isGreaterThan(0)), Schema.check(Schema.isFinite())) }),
|
|
25
|
+
init: () => ({ model: {
|
|
26
|
+
count: 0,
|
|
27
|
+
running: false
|
|
28
|
+
} }),
|
|
29
|
+
update: (model, message) => TimerMessage.match(message, {
|
|
30
|
+
Started: () => model.running ? { model } : { model: {
|
|
31
|
+
...model,
|
|
32
|
+
running: true
|
|
33
|
+
} },
|
|
34
|
+
Stopped: () => model.running ? { model: {
|
|
35
|
+
...model,
|
|
36
|
+
running: false
|
|
37
|
+
} } : { model },
|
|
38
|
+
Ticked: () => ({ model: {
|
|
39
|
+
...model,
|
|
40
|
+
count: model.count + 1
|
|
41
|
+
} })
|
|
42
|
+
}),
|
|
43
|
+
subscriptions: ({ intervalMs }) => ({ ticks: ticks({
|
|
44
|
+
intervalMs: (model) => model.running ? Option.some(intervalMs) : Option.none(),
|
|
45
|
+
onTick: () => TimerMessage.Ticked()
|
|
46
|
+
}) })
|
|
47
|
+
});
|
|
48
|
+
export { Timer, TimerMessage, TimerModel };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.js","names":[],"sources":["../../src/time/timer.ts"],"sourcesContent":["import { Option, Schema } from 'effect'\nimport { defineMessageUnion } from 'foldkit/message'\nimport { Bundle } from 'foldkit-bundle'\nimport { ticks } from './ticks.js'\n\nexport const TimerModel = Schema.Struct({ count: Schema.Number, running: Schema.Boolean })\nexport type TimerModel = typeof TimerModel.Type\n\nexport const TimerMessage = defineMessageUnion({\n Started: {},\n Stopped: {},\n Ticked: {},\n})\nexport type TimerMessage = typeof TimerMessage.Type\n\n/**\n * A timer as a bundle: a count in the Model, advanced by a tick stream while\n * running. The clock is Effect's, so tests drive it with TestClock instead of\n * waiting. For a clock whose running or interval the parent's Model decides,\n * use the `ticks` entry instead.\n */\nexport const Timer = Bundle.make('Timer', {\n Model: TimerModel,\n Message: TimerMessage,\n args: Schema.Struct({\n intervalMs: Schema.Number.pipe(\n Schema.check(Schema.isGreaterThan(0)),\n Schema.check(Schema.isFinite()),\n ),\n }),\n init: () => ({ model: { count: 0, running: false } }),\n update: (model, message) =>\n TimerMessage.match(message, {\n Started: () => (model.running ? { model } : { model: { ...model, running: true } }),\n Stopped: () => (model.running ? { model: { ...model, running: false } } : { model }),\n Ticked: () => ({ model: { ...model, count: model.count + 1 } }),\n }),\n subscriptions: ({ intervalMs }) => ({\n ticks: ticks<TimerModel, TimerMessage>({\n intervalMs: model => (model.running ? Option.some(intervalMs) : Option.none()),\n onTick: () => TimerMessage.Ticked(),\n }),\n }),\n})\n"],"mappings":";;;;;AAKA,MAAa,aAAa,OAAO,OAAO;CAAE,OAAO,OAAO;CAAQ,SAAS,OAAO;AAAQ,CAAC;AAGzF,MAAa,eAAe,mBAAmB;CAC7C,SAAS,CAAC;CACV,SAAS,CAAC;CACV,QAAQ,CAAC;AACX,CAAC;;;;;;;AASD,MAAa,QAAQ,OAAO,KAAK,SAAS;CACxC,OAAO;CACP,SAAS;CACT,MAAM,OAAO,OAAO,EAClB,YAAY,OAAO,OAAO,KACxB,OAAO,MAAM,OAAO,cAAc,CAAC,CAAC,GACpC,OAAO,MAAM,OAAO,SAAS,CAAC,CAChC,EACF,CAAC;CACD,aAAa,EAAE,OAAO;EAAE,OAAO;EAAG,SAAS;CAAM,EAAE;CACnD,SAAS,OAAO,YACd,aAAa,MAAM,SAAS;EAC1B,eAAgB,MAAM,UAAU,EAAE,MAAM,IAAI,EAAE,OAAO;GAAE,GAAG;GAAO,SAAS;EAAK,EAAE;EACjF,eAAgB,MAAM,UAAU,EAAE,OAAO;GAAE,GAAG;GAAO,SAAS;EAAM,EAAE,IAAI,EAAE,MAAM;EAClF,eAAe,EAAE,OAAO;GAAE,GAAG;GAAO,OAAO,MAAM,QAAQ;EAAE,EAAE;CAC/D,CAAC;CACH,gBAAgB,EAAE,kBAAkB,EAClC,OAAO,MAAgC;EACrC,aAAY,UAAU,MAAM,UAAU,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK;EAC5E,cAAc,aAAa,OAAO;CACpC,CAAC,EACH;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "foldkit-primitives",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Ready-made primitives for the Elm architecture, packaged with foldkit-bundle: media queries, presence, timers, pagination, history, sockets, observers, clipboard, and interaction Bundles with their Behaviors.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"foldkit",
|
|
@@ -28,58 +28,58 @@
|
|
|
28
28
|
"exports": {
|
|
29
29
|
".": {
|
|
30
30
|
"foldkit-plus:source": "./src/index.ts",
|
|
31
|
-
"types": "./dist/index.d.
|
|
32
|
-
"import": "./dist/index.
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js"
|
|
33
33
|
},
|
|
34
34
|
"./dom": {
|
|
35
35
|
"foldkit-plus:source": "./src/dom/index.ts",
|
|
36
|
-
"types": "./dist/dom/index.d.
|
|
37
|
-
"import": "./dist/dom/index.
|
|
36
|
+
"types": "./dist/dom/index.d.ts",
|
|
37
|
+
"import": "./dist/dom/index.js"
|
|
38
38
|
},
|
|
39
39
|
"./device": {
|
|
40
40
|
"foldkit-plus:source": "./src/device/index.ts",
|
|
41
|
-
"types": "./dist/device/index.d.
|
|
42
|
-
"import": "./dist/device/index.
|
|
41
|
+
"types": "./dist/device/index.d.ts",
|
|
42
|
+
"import": "./dist/device/index.js"
|
|
43
43
|
},
|
|
44
44
|
"./events": {
|
|
45
45
|
"foldkit-plus:source": "./src/events/index.ts",
|
|
46
|
-
"types": "./dist/events/index.d.
|
|
47
|
-
"import": "./dist/events/index.
|
|
46
|
+
"types": "./dist/events/index.d.ts",
|
|
47
|
+
"import": "./dist/events/index.js"
|
|
48
48
|
},
|
|
49
49
|
"./interaction": {
|
|
50
50
|
"foldkit-plus:source": "./src/interaction/index.ts",
|
|
51
|
-
"types": "./dist/interaction/index.d.
|
|
52
|
-
"import": "./dist/interaction/index.
|
|
51
|
+
"types": "./dist/interaction/index.d.ts",
|
|
52
|
+
"import": "./dist/interaction/index.js"
|
|
53
53
|
},
|
|
54
54
|
"./media": {
|
|
55
55
|
"foldkit-plus:source": "./src/media/index.ts",
|
|
56
|
-
"types": "./dist/media/index.d.
|
|
57
|
-
"import": "./dist/media/index.
|
|
56
|
+
"types": "./dist/media/index.d.ts",
|
|
57
|
+
"import": "./dist/media/index.js"
|
|
58
58
|
},
|
|
59
59
|
"./motion": {
|
|
60
60
|
"foldkit-plus:source": "./src/motion/index.ts",
|
|
61
|
-
"types": "./dist/motion/index.d.
|
|
62
|
-
"import": "./dist/motion/index.
|
|
61
|
+
"types": "./dist/motion/index.d.ts",
|
|
62
|
+
"import": "./dist/motion/index.js"
|
|
63
63
|
},
|
|
64
64
|
"./net": {
|
|
65
65
|
"foldkit-plus:source": "./src/net/index.ts",
|
|
66
|
-
"types": "./dist/net/index.d.
|
|
67
|
-
"import": "./dist/net/index.
|
|
66
|
+
"types": "./dist/net/index.d.ts",
|
|
67
|
+
"import": "./dist/net/index.js"
|
|
68
68
|
},
|
|
69
69
|
"./observers": {
|
|
70
70
|
"foldkit-plus:source": "./src/observers/index.ts",
|
|
71
|
-
"types": "./dist/observers/index.d.
|
|
72
|
-
"import": "./dist/observers/index.
|
|
71
|
+
"types": "./dist/observers/index.d.ts",
|
|
72
|
+
"import": "./dist/observers/index.js"
|
|
73
73
|
},
|
|
74
74
|
"./state": {
|
|
75
75
|
"foldkit-plus:source": "./src/state/index.ts",
|
|
76
|
-
"types": "./dist/state/index.d.
|
|
77
|
-
"import": "./dist/state/index.
|
|
76
|
+
"types": "./dist/state/index.d.ts",
|
|
77
|
+
"import": "./dist/state/index.js"
|
|
78
78
|
},
|
|
79
79
|
"./time": {
|
|
80
80
|
"foldkit-plus:source": "./src/time/index.ts",
|
|
81
|
-
"types": "./dist/time/index.d.
|
|
82
|
-
"import": "./dist/time/index.
|
|
81
|
+
"types": "./dist/time/index.d.ts",
|
|
82
|
+
"import": "./dist/time/index.js"
|
|
83
83
|
},
|
|
84
84
|
"./package.json": "./package.json"
|
|
85
85
|
},
|
|
@@ -89,23 +89,23 @@
|
|
|
89
89
|
"LICENSE"
|
|
90
90
|
],
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"foldkit-bundle": "0.
|
|
92
|
+
"foldkit-bundle": "0.9.0"
|
|
93
93
|
},
|
|
94
94
|
"peerDependencies": {
|
|
95
|
-
"effect": "^4.
|
|
96
|
-
"foldkit": "^0.
|
|
97
|
-
"foldkit-mixins": "^0.
|
|
95
|
+
"effect": "^4.1.0",
|
|
96
|
+
"foldkit": "^0.170.0",
|
|
97
|
+
"foldkit-mixins": "^0.21.0"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
|
-
"@effect/platform-browser": "^4.0
|
|
100
|
+
"@effect/platform-browser": "^4.1.0",
|
|
101
101
|
"@types/ws": "^8.18.2",
|
|
102
|
-
"effect": "^4.0
|
|
103
|
-
"foldkit": "0.
|
|
102
|
+
"effect": "^4.1.0",
|
|
103
|
+
"foldkit": "0.170.0",
|
|
104
104
|
"jsdom": "30.1.3",
|
|
105
105
|
"tsdown": "^0.23.1",
|
|
106
106
|
"typescript": "7.0.2",
|
|
107
107
|
"ws": "^8.22.0",
|
|
108
|
-
"foldkit-mixins": "0.
|
|
108
|
+
"foldkit-mixins": "0.21.0"
|
|
109
109
|
},
|
|
110
110
|
"peerDependenciesMeta": {
|
|
111
111
|
"foldkit-mixins": {
|