Y.res
1// src/ffi/Y.res
2// FFI bindings for Yjs CRDT library (read-only)
3
4module Doc = {
5 type t
6
7 type transaction
8 type event = {
9 tr: transaction,
10 doc: t,
11 }
12
13 @send
14 external on: (t, string, event => unit) => unit = "on"
15
16 let onAfterTransaction = (doc, handler) => {
17 on(doc, "afterTransaction", handler)
18 }
19
20 @module("yjs") @new
21 external make: unit => t = "Doc"
22}
23
24module Text = {
25 type t
26
27 @send
28 external get: (Doc.t, string) => t = "getText"
29
30 @send
31 external toString: t => string = "toString"
32}
33
34module Array = {
35 type t
36
37 @send
38 external get: (Doc.t, string) => t = "getArray"
39
40 @send
41 external toJSON: t => array<JSON.t> = "toJSON"
42
43 // Yjs observe event type
44 type rec observeEvent = {
45 changes: changes,
46 }
47 and changes = {
48 delta: array<deltaItem>,
49 }
50 and deltaItem = {
51 insert?: array<JSON.t>,
52 delete?: int,
53 retain?: int,
54 }
55
56 @send
57 external observe: (t, observeEvent => unit) => unit = "observe"
58}
59
60module Map = {
61 type t
62
63 @send
64 external get: (Doc.t, string) => t = "getMap"
65
66 @send
67 external toJSON: t => JSON.t = "toJSON"
68}