@vielzeug/flux 1.0.3

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.
Files changed (122) hide show
  1. package/README.md +50 -0
  2. package/dist/_dev.cjs +2 -0
  3. package/dist/_dev.cjs.map +1 -0
  4. package/dist/_dev.d.ts +2 -0
  5. package/dist/_dev.d.ts.map +1 -0
  6. package/dist/_dev.js +12 -0
  7. package/dist/_dev.js.map +1 -0
  8. package/dist/_iterator.cjs +2 -0
  9. package/dist/_iterator.cjs.map +1 -0
  10. package/dist/_iterator.d.ts +2 -0
  11. package/dist/_iterator.d.ts.map +1 -0
  12. package/dist/_iterator.js +53 -0
  13. package/dist/_iterator.js.map +1 -0
  14. package/dist/_numeric.cjs +2 -0
  15. package/dist/_numeric.cjs.map +1 -0
  16. package/dist/_numeric.d.ts +2 -0
  17. package/dist/_numeric.d.ts.map +1 -0
  18. package/dist/_numeric.js +12 -0
  19. package/dist/_numeric.js.map +1 -0
  20. package/dist/_pipe.cjs +2 -0
  21. package/dist/_pipe.cjs.map +1 -0
  22. package/dist/_pipe.d.ts +2 -0
  23. package/dist/_pipe.d.ts.map +1 -0
  24. package/dist/_pipe.js +8 -0
  25. package/dist/_pipe.js.map +1 -0
  26. package/dist/_safe.cjs +2 -0
  27. package/dist/_safe.cjs.map +1 -0
  28. package/dist/_safe.d.ts +2 -0
  29. package/dist/_safe.d.ts.map +1 -0
  30. package/dist/_safe.js +12 -0
  31. package/dist/_safe.js.map +1 -0
  32. package/dist/_scheduler.cjs +2 -0
  33. package/dist/_scheduler.cjs.map +1 -0
  34. package/dist/_scheduler.d.ts +3 -0
  35. package/dist/_scheduler.d.ts.map +1 -0
  36. package/dist/_scheduler.js +15 -0
  37. package/dist/_scheduler.js.map +1 -0
  38. package/dist/adapters/courier.cjs +2 -0
  39. package/dist/adapters/courier.cjs.map +1 -0
  40. package/dist/adapters/courier.d.ts +22 -0
  41. package/dist/adapters/courier.d.ts.map +1 -0
  42. package/dist/adapters/courier.js +14 -0
  43. package/dist/adapters/courier.js.map +1 -0
  44. package/dist/adapters/herald.cjs +2 -0
  45. package/dist/adapters/herald.cjs.map +1 -0
  46. package/dist/adapters/herald.d.ts +19 -0
  47. package/dist/adapters/herald.d.ts.map +1 -0
  48. package/dist/adapters/herald.js +18 -0
  49. package/dist/adapters/herald.js.map +1 -0
  50. package/dist/adapters/pulse.cjs +2 -0
  51. package/dist/adapters/pulse.cjs.map +1 -0
  52. package/dist/adapters/pulse.d.ts +22 -0
  53. package/dist/adapters/pulse.d.ts.map +1 -0
  54. package/dist/adapters/pulse.js +22 -0
  55. package/dist/adapters/pulse.js.map +1 -0
  56. package/dist/adapters/ripple.cjs +2 -0
  57. package/dist/adapters/ripple.cjs.map +1 -0
  58. package/dist/adapters/ripple.d.ts +53 -0
  59. package/dist/adapters/ripple.d.ts.map +1 -0
  60. package/dist/adapters/ripple.js +47 -0
  61. package/dist/adapters/ripple.js.map +1 -0
  62. package/dist/core.cjs +2 -0
  63. package/dist/core.cjs.map +1 -0
  64. package/dist/core.d.ts +17 -0
  65. package/dist/core.d.ts.map +1 -0
  66. package/dist/core.js +87 -0
  67. package/dist/core.js.map +1 -0
  68. package/dist/errors.cjs +2 -0
  69. package/dist/errors.cjs.map +1 -0
  70. package/dist/errors.d.ts +10 -0
  71. package/dist/errors.d.ts.map +1 -0
  72. package/dist/errors.js +18 -0
  73. package/dist/errors.js.map +1 -0
  74. package/dist/flux.cjs +2 -0
  75. package/dist/flux.cjs.map +1 -0
  76. package/dist/flux.iife.js +2 -0
  77. package/dist/flux.iife.js.map +1 -0
  78. package/dist/flux.js +2 -0
  79. package/dist/flux.js.map +1 -0
  80. package/dist/index.cjs +1 -0
  81. package/dist/index.d.ts +17 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +14 -0
  84. package/dist/operators/combination.cjs +2 -0
  85. package/dist/operators/combination.cjs.map +1 -0
  86. package/dist/operators/combination.d.ts +65 -0
  87. package/dist/operators/combination.d.ts.map +1 -0
  88. package/dist/operators/combination.js +187 -0
  89. package/dist/operators/combination.js.map +1 -0
  90. package/dist/operators/creation.cjs +2 -0
  91. package/dist/operators/creation.cjs.map +1 -0
  92. package/dist/operators/creation.d.ts +50 -0
  93. package/dist/operators/creation.d.ts.map +1 -0
  94. package/dist/operators/creation.js +90 -0
  95. package/dist/operators/creation.js.map +1 -0
  96. package/dist/operators/filtering.cjs +2 -0
  97. package/dist/operators/filtering.cjs.map +1 -0
  98. package/dist/operators/filtering.d.ts +62 -0
  99. package/dist/operators/filtering.d.ts.map +1 -0
  100. package/dist/operators/filtering.js +140 -0
  101. package/dist/operators/filtering.js.map +1 -0
  102. package/dist/operators/transformation.cjs +2 -0
  103. package/dist/operators/transformation.cjs.map +1 -0
  104. package/dist/operators/transformation.d.ts +64 -0
  105. package/dist/operators/transformation.d.ts.map +1 -0
  106. package/dist/operators/transformation.js +185 -0
  107. package/dist/operators/transformation.js.map +1 -0
  108. package/dist/operators/utility.cjs +2 -0
  109. package/dist/operators/utility.cjs.map +1 -0
  110. package/dist/operators/utility.d.ts +98 -0
  111. package/dist/operators/utility.d.ts.map +1 -0
  112. package/dist/operators/utility.js +226 -0
  113. package/dist/operators/utility.js.map +1 -0
  114. package/dist/subject.cjs +2 -0
  115. package/dist/subject.cjs.map +1 -0
  116. package/dist/subject.d.ts +67 -0
  117. package/dist/subject.d.ts.map +1 -0
  118. package/dist/subject.js +181 -0
  119. package/dist/subject.js.map +1 -0
  120. package/dist/types.d.ts +86 -0
  121. package/dist/types.d.ts.map +1 -0
  122. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # @vielzeug/flux
