State.res.mjs
1// Generated by ReScript, PLEASE EDIT WITH CARE
2
3import * as Log from "./utils/Log.res.mjs";
4import * as Yjs from "yjs";
5import * as Debounce from "./utils/Debounce.res.mjs";
6import * as Waypoint from "./ffi/Waypoint.res.mjs";
7import * as Signals from "@preact/signals";
8import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
9
10let waypoints = new Map();
11
12let docs = new Map();
13
14let center = Signals.signal([
15 0,
16 0
17]);
18
19let zoom = Signals.signal(0);
20
21let content = Signals.signal(undefined);
22
23let readonly = Signals.signal(false);
24
25let user = Signals.signal(undefined);
26
27function getOrCreateWaypointsSignal(docID) {
28 let signal = waypoints.get(docID);
29 if (signal !== undefined) {
30 return Primitive_option.valFromOption(signal);
31 }
32 let signal$1 = Signals.signal([]);
33 waypoints.set(docID, signal$1);
34 return signal$1;
35}
36
37let cache = new Map();
38
39function get(docID) {
40 return cache.get(docID);
41}
42
43function set(docID, editor) {
44 cache.set(docID, editor);
45}
46
47let Editor = {
48 cache: cache,
49 get: get,
50 set: set
51};
52
53let timeoutHandles = new Map();
54
55let pendingEditors = new Map();
56
57function trigger(docID, editor) {
58 let handle = timeoutHandles.get(docID);
59 if (handle !== undefined) {
60 Debounce.cancel(handle);
61 timeoutHandles.delete(docID);
62 }
63 pendingEditors.set(docID, editor);
64 let waypointsSignal = getOrCreateWaypointsSignal(docID);
65 let handle$1 = Debounce.make(() => {
66 timeoutHandles.delete(docID);
67 let ed = pendingEditors.get(docID);
68 if (ed !== undefined) {
69 Log.debug("WaypointUpdater: extracting waypoints after debounce", {
70 doc: docID
71 });
72 let docJson = Primitive_option.valFromOption(ed).getJSON();
73 let waypoints = Waypoint.extractFromDocument(docJson);
74 waypointsSignal.value = waypoints;
75 Log.debug("WaypointUpdater: updated waypoints", {
76 doc: docID,
77 count: waypoints.length.toString()
78 });
79 }
80 pendingEditors.delete(docID);
81 }, 1000);
82 timeoutHandles.set(docID, handle$1);
83}
84
85let WaypointUpdater = {
86 debounceMs: 1000,
87 timeoutHandles: timeoutHandles,
88 pendingEditors: pendingEditors,
89 trigger: trigger
90};
91
92function getOrCreateYjsDoc(docID) {
93 let ydoc = docs.get(docID);
94 if (ydoc !== undefined) {
95 return Primitive_option.valFromOption(ydoc);
96 }
97 let ydoc$1 = new Yjs.Doc();
98 docs.set(docID, ydoc$1);
99 Log.debug("State: Created new Yjs doc", {
100 doc: docID
101 });
102 return ydoc$1;
103}
104
105let ysweetStatus = Signals.signal("Offline");
106
107export {
108 waypoints,
109 docs,
110 center,
111 zoom,
112 content,
113 readonly,
114 user,
115 getOrCreateWaypointsSignal,
116 Editor,
117 WaypointUpdater,
118 getOrCreateYjsDoc,
119 ysweetStatus,
120}
121/* waypoints Not a pure module */