2
+
3
+ Composable stream primitive with hot/cold semantics, backpressure, and adapters for the vielzeug ecosystem.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ pnpm add @vielzeug/flux
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```ts
14
+ import { flux, merge, fromBus, fromSignal, debounce, toSignal } from '@vielzeug/flux';
15
+
16
+ // Cold stream — each subscriber gets its own producer
17
+ const count$ = flux<number>((observer) => {
18
+ let i = 0;
19
+ const id = setInterval(() => observer.next(i++), 1000);
20
+ return () => clearInterval(id);
21
+ });
22
+
23
+ // Compose with operators
24
+ const even$ = count$.pipe(
25
+ filter((n) => n % 2 === 0),
26
+ map((n) => n * 2),
27
+ );
28
+
29
+ // Bridge to ripple signal
30
+ const latest = toSignal(even$, { initial: 0 });
31
+
32
+ // Merge ecosystem sources
33
+ const messages = toSignal(
34
+ merge(fromPulse(pulse, 'chat:message'), fromBus(localBus, 'draft')).pipe(debounce(100)),
35
+ { initial: [] },
36
+ );
37
+ ```
38
+
39
+ ## Adapters
40
+
41
+ ```ts
42
+ import { fromSignal, toSignal } from '@vielzeug/flux'; // ripple
43
+ import { fromBus, toBus } from '@vielzeug/flux'; // herald
44
+ import { fromPulse, fromPresence } from '@vielzeug/flux'; // pulse
45
+ import { fromSse, fromQuery } from '@vielzeug/flux'; // courier
46
+ ```
47
+
48
+ ## License
49
+
50
+ MIT
package/dist/_dev.cjs ADDED
@@ -0,0 +1,2 @@
1
+ var e=!globalThis.__FLUX_PROD__;function t(t){e&&console.warn(`[@vielzeug/flux] ${t}`)}function n(t,...n){e&&console.error(`[@vielzeug/flux] ${t}`,...n)}exports.error=n,exports.warn=t;
2
+ //# sourceMappingURL=_dev.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/**\n * Set to `true` by the Vite `define` config in production builds so that all\n * dev-only `warn()` / `error()` calls are eliminated by the bundler.\n * When running tests or without a bundler the flag is absent and warnings fire.\n */\nconst isDev = !(globalThis as { __FLUX_PROD__?: boolean }).__FLUX_PROD__;\n\n/** @internal @security Messages may include user data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/flux] ${msg}`);\n}\n\n/** @internal @security Messages and args may include user data. */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/flux] ${msg}`, ...args);\n}\n"],"mappings":"AAKA,IAAM,EAAQ,CAAE,WAA2C,cAG3D,SAAgB,EAAK,EAAmB,CAClC,GAAO,QAAQ,KAAK,oBAAoB,GAAK,CACnD,CAGA,SAAgB,EAAM,EAAa,GAAG,EAAuB,CACvD,GAAO,QAAQ,MAAM,oBAAoB,IAAO,GAAG,CAAI,CAC7D"}
package/dist/_dev.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dev.d.ts","sourceRoot":"","sources":["../src/_dev.ts"],"names":[],"mappings":""}
package/dist/_dev.js ADDED
@@ -0,0 +1,12 @@
1
+ //#region src/_dev.ts
2
+ var e = !globalThis.__FLUX_PROD__;
3
+ function t(t) {
4
+ e && console.warn(`[@vielzeug/flux] ${t}`);
5
+ }
6
+ function n(t, ...n) {
7
+ e && console.error(`[@vielzeug/flux] ${t}`, ...n);
8
+ }
9
+ //#endregion
10
+ export { n as error, t as warn };
11
+
12
+ //# sourceMappingURL=_dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/**\n * Set to `true` by the Vite `define` config in production builds so that all\n * dev-only `warn()` / `error()` calls are eliminated by the bundler.\n * When running tests or without a bundler the flag is absent and warnings fire.\n */\nconst isDev = !(globalThis as { __FLUX_PROD__?: boolean }).__FLUX_PROD__;\n\n/** @internal @security Messages may include user data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/flux] ${msg}`);\n}\n\n/** @internal @security Messages and args may include user data. */\nexport function error(msg: string, ...args: unknown[]): void {\n if (isDev) console.error(`[@vielzeug/flux] ${msg}`, ...args);\n}\n"],"mappings":";AAKA,IAAM,IAAQ,CAAE,WAA2C;AAG3D,SAAgB,EAAK,GAAmB;CACtC,AAAI,KAAO,QAAQ,KAAK,oBAAoB,GAAK;AACnD;AAGA,SAAgB,EAAM,GAAa,GAAG,GAAuB;CAC3D,AAAI,KAAO,QAAQ,MAAM,oBAAoB,KAAO,GAAG,CAAI;AAC7D"}
@@ -0,0 +1,2 @@
1
+ const e=require("./_dev.cjs");var t=1e4;function n(n){let r=[],i=[],a=!1,o=!1,s={done:!0,value:void 0},c=n({complete(){a=!0,l()},error(e){a=!0,i.length>0?(i.shift().reject(e),l()):r.push({__err:e})},next(n){let a={done:!1,value:n};if(i.length>0){i.shift().resolve(a);return}r.length>=t&&(r.shift(),o||(o=!0,e.warn(`async iterator buffer exceeded ${t} queued values — dropping the oldest. The consumer is falling behind the producer; throttle the source or drain the iterator faster.`))),r.push(a)}});function l(){for(;i.length>0;)i.shift().resolve(s)}let u={next(){if(r.length>0){let e=r.shift();return`__err`in e?Promise.reject(e.__err):Promise.resolve(e)}return a?Promise.resolve(s):new Promise((e,t)=>i.push({reject:t,resolve:e}))},return(){return a||(c(),a=!0,l()),Promise.resolve(s)},[Symbol.asyncIterator](){return u}};return u}exports.makeAsyncIterator=n;
2
+ //# sourceMappingURL=_iterator.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_iterator.cjs","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import type { Observer, Unsubscribe } from './types';\n\nimport { warn } from './_dev';\n\ntype QueueItem<T> = IteratorResult<T> | { readonly __err: unknown };\n\n/**\n * Upper bound on the internal buffer before values are dropped (oldest first).\n * Protects against unbounded memory growth when a producer emits faster than the\n * `for await` consumer drains the iterator.\n */\nconst MAX_QUEUE_SIZE = 10_000;\n\n/**\n * Creates an `AsyncIterator<T>` backed by a subscribe function.\n * Buffers incoming values until consumed; cancels the subscription on `return()`.\n * Drops the oldest buffered value (with a one-time dev warning) if the buffer exceeds\n * `MAX_QUEUE_SIZE` — see `MAX_QUEUE_SIZE`.\n * @internal\n */\nexport function makeAsyncIterator<T>(subscribe: (observer: Observer<T>) => Unsubscribe): AsyncIterableIterator<T> {\n const queue: QueueItem<T>[] = [];\n const pending: Array<{\n reject: (e: unknown) => void;\n resolve: (r: IteratorResult<T>) => void;\n }> = [];\n let done = false;\n let warnedOverflow = false;\n\n const DONE_RESULT: IteratorResult<T> = { done: true, value: undefined as T };\n\n const unsub = subscribe({\n complete() {\n done = true;\n drainPending();\n },\n error(err) {\n done = true;\n\n if (pending.length > 0) {\n pending.shift()!.reject(err);\n drainPending();\n } else {\n queue.push({ __err: err });\n }\n },\n next(v) {\n const item: IteratorResult<T> = { done: false, value: v };\n\n if (pending.length > 0) {\n pending.shift()!.resolve(item);\n\n return;\n }\n\n if (queue.length >= MAX_QUEUE_SIZE) {\n queue.shift();\n\n if (!warnedOverflow) {\n warnedOverflow = true;\n warn(\n `async iterator buffer exceeded ${MAX_QUEUE_SIZE} queued values — dropping the oldest. ` +\n 'The consumer is falling behind the producer; throttle the source or drain the iterator faster.',\n );\n }\n }\n\n queue.push(item);\n },\n });\n\n function drainPending(): void {\n while (pending.length > 0) {\n pending.shift()!.resolve(DONE_RESULT);\n }\n }\n\n const iterator = {\n next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n const item = queue.shift()!;\n\n if ('__err' in item) return Promise.reject((item as { __err: unknown }).__err);\n\n return Promise.resolve(item as IteratorResult<T>);\n }\n\n if (done) return Promise.resolve(DONE_RESULT);\n\n return new Promise<IteratorResult<T>>((resolve, reject) => pending.push({ reject, resolve }));\n },\n return(): Promise<IteratorResult<T>> {\n if (!done) {\n unsub();\n done = true;\n drainPending();\n }\n\n return Promise.resolve(DONE_RESULT);\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n"],"mappings":"8BAWA,IAAM,EAAiB,IASvB,SAAgB,EAAqB,EAA6E,CAChH,IAAM,EAAwB,CAAC,EACzB,EAGD,CAAC,EACF,EAAO,GACP,EAAiB,GAEf,EAAiC,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,EAErE,EAAQ,EAAU,CACtB,UAAW,CACT,EAAO,GACP,EAAa,CACf,EACA,MAAM,EAAK,CACT,EAAO,GAEH,EAAQ,OAAS,GACnB,EAAQ,MAAM,CAAC,CAAE,OAAO,CAAG,EAC3B,EAAa,GAEb,EAAM,KAAK,CAAE,MAAO,CAAI,CAAC,CAE7B,EACA,KAAK,EAAG,CACN,IAAM,EAA0B,CAAE,KAAM,GAAO,MAAO,CAAE,EAExD,GAAI,EAAQ,OAAS,EAAG,CACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAI,EAE7B,MACF,CAEI,EAAM,QAAU,IAClB,EAAM,MAAM,EAEP,IACH,EAAiB,GACjB,EAAA,KACE,kCAAkC,EAAe,qIAEnD,IAIJ,EAAM,KAAK,CAAI,CACjB,CACF,CAAC,EAED,SAAS,GAAqB,CAC5B,KAAO,EAAQ,OAAS,GACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAW,CAExC,CAEA,IAAM,EAAW,CACf,MAAmC,CACjC,GAAI,EAAM,OAAS,EAAG,CACpB,IAAM,EAAO,EAAM,MAAM,EAIzB,MAFI,UAAW,EAAa,QAAQ,OAAQ,EAA4B,KAAK,EAEtE,QAAQ,QAAQ,CAAyB,CAClD,CAIA,OAFI,EAAa,QAAQ,QAAQ,CAAW,EAErC,IAAI,SAA4B,EAAS,IAAW,EAAQ,KAAK,CAAE,SAAQ,SAAQ,CAAC,CAAC,CAC9F,EACA,QAAqC,CAOnC,OANK,IACH,EAAM,EACN,EAAO,GACP,EAAa,GAGR,QAAQ,QAAQ,CAAW,CACpC,EACA,CAAC,OAAO,gBAA2C,CACjD,OAAO,CACT,CACF,EAEA,OAAO,CACT"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_iterator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_iterator.d.ts","sourceRoot":"","sources":["../src/_iterator.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { warn as e } from "./_dev.js";
2
+ //#region src/_iterator.ts
3
+ var t = 1e4;
4
+ function n(n) {
5
+ let r = [], i = [], a = !1, o = !1, s = {
6
+ done: !0,
7
+ value: void 0
8
+ }, c = n({
9
+ complete() {
10
+ a = !0, l();
11
+ },
12
+ error(e) {
13
+ a = !0, i.length > 0 ? (i.shift().reject(e), l()) : r.push({ __err: e });
14
+ },
15
+ next(n) {
16
+ let a = {
17
+ done: !1,
18
+ value: n
19
+ };
20
+ if (i.length > 0) {
21
+ i.shift().resolve(a);
22
+ return;
23
+ }
24
+ r.length >= t && (r.shift(), o || (o = !0, e(`async iterator buffer exceeded ${t} queued values — dropping the oldest. The consumer is falling behind the producer; throttle the source or drain the iterator faster.`))), r.push(a);
25
+ }
26
+ });
27
+ function l() {
28
+ for (; i.length > 0;) i.shift().resolve(s);
29
+ }
30
+ let u = {
31
+ next() {
32
+ if (r.length > 0) {
33
+ let e = r.shift();
34
+ return "__err" in e ? Promise.reject(e.__err) : Promise.resolve(e);
35
+ }
36
+ return a ? Promise.resolve(s) : new Promise((e, t) => i.push({
37
+ reject: t,
38
+ resolve: e
39
+ }));
40
+ },
41
+ return() {
42
+ return a || (c(), a = !0, l()), Promise.resolve(s);
43
+ },
44
+ [Symbol.asyncIterator]() {
45
+ return u;
46
+ }
47
+ };
48
+ return u;
49
+ }
50
+ //#endregion
51
+ export { n as makeAsyncIterator };
52
+
53
+ //# sourceMappingURL=_iterator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_iterator.js","names":[],"sources":["../src/_iterator.ts"],"sourcesContent":["import type { Observer, Unsubscribe } from './types';\n\nimport { warn } from './_dev';\n\ntype QueueItem<T> = IteratorResult<T> | { readonly __err: unknown };\n\n/**\n * Upper bound on the internal buffer before values are dropped (oldest first).\n * Protects against unbounded memory growth when a producer emits faster than the\n * `for await` consumer drains the iterator.\n */\nconst MAX_QUEUE_SIZE = 10_000;\n\n/**\n * Creates an `AsyncIterator<T>` backed by a subscribe function.\n * Buffers incoming values until consumed; cancels the subscription on `return()`.\n * Drops the oldest buffered value (with a one-time dev warning) if the buffer exceeds\n * `MAX_QUEUE_SIZE` — see `MAX_QUEUE_SIZE`.\n * @internal\n */\nexport function makeAsyncIterator<T>(subscribe: (observer: Observer<T>) => Unsubscribe): AsyncIterableIterator<T> {\n const queue: QueueItem<T>[] = [];\n const pending: Array<{\n reject: (e: unknown) => void;\n resolve: (r: IteratorResult<T>) => void;\n }> = [];\n let done = false;\n let warnedOverflow = false;\n\n const DONE_RESULT: IteratorResult<T> = { done: true, value: undefined as T };\n\n const unsub = subscribe({\n complete() {\n done = true;\n drainPending();\n },\n error(err) {\n done = true;\n\n if (pending.length > 0) {\n pending.shift()!.reject(err);\n drainPending();\n } else {\n queue.push({ __err: err });\n }\n },\n next(v) {\n const item: IteratorResult<T> = { done: false, value: v };\n\n if (pending.length > 0) {\n pending.shift()!.resolve(item);\n\n return;\n }\n\n if (queue.length >= MAX_QUEUE_SIZE) {\n queue.shift();\n\n if (!warnedOverflow) {\n warnedOverflow = true;\n warn(\n `async iterator buffer exceeded ${MAX_QUEUE_SIZE} queued values — dropping the oldest. ` +\n 'The consumer is falling behind the producer; throttle the source or drain the iterator faster.',\n );\n }\n }\n\n queue.push(item);\n },\n });\n\n function drainPending(): void {\n while (pending.length > 0) {\n pending.shift()!.resolve(DONE_RESULT);\n }\n }\n\n const iterator = {\n next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n const item = queue.shift()!;\n\n if ('__err' in item) return Promise.reject((item as { __err: unknown }).__err);\n\n return Promise.resolve(item as IteratorResult<T>);\n }\n\n if (done) return Promise.resolve(DONE_RESULT);\n\n return new Promise<IteratorResult<T>>((resolve, reject) => pending.push({ reject, resolve }));\n },\n return(): Promise<IteratorResult<T>> {\n if (!done) {\n unsub();\n done = true;\n drainPending();\n }\n\n return Promise.resolve(DONE_RESULT);\n },\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n"],"mappings":";;AAWA,IAAM,IAAiB;AASvB,SAAgB,EAAqB,GAA6E;CAChH,IAAM,IAAwB,CAAC,GACzB,IAGD,CAAC,GACF,IAAO,IACP,IAAiB,IAEf,IAAiC;EAAE,MAAM;EAAM,OAAO,KAAA;CAAe,GAErE,IAAQ,EAAU;EACtB,WAAW;GAET,AADA,IAAO,IACP,EAAa;EACf;EACA,MAAM,GAAK;GAGT,AAFA,IAAO,IAEH,EAAQ,SAAS,KACnB,EAAQ,MAAM,CAAC,CAAE,OAAO,CAAG,GAC3B,EAAa,KAEb,EAAM,KAAK,EAAE,OAAO,EAAI,CAAC;EAE7B;EACA,KAAK,GAAG;GACN,IAAM,IAA0B;IAAE,MAAM;IAAO,OAAO;GAAE;GAExD,IAAI,EAAQ,SAAS,GAAG;IACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAI;IAE7B;GACF;GAcA,AAZI,EAAM,UAAU,MAClB,EAAM,MAAM,GAEP,MACH,IAAiB,IACjB,EACE,kCAAkC,EAAe,qIAEnD,KAIJ,EAAM,KAAK,CAAI;EACjB;CACF,CAAC;CAED,SAAS,IAAqB;EAC5B,OAAO,EAAQ,SAAS,IACtB,EAAQ,MAAM,CAAC,CAAE,QAAQ,CAAW;CAExC;CAEA,IAAM,IAAW;EACf,OAAmC;GACjC,IAAI,EAAM,SAAS,GAAG;IACpB,IAAM,IAAO,EAAM,MAAM;IAIzB,OAFI,WAAW,IAAa,QAAQ,OAAQ,EAA4B,KAAK,IAEtE,QAAQ,QAAQ,CAAyB;GAClD;GAIA,OAFI,IAAa,QAAQ,QAAQ,CAAW,IAErC,IAAI,SAA4B,GAAS,MAAW,EAAQ,KAAK;IAAE;IAAQ;GAAQ,CAAC,CAAC;EAC9F;EACA,SAAqC;GAOnC,OANK,MACH,EAAM,GACN,IAAO,IACP,EAAa,IAGR,QAAQ,QAAQ,CAAW;EACpC;EACA,CAAC,OAAO,iBAA2C;GACjD,OAAO;EACT;CACF;CAEA,OAAO;AACT"}
@@ -0,0 +1,2 @@
1
+ function e(e){let t=Number.isFinite(e)?Math.max(1,Math.floor(e)):1;return{clamped:t!==e,value:t}}exports.clampPositiveInt=e;
2
+ //# sourceMappingURL=_numeric.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_numeric.cjs","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["/**\n * Coerces `n` to a positive integer >= 1. Non-finite values (`NaN`, `Infinity`,\n * `-Infinity`) are treated as invalid input — same as any other out-of-range\n * number — and fall back to `1` rather than silently propagating a value that\n * would defeat every downstream bounds check (`length >= NaN` and `length >= Infinity`\n * are never true, which would otherwise make a \"capped\" buffer grow unbounded).\n * @internal\n */\nexport function clampPositiveInt(n: number): { clamped: boolean; value: number } {\n const value = Number.isFinite(n) ? Math.max(1, Math.floor(n)) : 1;\n\n return { clamped: value !== n, value };\n}\n"],"mappings":"AAQA,SAAgB,EAAiB,EAAgD,CAC/E,IAAM,EAAQ,OAAO,SAAS,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,CAAC,CAAC,EAAI,EAEhE,MAAO,CAAE,QAAS,IAAU,EAAG,OAAM,CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_numeric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_numeric.d.ts","sourceRoot":"","sources":["../src/_numeric.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ //#region src/_numeric.ts
2
+ function e(e) {
3
+ let t = Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1;
4
+ return {
5
+ clamped: t !== e,
6
+ value: t
7
+ };
8
+ }
9
+ //#endregion
10
+ export { e as clampPositiveInt };
11
+
12
+ //# sourceMappingURL=_numeric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_numeric.js","names":[],"sources":["../src/_numeric.ts"],"sourcesContent":["/**\n * Coerces `n` to a positive integer >= 1. Non-finite values (`NaN`, `Infinity`,\n * `-Infinity`) are treated as invalid input — same as any other out-of-range\n * number — and fall back to `1` rather than silently propagating a value that\n * would defeat every downstream bounds check (`length >= NaN` and `length >= Infinity`\n * are never true, which would otherwise make a \"capped\" buffer grow unbounded).\n * @internal\n */\nexport function clampPositiveInt(n: number): { clamped: boolean; value: number } {\n const value = Number.isFinite(n) ? Math.max(1, Math.floor(n)) : 1;\n\n return { clamped: value !== n, value };\n}\n"],"mappings":";AAQA,SAAgB,EAAiB,GAAgD;CAC/E,IAAM,IAAQ,OAAO,SAAS,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,IAAI;CAEhE,OAAO;EAAE,SAAS,MAAU;EAAG;CAAM;AACvC"}
package/dist/_pipe.cjs ADDED
@@ -0,0 +1,2 @@
1
+ function e(e){return((...t)=>t.reduce((e,t)=>t(e),e()))}exports.makePipe=e;
2
+ //# sourceMappingURL=_pipe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_pipe.cjs","names":[],"sources":["../src/_pipe.ts"],"sourcesContent":["import type { Flux, Operator } from './types';\n\n/**\n * Builds the shared `pipe()` implementation used by `flux()` and every `Subject` variant —\n * previously copy-pasted once per factory. `getInstance` is called lazily so the returned\n * function can be assigned into an object literal that self-references its own binding\n * (`instance`/`subject`) before that binding is initialised.\n * @internal\n */\nexport function makePipe<T>(getInstance: () => Flux<T>): Flux<T>['pipe'] {\n return ((...operators: Operator[]) =>\n operators.reduce((f: Flux<unknown>, op) => op(f), getInstance() as Flux<unknown>)) as Flux<T>['pipe'];\n}\n"],"mappings":"AASA,SAAgB,EAAY,EAA6C,CACvE,QAAS,GAAG,IACV,EAAU,QAAQ,EAAkB,IAAO,EAAG,CAAC,EAAG,EAAY,CAAkB,EACpF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_pipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_pipe.d.ts","sourceRoot":"","sources":["../src/_pipe.ts"],"names":[],"mappings":""}
package/dist/_pipe.js ADDED
@@ -0,0 +1,8 @@
1
+ //#region src/_pipe.ts
2
+ function e(e) {
3
+ return ((...t) => t.reduce((e, t) => t(e), e()));
4
+ }
5
+ //#endregion
6
+ export { e as makePipe };
7
+
8
+ //# sourceMappingURL=_pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_pipe.js","names":[],"sources":["../src/_pipe.ts"],"sourcesContent":["import type { Flux, Operator } from './types';\n\n/**\n * Builds the shared `pipe()` implementation used by `flux()` and every `Subject` variant —\n * previously copy-pasted once per factory. `getInstance` is called lazily so the returned\n * function can be assigned into an object literal that self-references its own binding\n * (`instance`/`subject`) before that binding is initialised.\n * @internal\n */\nexport function makePipe<T>(getInstance: () => Flux<T>): Flux<T>['pipe'] {\n return ((...operators: Operator[]) =>\n operators.reduce((f: Flux<unknown>, op) => op(f), getInstance() as Flux<unknown>)) as Flux<T>['pipe'];\n}\n"],"mappings":";AASA,SAAgB,EAAY,GAA6C;CACvE,SAAS,GAAG,MACV,EAAU,QAAQ,GAAkB,MAAO,EAAG,CAAC,GAAG,EAAY,CAAkB;AACpF"}
package/dist/_safe.cjs ADDED
@@ -0,0 +1,2 @@
1
+ function e(e,t){try{e()}catch(e){t?.(e)}}exports.guard=e;
2
+ //# sourceMappingURL=_safe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_safe.cjs","names":[],"sources":["../src/_safe.ts"],"sourcesContent":["/**\n * Run `fn`; if it throws synchronously, route the error to `onError` instead of letting\n * it escape uncaught. Used by operators to guard user-supplied callbacks (`map`'s `fn`,\n * `filter`'s `predicate`, etc.) so a throw becomes a normal `observer.error()` call\n * instead of an unhandled exception.\n * @internal\n */\nexport function guard(fn: () => void, onError?: (err: unknown) => void): void {\n try {\n fn();\n } catch (err) {\n onError?.(err);\n }\n}\n"],"mappings":"AAOA,SAAgB,EAAM,EAAgB,EAAwC,CAC5E,GAAI,CACF,EAAG,CACL,OAAS,EAAK,CACZ,IAAU,CAAG,CACf,CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_safe.d.ts","sourceRoot":"","sources":["../src/_safe.ts"],"names":[],"mappings":""}
package/dist/_safe.js ADDED
@@ -0,0 +1,12 @@
1
+ //#region src/_safe.ts
2
+ function e(e, t) {
3
+ try {
4
+ e();
5
+ } catch (e) {
6
+ t?.(e);
7
+ }
8
+ }
9
+ //#endregion
10
+ export { e as guard };
11
+
12
+ //# sourceMappingURL=_safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_safe.js","names":[],"sources":["../src/_safe.ts"],"sourcesContent":["/**\n * Run `fn`; if it throws synchronously, route the error to `onError` instead of letting\n * it escape uncaught. Used by operators to guard user-supplied callbacks (`map`'s `fn`,\n * `filter`'s `predicate`, etc.) so a throw becomes a normal `observer.error()` call\n * instead of an unhandled exception.\n * @internal\n */\nexport function guard(fn: () => void, onError?: (err: unknown) => void): void {\n try {\n fn();\n } catch (err) {\n onError?.(err);\n }\n}\n"],"mappings":";AAOA,SAAgB,EAAM,GAAgB,GAAwC;CAC5E,IAAI;EACF,EAAG;CACL,SAAS,GAAK;EACZ,IAAU,CAAG;CACf;AACF"}
@@ -0,0 +1,2 @@
1
+ var e={delay(e,t){let n=setTimeout(e,t);return()=>clearTimeout(n)},repeat(e,t){let n=setInterval(e,t);return()=>clearInterval(n)}};exports.DEFAULT_SCHEDULER=e;
2
+ //# sourceMappingURL=_scheduler.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_scheduler.cjs","names":[],"sources":["../src/_scheduler.ts"],"sourcesContent":["import type { Scheduler } from './types';\n\nexport const DEFAULT_SCHEDULER: Scheduler = {\n delay(fn, ms) {\n const id = setTimeout(fn, ms);\n\n return () => clearTimeout(id);\n },\n repeat(fn, ms) {\n const id = setInterval(fn, ms);\n\n return () => clearInterval(id);\n },\n};\n"],"mappings":"AAEA,IAAa,EAA+B,CAC1C,MAAM,EAAI,EAAI,CACZ,IAAM,EAAK,WAAW,EAAI,CAAE,EAE5B,UAAa,aAAa,CAAE,CAC9B,EACA,OAAO,EAAI,EAAI,CACb,IAAM,EAAK,YAAY,EAAI,CAAE,EAE7B,UAAa,cAAc,CAAE,CAC/B,CACF"}
@@ -0,0 +1,3 @@
1
+ import type { Scheduler } from './types';
2
+ export declare const DEFAULT_SCHEDULER: Scheduler;
3
+ //# sourceMappingURL=_scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_scheduler.d.ts","sourceRoot":"","sources":["../src/_scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,eAAO,MAAM,iBAAiB,EAAE,SAW/B,CAAC"}
@@ -0,0 +1,15 @@
1
+ //#region src/_scheduler.ts
2
+ var e = {
3
+ delay(e, t) {
4
+ let n = setTimeout(e, t);
5
+ return () => clearTimeout(n);
6
+ },
7
+ repeat(e, t) {
8
+ let n = setInterval(e, t);
9
+ return () => clearInterval(n);
10
+ }
11
+ };
12
+ //#endregion
13
+ export { e as DEFAULT_SCHEDULER };
14
+
15
+ //# sourceMappingURL=_scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_scheduler.js","names":[],"sources":["../src/_scheduler.ts"],"sourcesContent":["import type { Scheduler } from './types';\n\nexport const DEFAULT_SCHEDULER: Scheduler = {\n delay(fn, ms) {\n const id = setTimeout(fn, ms);\n\n return () => clearTimeout(id);\n },\n repeat(fn, ms) {\n const id = setInterval(fn, ms);\n\n return () => clearInterval(id);\n },\n};\n"],"mappings":";AAEA,IAAa,IAA+B;CAC1C,MAAM,GAAI,GAAI;EACZ,IAAM,IAAK,WAAW,GAAI,CAAE;EAE5B,aAAa,aAAa,CAAE;CAC9B;CACA,OAAO,GAAI,GAAI;EACb,IAAM,IAAK,YAAY,GAAI,CAAE;EAE7B,aAAa,cAAc,CAAE;CAC/B;AACF"}
@@ -0,0 +1,2 @@
1
+ const e=require("../core.cjs");function t(t,n){return e.flux(e=>t.on(n,t=>e.next(t)))}function n(t){return e.flux(e=>(e.next(t.peek()),t.subscribe(()=>{e.next(t.peek())})))}exports.fromQuery=n,exports.fromSse=t;
2
+ //# sourceMappingURL=courier.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courier.cjs","names":[],"sources":["../../src/adapters/courier.ts"],"sourcesContent":["import type { SseSource } from '@vielzeug/courier';\n\nimport type { Flux } from '../types';\n\nimport { flux } from '../core';\n\n/**\n * Minimal shape of a courier `SyncStore` needed to subscribe to query state changes.\n * Avoids a hard import of `@vielzeug/courier` types that are not in the peer dep.\n *\n * @internal\n */\ntype SyncStore<T> = {\n peek(): T;\n subscribe(onStoreChange: () => void): () => void;\n};\n\n/**\n * Create a `Flux` from an SSE source returned by `streamClient.sse()`.\n * Emits typed SSE events under `event`. The current SSE status is NOT emitted —\n * only data messages are forwarded.\n *\n * @example\n * const events$ = fromSse(stream.sse('/events'), 'message');\n * events$.subscribe((data) => console.log(data));\n */\nexport function fromSse<TEvents extends Record<string, unknown>, K extends keyof TEvents & string>(\n source: SseSource<TEvents>,\n event: K,\n): Flux<TEvents[K]> {\n return flux<TEvents[K]>((observer) => {\n const unsub = source.on(event, (data) => observer.next(data));\n\n return unsub;\n });\n}\n\n/**\n * Create a `Flux` from a courier `SyncStore` (returned by `qc.observe()`).\n * Emits the current state immediately, then on every state change.\n *\n * @example\n * const data$ = fromQuery(qc.observe({ key: ['users'], fn: fetchUsers }));\n * data$.subscribe((state) => console.log(state.status, state.data));\n */\nexport function fromQuery<T>(store: SyncStore<T>): Flux<T> {\n return flux<T>((observer) => {\n observer.next(store.peek());\n\n const unsub = store.subscribe(() => {\n observer.next(store.peek());\n });\n\n return unsub;\n });\n}\n"],"mappings":"+BA0BA,SAAgB,EACd,EACA,EACkB,CAClB,OAAO,EAAA,KAAkB,GACT,EAAO,GAAG,EAAQ,GAAS,EAAS,KAAK,CAAI,CAEpD,CACR,CACH,CAUA,SAAgB,EAAa,EAA8B,CACzD,OAAO,EAAA,KAAS,IACd,EAAS,KAAK,EAAM,KAAK,CAAC,EAEZ,EAAM,cAAgB,CAClC,EAAS,KAAK,EAAM,KAAK,CAAC,CAC5B,CAEO,EACR,CACH"}
@@ -0,0 +1,22 @@
1
+ import type { SseSource } from '@vielzeug/courier';
2
+ import type { Flux } from '../types';
3
+ /**
4
+ * Create a `Flux` from an SSE source returned by `streamClient.sse()`.
5
+ * Emits typed SSE events under `event`. The current SSE status is NOT emitted —
6
+ * only data messages are forwarded.
7
+ *
8
+ * @example
9
+ * const events$ = fromSse(stream.sse('/events'), 'message');
10
+ * events$.subscribe((data) => console.log(data));
11
+ */
12
+ export declare function fromSse<TEvents extends Record<string, unknown>, K extends keyof TEvents & string>(source: SseSource<TEvents>, event: K): Flux<TEvents[K]>;
13
+ /**
14
+ * Create a `Flux` from a courier `SyncStore` (returned by `qc.observe()`).
15
+ * Emits the current state immediately, then on every state change.
16
+ *
17
+ * @example
18
+ * const data$ = fromQuery(qc.observe({ key: ['users'], fn: fetchUsers }));
19
+ * data$.subscribe((state) => console.log(state.status, state.data));
20
+ */
21
+ export declare function fromQuery<T>(store: SyncStore<T>): Flux<T>;
22
+ //# sourceMappingURL=courier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courier.d.ts","sourceRoot":"","sources":["../../src/adapters/courier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAerC;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAC/F,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,EAC1B,KAAK,EAAE,CAAC,GACP,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAMlB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAUzD"}
@@ -0,0 +1,14 @@
1
+ import { flux as e } from "../core.js";
2
+ //#region src/adapters/courier.ts
3
+ function t(t, n) {
4
+ return e((e) => t.on(n, (t) => e.next(t)));
5
+ }
6
+ function n(t) {
7
+ return e((e) => (e.next(t.peek()), t.subscribe(() => {
8
+ e.next(t.peek());
9
+ })));
10
+ }
11
+ //#endregion
12
+ export { n as fromQuery, t as fromSse };
13
+
14
+ //# sourceMappingURL=courier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courier.js","names":[],"sources":["../../src/adapters/courier.ts"],"sourcesContent":["import type { SseSource } from '@vielzeug/courier';\n\nimport type { Flux } from '../types';\n\nimport { flux } from '../core';\n\n/**\n * Minimal shape of a courier `SyncStore` needed to subscribe to query state changes.\n * Avoids a hard import of `@vielzeug/courier` types that are not in the peer dep.\n *\n * @internal\n */\ntype SyncStore<T> = {\n peek(): T;\n subscribe(onStoreChange: () => void): () => void;\n};\n\n/**\n * Create a `Flux` from an SSE source returned by `streamClient.sse()`.\n * Emits typed SSE events under `event`. The current SSE status is NOT emitted —\n * only data messages are forwarded.\n *\n * @example\n * const events$ = fromSse(stream.sse('/events'), 'message');\n * events$.subscribe((data) => console.log(data));\n */\nexport function fromSse<TEvents extends Record<string, unknown>, K extends keyof TEvents & string>(\n source: SseSource<TEvents>,\n event: K,\n): Flux<TEvents[K]> {\n return flux<TEvents[K]>((observer) => {\n const unsub = source.on(event, (data) => observer.next(data));\n\n return unsub;\n });\n}\n\n/**\n * Create a `Flux` from a courier `SyncStore` (returned by `qc.observe()`).\n * Emits the current state immediately, then on every state change.\n *\n * @example\n * const data$ = fromQuery(qc.observe({ key: ['users'], fn: fetchUsers }));\n * data$.subscribe((state) => console.log(state.status, state.data));\n */\nexport function fromQuery<T>(store: SyncStore<T>): Flux<T> {\n return flux<T>((observer) => {\n observer.next(store.peek());\n\n const unsub = store.subscribe(() => {\n observer.next(store.peek());\n });\n\n return unsub;\n });\n}\n"],"mappings":";;AA0BA,SAAgB,EACd,GACA,GACkB;CAClB,OAAO,GAAkB,MACT,EAAO,GAAG,IAAQ,MAAS,EAAS,KAAK,CAAI,CAEpD,CACR;AACH;AAUA,SAAgB,EAAa,GAA8B;CACzD,OAAO,GAAS,OACd,EAAS,KAAK,EAAM,KAAK,CAAC,GAEZ,EAAM,gBAAgB;EAClC,EAAS,KAAK,EAAM,KAAK,CAAC;CAC5B,CAEO,EACR;AACH"}
@@ -0,0 +1,2 @@
1
+ const e=require("../core.cjs");function t(t,n){return e.flux(e=>t.on(n,t=>e.next(t)))}function n(t,n){return r=>e.flux(e=>r.subscribe({complete:e.complete,error:e.error,next(r){t.emit(n,...r===void 0?[]:[r]),e.next(r)}}))}exports.fromBus=t,exports.toBus=n;
2
+ //# sourceMappingURL=herald.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"herald.cjs","names":[],"sources":["../../src/adapters/herald.ts"],"sourcesContent":["import type { Bus, EventKey, EventMap } from '@vielzeug/herald';\n\nimport type { Flux, Operator } from '../types';\n\nimport { flux } from '../core';\n\n/**\n * Create a `Flux` that emits whenever `bus` fires `event`.\n *\n * @example\n * const clicks$ = fromBus(appBus, 'button:click');\n * clicks$.subscribe((payload) => console.log(payload));\n */\nexport function fromBus<T extends EventMap, K extends EventKey<T>>(bus: Bus<T>, event: K): Flux<T[K]> {\n return flux<T[K]>((observer) => {\n const unsub = bus.on(event, (payload) => observer.next(payload));\n\n return unsub;\n });\n}\n\n/**\n * Operator that pipes each emission to `bus` under `event`.\n * Returns the source unchanged (pass-through for side effects).\n *\n * @example\n * clicks$.pipe(toBus(appBus, 'forwarded:click'));\n */\nexport function toBus<T extends EventMap, K extends EventKey<T>>(bus: Bus<T>, event: K): Operator<T[K], T[K]> {\n return (source) =>\n flux<T[K]>((observer) =>\n source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n bus.emit(event, ...((v === undefined ? [] : [v]) as T[K] extends void ? [] : [T[K]]));\n observer.next(v);\n },\n }),\n );\n}\n"],"mappings":"+BAaA,SAAgB,EAAmD,EAAa,EAAsB,CACpG,OAAO,EAAA,KAAY,GACH,EAAI,GAAG,EAAQ,GAAY,EAAS,KAAK,CAAO,CAEvD,CACR,CACH,CASA,SAAgB,EAAiD,EAAa,EAAgC,CAC5G,MAAQ,IACN,EAAA,KAAY,GACV,EAAO,UAAU,CACf,SAAU,EAAS,SACnB,MAAO,EAAS,MAChB,KAAK,EAAG,CACN,EAAI,KAAK,EAAO,GAAK,IAAM,IAAA,GAAY,CAAC,EAAI,CAAC,CAAC,CAAsC,EACpF,EAAS,KAAK,CAAC,CACjB,CACF,CAAC,CACH,CACJ"}
@@ -0,0 +1,19 @@
1
+ import type { Bus, EventKey, EventMap } from '@vielzeug/herald';
2
+ import type { Flux, Operator } from '../types';
3
+ /**
4
+ * Create a `Flux` that emits whenever `bus` fires `event`.
5
+ *
6
+ * @example
7
+ * const clicks$ = fromBus(appBus, 'button:click');
8
+ * clicks$.subscribe((payload) => console.log(payload));
9
+ */
10
+ export declare function fromBus<T extends EventMap, K extends EventKey<T>>(bus: Bus<T>, event: K): Flux<T[K]>;
11
+ /**
12
+ * Operator that pipes each emission to `bus` under `event`.
13
+ * Returns the source unchanged (pass-through for side effects).
14
+ *
15
+ * @example
16
+ * clicks$.pipe(toBus(appBus, 'forwarded:click'));
17
+ */
18
+ export declare function toBus<T extends EventMap, K extends EventKey<T>>(bus: Bus<T>, event: K): Operator<T[K], T[K]>;
19
+ //# sourceMappingURL=herald.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"herald.d.ts","sourceRoot":"","sources":["../../src/adapters/herald.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAI/C;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAMpG;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAY5G"}
@@ -0,0 +1,18 @@
1
+ import { flux as e } from "../core.js";
2
+ //#region src/adapters/herald.ts
3
+ function t(t, n) {
4
+ return e((e) => t.on(n, (t) => e.next(t)));
5
+ }
6
+ function n(t, n) {
7
+ return (r) => e((e) => r.subscribe({
8
+ complete: e.complete,
9
+ error: e.error,
10
+ next(r) {
11
+ t.emit(n, ...r === void 0 ? [] : [r]), e.next(r);
12
+ }
13
+ }));
14
+ }
15
+ //#endregion
16
+ export { t as fromBus, n as toBus };
17
+
18
+ //# sourceMappingURL=herald.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"herald.js","names":[],"sources":["../../src/adapters/herald.ts"],"sourcesContent":["import type { Bus, EventKey, EventMap } from '@vielzeug/herald';\n\nimport type { Flux, Operator } from '../types';\n\nimport { flux } from '../core';\n\n/**\n * Create a `Flux` that emits whenever `bus` fires `event`.\n *\n * @example\n * const clicks$ = fromBus(appBus, 'button:click');\n * clicks$.subscribe((payload) => console.log(payload));\n */\nexport function fromBus<T extends EventMap, K extends EventKey<T>>(bus: Bus<T>, event: K): Flux<T[K]> {\n return flux<T[K]>((observer) => {\n const unsub = bus.on(event, (payload) => observer.next(payload));\n\n return unsub;\n });\n}\n\n/**\n * Operator that pipes each emission to `bus` under `event`.\n * Returns the source unchanged (pass-through for side effects).\n *\n * @example\n * clicks$.pipe(toBus(appBus, 'forwarded:click'));\n */\nexport function toBus<T extends EventMap, K extends EventKey<T>>(bus: Bus<T>, event: K): Operator<T[K], T[K]> {\n return (source) =>\n flux<T[K]>((observer) =>\n source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n bus.emit(event, ...((v === undefined ? [] : [v]) as T[K] extends void ? [] : [T[K]]));\n observer.next(v);\n },\n }),\n );\n}\n"],"mappings":";;AAaA,SAAgB,EAAmD,GAAa,GAAsB;CACpG,OAAO,GAAY,MACH,EAAI,GAAG,IAAQ,MAAY,EAAS,KAAK,CAAO,CAEvD,CACR;AACH;AASA,SAAgB,EAAiD,GAAa,GAAgC;CAC5G,QAAQ,MACN,GAAY,MACV,EAAO,UAAU;EACf,UAAU,EAAS;EACnB,OAAO,EAAS;EAChB,KAAK,GAAG;GAEN,AADA,EAAI,KAAK,GAAO,GAAK,MAAM,KAAA,IAAY,CAAC,IAAI,CAAC,CAAC,CAAsC,GACpF,EAAS,KAAK,CAAC;EACjB;CACF,CAAC,CACH;AACJ"}
@@ -0,0 +1,2 @@
1
+ const e=require("../core.cjs");function t(t,n){return e.flux(e=>t.on(n,t=>e.next(t)))}function n(t){return e.flux(e=>{e.next(t.state.value);let n=t.onJoin(()=>{e.next(t.state.value)}),r=t.onLeave(()=>{e.next(t.state.value)});return()=>{n(),r()}})}exports.fromPresence=n,exports.fromPulse=t;
2
+ //# sourceMappingURL=pulse.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.cjs","names":[],"sources":["../../src/adapters/pulse.ts"],"sourcesContent":["import type { EventKey, MessageMap, PresenceChannel, Pulse } from '@vielzeug/pulse';\n\nimport type { Flux } from '../types';\n\nimport { flux } from '../core';\n\n/**\n * Create a `Flux` that emits whenever a Pulse connection fires `event`.\n *\n * @example\n * const messages$ = fromPulse(pulse, 'chat:message');\n * messages$.subscribe((msg) => console.log(msg));\n */\nexport function fromPulse<T extends MessageMap, K extends EventKey<T>>(pulse: Pulse<T>, event: K): Flux<T[K]> {\n return flux<T[K]>((observer) => {\n const unsub = pulse.on(event, (payload) => observer.next(payload));\n\n return unsub;\n });\n}\n\n/**\n * Create a `Flux` from a `PresenceChannel`. Emits the full member map whenever\n * any member joins or leaves.\n *\n * The current state is emitted immediately on subscribe.\n *\n * @example\n * const members$ = fromPresence(pulse.presence('lobby'));\n * members$.subscribe((map) => console.log([...map.keys()]));\n */\nexport function fromPresence<T>(presence: PresenceChannel<T>): Flux<ReadonlyMap<string, T>> {\n return flux<ReadonlyMap<string, T>>((observer) => {\n observer.next(presence.state.value);\n\n const unsubJoin = presence.onJoin(() => {\n observer.next(presence.state.value);\n });\n\n const unsubLeave = presence.onLeave(() => {\n observer.next(presence.state.value);\n });\n\n return () => {\n unsubJoin();\n unsubLeave();\n };\n });\n}\n"],"mappings":"+BAaA,SAAgB,EAAuD,EAAiB,EAAsB,CAC5G,OAAO,EAAA,KAAY,GACH,EAAM,GAAG,EAAQ,GAAY,EAAS,KAAK,CAAO,CAEzD,CACR,CACH,CAYA,SAAgB,EAAgB,EAA4D,CAC1F,OAAO,EAAA,KAA8B,GAAa,CAChD,EAAS,KAAK,EAAS,MAAM,KAAK,EAElC,IAAM,EAAY,EAAS,WAAa,CACtC,EAAS,KAAK,EAAS,MAAM,KAAK,CACpC,CAAC,EAEK,EAAa,EAAS,YAAc,CACxC,EAAS,KAAK,EAAS,MAAM,KAAK,CACpC,CAAC,EAED,UAAa,CACX,EAAU,EACV,EAAW,CACb,CACF,CAAC,CACH"}
@@ -0,0 +1,22 @@
1
+ import type { EventKey, MessageMap, PresenceChannel, Pulse } from '@vielzeug/pulse';
2
+ import type { Flux } from '../types';
3
+ /**
4
+ * Create a `Flux` that emits whenever a Pulse connection fires `event`.
5
+ *
6
+ * @example
7
+ * const messages$ = fromPulse(pulse, 'chat:message');
8
+ * messages$.subscribe((msg) => console.log(msg));
9
+ */
10
+ export declare function fromPulse<T extends MessageMap, K extends EventKey<T>>(pulse: Pulse<T>, event: K): Flux<T[K]>;
11
+ /**
12
+ * Create a `Flux` from a `PresenceChannel`. Emits the full member map whenever
13
+ * any member joins or leaves.
14
+ *
15
+ * The current state is emitted immediately on subscribe.
16
+ *
17
+ * @example
18
+ * const members$ = fromPresence(pulse.presence('lobby'));
19
+ * members$.subscribe((map) => console.log([...map.keys()]));
20
+ */
21
+ export declare function fromPresence<T>(presence: PresenceChannel<T>): Flux<ReadonlyMap<string, T>>;
22
+ //# sourceMappingURL=pulse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../../src/adapters/pulse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIrC;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAM5G;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAiB1F"}
@@ -0,0 +1,22 @@
1
+ import { flux as e } from "../core.js";
2
+ //#region src/adapters/pulse.ts
3
+ function t(t, n) {
4
+ return e((e) => t.on(n, (t) => e.next(t)));
5
+ }
6
+ function n(t) {
7
+ return e((e) => {
8
+ e.next(t.state.value);
9
+ let n = t.onJoin(() => {
10
+ e.next(t.state.value);
11
+ }), r = t.onLeave(() => {
12
+ e.next(t.state.value);
13
+ });
14
+ return () => {
15
+ n(), r();
16
+ };
17
+ });
18
+ }
19
+ //#endregion
20
+ export { n as fromPresence, t as fromPulse };
21
+
22
+ //# sourceMappingURL=pulse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse.js","names":[],"sources":["../../src/adapters/pulse.ts"],"sourcesContent":["import type { EventKey, MessageMap, PresenceChannel, Pulse } from '@vielzeug/pulse';\n\nimport type { Flux } from '../types';\n\nimport { flux } from '../core';\n\n/**\n * Create a `Flux` that emits whenever a Pulse connection fires `event`.\n *\n * @example\n * const messages$ = fromPulse(pulse, 'chat:message');\n * messages$.subscribe((msg) => console.log(msg));\n */\nexport function fromPulse<T extends MessageMap, K extends EventKey<T>>(pulse: Pulse<T>, event: K): Flux<T[K]> {\n return flux<T[K]>((observer) => {\n const unsub = pulse.on(event, (payload) => observer.next(payload));\n\n return unsub;\n });\n}\n\n/**\n * Create a `Flux` from a `PresenceChannel`. Emits the full member map whenever\n * any member joins or leaves.\n *\n * The current state is emitted immediately on subscribe.\n *\n * @example\n * const members$ = fromPresence(pulse.presence('lobby'));\n * members$.subscribe((map) => console.log([...map.keys()]));\n */\nexport function fromPresence<T>(presence: PresenceChannel<T>): Flux<ReadonlyMap<string, T>> {\n return flux<ReadonlyMap<string, T>>((observer) => {\n observer.next(presence.state.value);\n\n const unsubJoin = presence.onJoin(() => {\n observer.next(presence.state.value);\n });\n\n const unsubLeave = presence.onLeave(() => {\n observer.next(presence.state.value);\n });\n\n return () => {\n unsubJoin();\n unsubLeave();\n };\n });\n}\n"],"mappings":";;AAaA,SAAgB,EAAuD,GAAiB,GAAsB;CAC5G,OAAO,GAAY,MACH,EAAM,GAAG,IAAQ,MAAY,EAAS,KAAK,CAAO,CAEzD,CACR;AACH;AAYA,SAAgB,EAAgB,GAA4D;CAC1F,OAAO,GAA8B,MAAa;EAChD,EAAS,KAAK,EAAS,MAAM,KAAK;EAElC,IAAM,IAAY,EAAS,aAAa;GACtC,EAAS,KAAK,EAAS,MAAM,KAAK;EACpC,CAAC,GAEK,IAAa,EAAS,cAAc;GACxC,EAAS,KAAK,EAAS,MAAM,KAAK;EACpC,CAAC;EAED,aAAa;GAEX,AADA,EAAU,GACV,EAAW;EACb;CACF,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ const e=require("../_dev.cjs"),t=require("../core.cjs");let n=require("@vielzeug/ripple");function r(e){return t.flux(t=>{t.next(e.value);let n=e.subscribe(()=>{t.next(e.value)});return()=>n.dispose()})}function i(t,r){let i=(0,n.signal)(r.initial),a=new AbortController,o=t.subscribe({error(t){e.error(`toSignal: source errored — signal value may be stale`,t)},next(e){i.value=e}},r.signal),s=()=>{a.signal.aborted||(a.abort(),o())};return{get disposalSignal(){return a.signal},dispose:s,get disposed(){return a.signal.aborted},get signal(){return i},[Symbol.dispose](){s()},get value(){return i.value}}}exports.fromSignal=r,exports.toSignal=i;
2
+ //# sourceMappingURL=ripple.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ripple.cjs","names":[],"sources":["../../src/adapters/ripple.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\nimport { signal } from '@vielzeug/ripple';\n\nimport type { Flux } from '../types';\n\nimport { error } from '../_dev';\nimport { flux } from '../core';\n\n/**\n * Create a `Flux` that emits a new value every time a ripple `Reactive` changes.\n * The current value is emitted immediately on subscribe.\n *\n * @example\n * const count = signal(0);\n * const count$ = fromSignal(count);\n * count$.subscribe((n) => console.log(n)); // logs 0 immediately, then on every change\n */\nexport function fromSignal<T>(source: Readable<T>): Flux<T> {\n return flux<T>((observer) => {\n observer.next(source.value);\n\n const subscription = source.subscribe(() => {\n observer.next(source.value);\n });\n\n return () => subscription.dispose();\n });\n}\n\nexport type ToSignalOptions<T> = {\n /** Initial value before the first emission. */\n initial: T;\n /**\n * Optional `AbortSignal` that stops tracking independently of disposal.\n * Useful when the caller does not own the flux's lifetime.\n */\n signal?: AbortSignal;\n};\n\n/**\n * A handle returned by `toSignal()` that wraps a ripple signal updated by a `Flux`.\n * Exposes `value` (reactive — usable in ripple `effect()` calls) and `dispose()` to\n * stop tracking. The underlying signal retains its last value after disposal.\n */\nexport type SignalBinding<T> = {\n /** ES2026 `using` compatible disposal. */\n [Symbol.dispose](): void;\n /** AbortSignal that aborts when `dispose()` is called. */\n readonly disposalSignal: AbortSignal;\n /** Stop tracking the source `Flux` and freeze the signal value. */\n dispose(): void;\n /** `true` after `dispose()` is called. */\n readonly disposed: boolean;\n /** The underlying ripple `Readable<T>` for use with ripple operators. */\n readonly signal: Readable<T>;\n /** The current tracked value (reactive — reads track in ripple effects). */\n readonly value: T;\n};\n\n/**\n * Create a `SignalBinding<T>` whose value is updated by each emission from a `Flux`.\n * The binding starts with `opts.initial` and updates reactively as the flux emits.\n *\n * Call `dispose()` to stop tracking; the last value remains readable after disposal.\n *\n * @example\n * const latest = toSignal(count$, { initial: 0 });\n * effect(() => console.log(latest.value)); // reactive — re-runs on flux emissions\n * latest.dispose(); // stop tracking\n */\nexport function toSignal<T>(source: Flux<T>, opts: ToSignalOptions<T>): SignalBinding<T> {\n const sig = signal<T>(opts.initial);\n const ac = new AbortController();\n\n const unsub = source.subscribe(\n {\n error(err) {\n error('toSignal: source errored — signal value may be stale', err);\n },\n next(v) {\n sig.value = v;\n },\n },\n opts.signal,\n );\n\n const dispose = (): void => {\n if (ac.signal.aborted) return;\n\n ac.abort();\n unsub();\n };\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n dispose,\n get disposed(): boolean {\n return ac.signal.aborted;\n },\n get signal(): Readable<T> {\n return sig;\n },\n [Symbol.dispose](): void {\n dispose();\n },\n get value(): T {\n return sig.value;\n },\n };\n}\n"],"mappings":"0FAkBA,SAAgB,EAAc,EAA8B,CAC1D,OAAO,EAAA,KAAS,GAAa,CAC3B,EAAS,KAAK,EAAO,KAAK,EAE1B,IAAM,EAAe,EAAO,cAAgB,CAC1C,EAAS,KAAK,EAAO,KAAK,CAC5B,CAAC,EAED,UAAa,EAAa,QAAQ,CACpC,CAAC,CACH,CA2CA,SAAgB,EAAY,EAAiB,EAA4C,CACvF,IAAM,GAAA,EAAA,EAAA,OAAA,CAAgB,EAAK,OAAO,EAC5B,EAAK,IAAI,gBAET,EAAQ,EAAO,UACnB,CACE,MAAM,EAAK,CACT,EAAA,MAAM,uDAAwD,CAAG,CACnE,EACA,KAAK,EAAG,CACN,EAAI,MAAQ,CACd,CACF,EACA,EAAK,MACP,EAEM,MAAsB,CACtB,EAAG,OAAO,UAEd,EAAG,MAAM,EACT,EAAM,EACR,EAEA,MAAO,CACL,IAAI,gBAA8B,CAChC,OAAO,EAAG,MACZ,EACA,UACA,IAAI,UAAoB,CACtB,OAAO,EAAG,OAAO,OACnB,EACA,IAAI,QAAsB,CACxB,OAAO,CACT,EACA,CAAC,OAAO,UAAiB,CACvB,EAAQ,CACV,EACA,IAAI,OAAW,CACb,OAAO,EAAI,KACb,CACF,CACF"}
@@ -0,0 +1,53 @@
1
+ import type { Readable } from '@vielzeug/ripple';
2
+ import type { Flux } from '../types';
3
+ /**
4
+ * Create a `Flux` that emits a new value every time a ripple `Reactive` changes.
5
+ * The current value is emitted immediately on subscribe.
6
+ *
7
+ * @example
8
+ * const count = signal(0);
9
+ * const count$ = fromSignal(count);
10
+ * count$.subscribe((n) => console.log(n)); // logs 0 immediately, then on every change
11
+ */
12
+ export declare function fromSignal<T>(source: Readable<T>): Flux<T>;
13
+ export type ToSignalOptions<T> = {
14
+ /** Initial value before the first emission. */
15
+ initial: T;
16
+ /**
17
+ * Optional `AbortSignal` that stops tracking independently of disposal.
18
+ * Useful when the caller does not own the flux's lifetime.
19
+ */
20
+ signal?: AbortSignal;
21
+ };
22
+ /**
23
+ * A handle returned by `toSignal()` that wraps a ripple signal updated by a `Flux`.
24
+ * Exposes `value` (reactive — usable in ripple `effect()` calls) and `dispose()` to
25
+ * stop tracking. The underlying signal retains its last value after disposal.
26
+ */
27
+ export type SignalBinding<T> = {
28
+ /** ES2026 `using` compatible disposal. */
29
+ [Symbol.dispose](): void;
30
+ /** AbortSignal that aborts when `dispose()` is called. */
31
+ readonly disposalSignal: AbortSignal;
32
+ /** Stop tracking the source `Flux` and freeze the signal value. */
33
+ dispose(): void;
34
+ /** `true` after `dispose()` is called. */
35
+ readonly disposed: boolean;
36
+ /** The underlying ripple `Readable<T>` for use with ripple operators. */
37
+ readonly signal: Readable<T>;
38
+ /** The current tracked value (reactive — reads track in ripple effects). */
39
+ readonly value: T;
40
+ };
41
+ /**
42
+ * Create a `SignalBinding<T>` whose value is updated by each emission from a `Flux`.
43
+ * The binding starts with `opts.initial` and updates reactively as the flux emits.
44
+ *
45
+ * Call `dispose()` to stop tracking; the last value remains readable after disposal.
46
+ *
47
+ * @example
48
+ * const latest = toSignal(count$, { initial: 0 });
49
+ * effect(() => console.log(latest.value)); // reactive — re-runs on flux emissions
50
+ * latest.dispose(); // stop tracking
51
+ */
52
+ export declare function toSignal<T>(source: Flux<T>, opts: ToSignalOptions<T>): SignalBinding<T>;
53
+ //# sourceMappingURL=ripple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/adapters/ripple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAKrC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAU1D;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,CAAC,CAAC;IACX;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,0CAA0C;IAC1C,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,mEAAmE;IACnE,OAAO,IAAI,IAAI,CAAC;IAChB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAyCvF"}