git.iko.soy/rowtype-yoga/purescript-yoga-om-strom
on main help sign in
4 files changed+64−681
since splitsnapshots
unifiedsplit
README.md+1 spago.lock+8−602 spago.yaml+5−10 src/Yoga/Om/Strom.purs+50−69
README.md+1
@@ -441,3 +441,4 @@ This design enables:
441441## Credits
442442
443443Inspired by [ZIO ZStream](https://zio.dev/reference/stream/zstream) from the Scala ZIO ecosystem.
444+
spago.lock+8−602
@@ -6,7 +6,7 @@
66 "core": {
77 "dependencies": [
88 {
9− "aff": ">=7.1.0 <8.0.0"
9+ "aff": ">=8.0.0 <9.0.0"
1010 },
1111 {
1212 "arrays": ">=7.3.0 <8.0.0"
@@ -57,7 +57,7 @@
5757 "refs": ">=6.0.0 <7.0.0"
5858 },
5959 {
60− "spec": ">=8.1.1 <9.0.0"
60+ "spec": ">=8.1.2 <9.0.0"
6161 },
6262 {
6363 "st": ">=6.2.0 <7.0.0"
@@ -75,7 +75,7 @@
7575 "variant": ">=8.0.0 <9.0.0"
7676 },
7777 {
78− "yoga-om": ">=1.3.0 <2.0.0"
78+ "yoga-om": ">=1.5.2 <2.0.0"
7979 }
8080 ]
8181 },
@@ -91,601 +91,7 @@
9191 }
9292 }
9393 },
94− "package_set": {
95− "address": {
96− "registry": "73.2.0"
97− },
98− "compiler": ">=0.15.15 <0.16.0",
99− "content": {
100− "abc-parser": "2.1.0",
101− "ace": "9.1.0",
102− "address-rfc2821": "0.1.1",
103− "aff": "8.0.0",
104− "aff-bus": "6.0.0",
105− "aff-coroutines": "9.0.0",
106− "aff-promise": "4.0.0",
107− "aff-retry": "2.0.0",
108− "affjax": "13.0.0",
109− "affjax-node": "1.0.0",
110− "affjax-web": "1.0.0",
111− "ansi": "7.0.0",
112− "apexcharts": "0.5.0",
113− "applicative-phases": "1.0.0",
114− "argonaut": "9.0.0",
115− "argonaut-aeson-generic": "0.4.1",
116− "argonaut-codecs": "9.1.0",
117− "argonaut-core": "7.0.0",
118− "argonaut-generic": "8.0.0",
119− "argonaut-traversals": "10.0.0",
120− "argparse-basic": "2.0.0",
121− "array-builder": "0.1.2",
122− "array-search": "0.6.0",
123− "arraybuffer": "13.2.0",
124− "arraybuffer-builder": "3.1.0",
125− "arraybuffer-types": "3.0.2",
126− "arrays": "7.3.0",
127− "arrays-extra": "0.6.1",
128− "arrays-zipper": "2.0.1",
129− "ask": "1.0.0",
130− "assert": "6.0.0",
131− "assert-multiple": "0.4.0",
132− "avar": "5.0.1",
133− "axon": "0.0.3",
134− "b64": "0.0.8",
135− "barbies": "1.0.1",
136− "barlow-lens": "0.9.0",
137− "benchlib": "0.0.4",
138− "bifunctors": "6.1.0",
139− "bigints": "7.0.1",
140− "blessed": "1.0.0",
141− "bolson": "0.3.9",
142− "bookhound": "0.1.7",
143− "bower-json": "3.0.0",
144− "call-by-name": "4.0.1",
145− "canvas": "6.0.0",
146− "canvas-action": "9.0.0",
147− "cartesian": "1.0.6",
148− "catenable-lists": "7.0.0",
149− "cbor-stream": "1.3.0",
150− "chameleon": "1.0.0",
151− "chameleon-halogen": "1.0.3",
152− "chameleon-react-basic": "1.1.0",
153− "chameleon-styled": "2.5.0",
154− "chameleon-transformers": "1.0.0",
155− "channel": "1.0.0",
156− "checked-exceptions": "3.1.1",
157− "choku": "1.0.2",
158− "classless": "0.1.1",
159− "classless-arbitrary": "0.1.1",
160− "classless-decode-json": "0.1.1",
161− "classless-encode-json": "0.1.3",
162− "classnames": "2.0.0",
163− "codec": "6.1.0",
164− "codec-argonaut": "10.0.0",
165− "codec-json": "2.0.0",
166− "colors": "7.0.1",
167− "concur-core": "0.5.0",
168− "concur-react": "0.5.0",
169− "concurrent-queues": "3.0.0",
170− "console": "6.1.0",
171− "const": "6.0.0",
172− "contravariant": "6.0.0",
173− "control": "6.0.0",
174− "convertable-options": "1.0.0",
175− "coroutines": "7.0.0",
176− "css": "6.0.0",
177− "css-class-name-extractor": "0.0.4",
178− "css-frameworks": "1.1.0",
179− "csv-stream": "2.3.0",
180− "data-mvc": "0.0.2",
181− "datetime": "6.1.0",
182− "datetime-parsing": "0.2.0",
183− "debounce": "0.1.0",
184− "debug": "6.0.2",
185− "decimals": "7.1.0",
186− "default-values": "1.0.1",
187− "deku": "0.9.23",
188− "deno": "0.0.5",
189− "dissect": "1.0.0",
190− "distributive": "6.0.0",
191− "dodo-printer": "2.2.3",
192− "dom-filereader": "7.0.0",
193− "dom-indexed": "13.0.0",
194− "dom-simple": "0.4.0",
195− "dotenv": "4.0.3",
196− "droplet": "0.6.0",
197− "dts": "1.0.0",
198− "dual-numbers": "1.0.3",
199− "dynamic-buffer": "3.0.1",
200− "echarts-simple": "0.0.1",
201− "effect": "4.0.0",
202− "either": "6.1.0",
203− "elmish": "0.13.0",
204− "elmish-enzyme": "0.1.1",
205− "elmish-hooks": "0.11.0",
206− "elmish-html": "0.10.0",
207− "elmish-testing-library": "0.3.2",
208− "elmish-time-machine": "0.4.2",
209− "email-validate": "7.0.0",
210− "encoding": "0.0.9",
211− "enums": "6.0.1",
212− "env-names": "0.4.0",
213− "environment": "2.0.0",
214− "error": "2.0.0",
215− "eta-conversion": "0.3.2",
216− "exceptions": "6.1.0",
217− "exists": "6.0.0",
218− "exitcodes": "4.0.0",
219− "expect-inferred": "3.0.0",
220− "express": "0.9.1",
221− "ezfetch": "1.1.1",
222− "fahrtwind": "2.0.0",
223− "fakerjs": "0.0.1",
224− "fallback": "0.1.0",
225− "fast-vect": "1.2.0",
226− "fetch": "4.1.0",
227− "fetch-argonaut": "1.0.1",
228− "fetch-core": "5.1.0",
229− "fetch-yoga-json": "1.1.0",
230− "ffi-simple": "0.5.1",
231− "fft": "0.3.0",
232− "fft-js": "0.1.0",
233− "filterable": "5.0.0",
234− "fix-functor": "0.1.0",
235− "fixed-points": "7.0.0",
236− "fixed-precision": "5.0.0",
237− "flame": "1.6.0",
238− "float32": "2.0.0",
239− "fmt": "0.2.1",
240− "foldable-traversable": "6.0.0",
241− "foldable-traversable-extra": "0.0.6",
242− "foreign": "7.0.0",
243− "foreign-object": "4.1.0",
244− "foreign-readwrite": "3.4.0",
245− "forgetmenot": "0.1.0",
246− "fork": "6.0.0",
247− "form-urlencoded": "7.0.0",
248− "formatters": "7.0.0",
249− "framer-motion": "2.0.1",
250− "free": "7.1.0",
251− "freeap": "7.0.0",
252− "freer-free": "0.0.1",
253− "freet": "7.0.0",
254− "functions": "6.0.0",
255− "functor1": "3.0.0",
256− "functors": "5.0.0",
257− "fuzzy": "0.4.0",
258− "gen": "4.0.0",
259− "generate-values": "1.0.1",
260− "generic-router": "0.0.1",
261− "geojson": "0.0.5",
262− "geometria": "2.2.0",
263− "gesso": "1.0.1",
264− "gojs": "0.1.1",
265− "golem-fetch": "0.1.0",
266− "grain": "3.0.0",
267− "grain-router": "3.0.0",
268− "grain-virtualized": "3.0.0",
269− "graphql-client": "10.1.1",
270− "graphs": "8.1.0",
271− "group": "4.1.1",
272− "halogen": "7.0.0",
273− "halogen-bootstrap5": "5.3.2",
274− "halogen-canvas": "1.0.0",
275− "halogen-css": "10.0.0",
276− "halogen-declarative-canvas": "0.0.8",
277− "halogen-echarts-simple": "0.0.4",
278− "halogen-formless": "4.0.3",
279− "halogen-helix": "1.1.0",
280− "halogen-hooks": "0.6.3",
281− "halogen-hooks-extra": "0.9.0",
282− "halogen-infinite-scroll": "1.1.0",
283− "halogen-store": "0.5.4",
284− "halogen-storybook": "2.0.0",
285− "halogen-subscriptions": "2.0.0",
286− "halogen-svg-elems": "8.0.0",
287− "halogen-typewriter": "1.0.4",
288− "halogen-use-trigger-hooks": "1.0.0",
289− "halogen-vdom": "8.0.0",
290− "halogen-vdom-string-renderer": "0.5.0",
291− "halogen-xterm": "2.0.0",
292− "heckin": "2.0.1",
293− "heterogeneous": "0.7.0",
294− "homogeneous": "0.4.0",
295− "http-methods": "6.0.0",
296− "httpurple": "4.0.0",
297− "huffman": "0.4.0",
298− "humdrum": "0.0.1",
299− "hylograph-canvas": "0.1.0",
300− "hylograph-d3-kernel": "0.1.0",
301− "hylograph-graph": "0.1.0",
302− "hylograph-layout": "0.1.0",
303− "hylograph-music": "0.1.0",
304− "hylograph-optics": "0.1.0",
305− "hylograph-selection": "0.1.1",
306− "hylograph-simulation": "0.1.0",
307− "hylograph-simulation-core": "0.1.0",
308− "hylograph-simulation-halogen": "0.1.0",
309− "hylograph-transitions": "0.1.0",
310− "hylograph-wasm-kernel": "0.1.0",
311− "hyrule": "2.3.8",
312− "identity": "6.0.0",
313− "identy": "4.0.1",
314− "indexed-db": "1.0.0",
315− "indexed-monad": "3.0.0",
316− "ink": "0.0.1",
317− "int64": "3.0.0",
318− "integers": "6.0.0",
319− "interpolate": "5.0.2",
320− "intersection-observer": "1.0.1",
321− "invariant": "6.0.0",
322− "jarilo": "1.0.1",
323− "jelly": "0.10.0",
324− "jelly-router": "0.3.0",
325− "jelly-signal": "0.4.0",
326− "jest": "1.0.0",
327− "js-abort-controller": "1.0.0",
328− "js-bigints": "2.2.1",
329− "js-date": "8.0.0",
330− "js-fetch": "0.2.1",
331− "js-fileio": "3.0.0",
332− "js-intl": "1.1.4",
333− "js-iterators": "0.1.1",
334− "js-maps": "0.1.2",
335− "js-promise": "1.0.0",
336− "js-promise-aff": "1.0.0",
337− "js-timers": "6.1.0",
338− "js-uri": "3.1.0",
339− "jsdom": "1.0.0",
340− "json": "1.1.0",
341− "json-codecs": "5.0.0",
342− "justifill": "0.5.0",
343− "jwt": "0.0.9",
344− "labeled-data": "0.2.0",
345− "language-cst-parser": "0.14.1",
346− "lazy": "6.0.0",
347− "lazy-joe": "1.0.0",
348− "lcg": "4.0.0",
349− "leibniz": "5.0.0",
350− "leveldb": "1.0.1",
351− "liminal": "1.0.1",
352− "linalg": "6.0.0",
353− "lists": "7.0.0",
354− "literals": "1.0.2",
355− "logging": "3.0.0",
356− "logging-journald": "0.4.0",
357− "lumi-components": "18.0.0",
358− "machines": "7.0.0",
359− "maps-eager": "0.5.0",
360− "marionette": "1.0.0",
361− "marionette-react-basic-hooks": "0.1.1",
362− "marked": "0.1.0",
363− "matrices": "5.0.1",
364− "matryoshka": "1.0.0",
365− "maybe": "6.0.0",
366− "media-types": "6.0.0",
367− "meowclient": "1.0.0",
368− "midi": "4.0.0",
369− "milkis": "9.0.0",
370− "mimetype": "0.0.1",
371− "minibench": "4.0.1",
372− "mmorph": "7.0.0",
373− "monad-control": "5.0.0",
374− "monad-logger": "1.3.1",
375− "monad-loops": "0.5.0",
376− "monad-unlift": "1.0.1",
377− "monoid-extras": "0.0.1",
378− "monoidal": "0.16.0",
379− "morello": "0.4.0",
380− "mote": "3.0.0",
381− "motsunabe": "2.0.0",
382− "mvc": "0.0.1",
383− "mysql": "6.0.1",
384− "n3": "0.1.0",
385− "nano-id": "1.1.0",
386− "nanoid": "0.1.0",
387− "naturals": "3.0.0",
388− "nested-functor": "0.2.1",
389− "newtype": "5.0.0",
390− "nextjs": "0.1.1",
391− "nextui": "0.2.0",
392− "node-buffer": "9.0.0",
393− "node-child-process": "11.1.0",
394− "node-event-emitter": "3.0.0",
395− "node-execa": "5.0.0",
396− "node-fs": "9.2.0",
397− "node-glob-basic": "2.0.0",
398− "node-http": "9.1.0",
399− "node-http2": "1.1.1",
400− "node-human-signals": "1.0.0",
401− "node-net": "5.1.0",
402− "node-os": "5.1.0",
403− "node-path": "5.0.1",
404− "node-process": "11.2.0",
405− "node-readline": "8.1.1",
406− "node-sqlite3": "8.0.0",
407− "node-stream-pipes": "2.1.6",
408− "node-streams": "9.0.1",
409− "node-tls": "0.3.1",
410− "node-url": "7.0.1",
411− "node-workerbees": "0.3.1",
412− "node-zlib": "0.4.0",
413− "nonempty": "7.0.0",
414− "now": "6.0.0",
415− "npm-package-json": "2.0.0",
416− "nullable": "6.0.0",
417− "numberfield": "0.2.2",
418− "numbers": "9.0.1",
419− "oak": "3.1.1",
420− "oak-debug": "1.2.2",
421− "object-maps": "0.3.0",
422− "ocarina": "1.5.4",
423− "oooooooooorrrrrrrmm-lib": "0.0.1",
424− "open-colors-scales-and-schemes": "1.0.0",
425− "open-drawing": "6.0.4",
426− "open-folds": "6.4.0",
427− "open-foreign-generic": "11.0.3",
428− "open-memoize": "6.2.0",
429− "open-mkdirp-aff": "1.2.0",
430− "open-pairing": "6.2.0",
431− "open-smolder": "12.0.2",
432− "options": "7.0.0",
433− "optparse": "5.0.1",
434− "ordered-collections": "3.2.0",
435− "ordered-set": "0.5.0",
436− "orders": "6.0.0",
437− "org-doc": "0.1.0",
438− "owoify": "1.2.0",
439− "pairs": "9.0.1",
440− "parallel": "7.0.0",
441− "parsing": "11.0.0",
442− "parsing-dataview": "3.2.4",
443− "partial": "4.0.0",
444− "pathy": "9.0.0",
445− "pha": "0.13.0",
446− "phaser": "0.7.0",
447− "phylio": "1.1.2",
448− "pipes": "8.0.0",
449− "pirates-charm": "0.0.1",
450− "play": "1.0.0",
451− "pmock": "0.9.0",
452− "point-free": "1.0.0",
453− "pointed-list": "0.5.1",
454− "polymorphic-vectors": "4.0.0",
455− "posix-types": "6.0.0",
456− "postgresql": "2.0.21",
457− "precise": "6.0.0",
458− "precise-datetime": "7.0.0",
459− "prelude": "6.0.2",
460− "prettier-printer": "3.0.0",
461− "printf": "0.1.0",
462− "priority-queue": "0.1.2",
463− "profunctor": "6.0.1",
464− "profunctor-lenses": "8.0.0",
465− "protobuf": "4.4.0",
466− "psa-utils": "8.0.0",
467− "psci-support": "6.0.0",
468− "punycode": "1.0.0",
469− "pursfmt": "0.17.0",
470− "qualified-do": "2.2.0",
471− "quantities": "12.2.0",
472− "quickcheck": "8.0.1",
473− "quickcheck-combinators": "0.1.3",
474− "quickcheck-laws": "7.0.0",
475− "quickcheck-utf8": "0.0.0",
476− "random": "6.0.0",
477− "rationals": "6.0.0",
478− "rdf": "0.1.0",
479− "react": "11.0.0",
480− "react-aria": "0.2.0",
481− "react-basic": "17.0.0",
482− "react-basic-classic": "3.0.0",
483− "react-basic-dnd": "10.1.0",
484− "react-basic-dom": "7.0.0",
485− "react-basic-dom-beta": "0.1.1",
486− "react-basic-emotion": "7.1.0",
487− "react-basic-hooks": "9.0.0",
488− "react-basic-storybook": "2.0.0",
489− "react-dom": "8.0.0",
490− "react-halo": "3.0.0",
491− "react-icons": "1.1.5",
492− "react-markdown": "0.1.0",
493− "react-testing-library": "4.0.1",
494− "react-virtuoso": "1.0.0",
495− "reactix": "0.6.1",
496− "read": "1.0.1",
497− "recharts": "1.1.0",
498− "record": "4.0.0",
499− "record-extra": "5.0.1",
500− "record-extra-srghma": "0.2.8",
501− "record-ptional-fields": "0.1.2",
502− "record-studio": "1.0.4",
503− "refs": "6.0.0",
504− "remotedata": "5.0.1",
505− "repr": "0.5.0",
506− "resize-arrays": "0.0.1",
507− "resize-observer": "1.0.0",
508− "resource": "2.0.1",
509− "resourcet": "1.0.0",
510− "result": "1.0.3",
511− "return": "0.2.0",
512− "ring-modules": "5.0.1",
513− "rito": "0.3.4",
514− "roman": "0.4.0",
515− "rough-notation": "1.0.2",
516− "routing": "11.0.0",
517− "routing-duplex": "0.7.0",
518− "run": "5.0.0",
519− "safe-coerce": "2.0.0",
520− "safely": "4.0.1",
521− "school-of-music": "1.3.0",
522− "selection-foldable": "0.2.0",
523− "selective-functors": "1.0.1",
524− "semirings": "7.0.0",
525− "shuffle": "2.0.0",
526− "sigil": "0.2.0",
527− "signal": "13.0.0",
528− "simple-emitter": "3.0.1",
529− "simple-i18n": "2.0.1",
530− "simple-json": "9.0.0",
531− "simple-json-generics": "0.2.1",
532− "simple-ulid": "3.0.0",
533− "sized-matrices": "1.0.0",
534− "sized-vectors": "5.0.2",
535− "slug": "3.2.0",
536− "small-ffi": "4.0.1",
537− "soundfonts": "4.1.0",
538− "sparse-matrices": "2.0.1",
539− "sparse-polynomials": "3.0.1",
540− "spec": "8.1.1",
541− "spec-discovery": "8.4.1",
542− "spec-mocha": "5.1.1",
543− "spec-node": "0.0.3",
544− "spec-quickcheck": "5.0.2",
545− "spec-reporter-xunit": "0.7.1",
546− "splitmix": "2.1.0",
547− "ssrs": "1.0.0",
548− "st": "6.2.0",
549− "statistics": "0.3.2",
550− "strictlypositiveint": "1.0.1",
551− "string-parsers": "8.0.0",
552− "strings": "6.0.1",
553− "strings-extra": "4.0.0",
554− "stringutils": "0.0.12",
555− "structured-logging": "1.0.0",
556− "substitute": "0.2.3",
557− "supply": "0.2.0",
558− "svg-parser": "3.0.0",
559− "systemd-journald": "0.3.0",
560− "tagged": "4.0.2",
561− "tailrec": "6.1.0",
562− "tanstack-query": "2.0.0",
563− "tecton": "0.2.1",
564− "tecton-halogen": "0.2.0",
565− "test-unit": "17.0.0",
566− "text-formatting": "0.1.0",
567− "thermite": "6.3.1",
568− "thermite-dom": "0.3.1",
569− "these": "6.0.0",
570− "threading": "0.0.3",
571− "tidy": "0.11.1",
572− "tidy-codegen": "4.0.1",
573− "tldr": "0.0.0",
574− "toestand": "0.9.0",
575− "transformation-matrix": "1.0.1",
576− "transformers": "6.1.0",
577− "transit": "1.0.0",
578− "tree-rose": "4.0.2",
579− "trivial-unfold": "0.5.0",
580− "ts-bridge": "4.0.0",
581− "tuples": "7.0.0",
582− "two-or-more": "1.0.0",
583− "type-equality": "4.0.1",
584− "typedenv": "2.0.1",
585− "typelevel": "6.0.0",
586− "typelevel-lists": "2.1.0",
587− "typelevel-peano": "1.0.1",
588− "typelevel-prelude": "7.0.0",
589− "typelevel-regex": "0.0.3",
590− "typelevel-rows": "0.1.0",
591− "typisch": "0.4.0",
592− "uint": "7.0.0",
593− "ulid": "3.0.1",
594− "uncurried-transformers": "1.1.0",
595− "undefined": "2.0.0",
596− "undefined-is-not-a-problem": "1.1.0",
597− "unfoldable": "6.0.0",
598− "unicode": "6.0.0",
599− "unique": "0.6.1",
600− "unlift": "1.0.1",
601− "unordered-collections": "3.1.0",
602− "unsafe-coerce": "6.0.0",
603− "unsafe-reference": "5.0.0",
604− "untagged-to-tagged": "0.1.4",
605− "untagged-union": "1.0.0",
606− "uri": "9.0.0",
607− "url-immutable": "1.0.0",
608− "url-regex-safe": "0.1.1",
609− "uuid": "9.0.0",
610− "uuidv4": "1.0.0",
611− "validation": "6.0.0",
612− "variant": "8.0.0",
613− "variant-encodings": "2.0.0",
614− "variant-gen": "1.0.0",
615− "vectorfield": "1.0.1",
616− "vectors": "2.1.0",
617− "versions": "7.0.0",
618− "visx": "0.0.2",
619− "vitest": "2.0.0",
620− "web-clipboard": "6.0.0",
621− "web-cssom": "2.0.0",
622− "web-cssom-view": "0.1.0",
623− "web-dom": "6.0.0",
624− "web-dom-parser": "8.0.0",
625− "web-dom-xpath": "3.0.0",
626− "web-encoding": "3.0.0",
627− "web-events": "4.0.0",
628− "web-fetch": "4.0.1",
629− "web-file": "4.0.0",
630− "web-geometry": "0.1.0",
631− "web-html": "4.1.1",
632− "web-pointerevents": "2.0.0",
633− "web-proletarian": "1.0.0",
634− "web-promise": "3.2.0",
635− "web-resize-observer": "2.1.0",
636− "web-router": "1.0.0",
637− "web-socket": "4.0.0",
638− "web-storage": "5.0.0",
639− "web-streams": "4.0.0",
640− "web-touchevents": "4.0.0",
641− "web-uievents": "5.0.0",
642− "web-url": "2.0.0",
643− "web-workers": "1.1.0",
644− "web-xhr": "5.0.1",
645− "webb-aff-list": "0.0.2",
646− "webb-array": "0.0.2",
647− "webb-channel": "0.0.3",
648− "webb-commandline": "0.0.3",
649− "webb-directory": "0.0.7",
650− "webb-file": "0.0.1",
651− "webb-map": "0.0.1",
652− "webb-monad": "0.0.2",
653− "webb-mutex": "0.0.7",
654− "webb-parsing": "0.0.5",
655− "webb-random": "0.0.1",
656− "webb-refer": "0.0.3",
657− "webb-set": "0.0.1",
658− "webb-slot": "0.0.1",
659− "webb-stateful": "0.0.3",
660− "webb-string": "0.0.1",
661− "webb-test": "0.0.1",
662− "webb-thread": "0.0.2",
663− "webb-writer": "0.0.3",
664− "webextension-polyfill": "0.1.0",
665− "webgpu": "0.0.1",
666− "which": "2.0.0",
667− "whine-core": "0.0.33",
668− "xterm": "1.0.0",
669− "yaml-next": "3.1.1",
670− "yoga-fetch": "1.0.1",
671− "yoga-json": "5.1.0",
672− "yoga-om": "0.1.0",
673− "yoga-postgres": "6.0.0",
674− "yoga-react-dom": "1.0.1",
675− "yoga-redis": "0.1.0",
676− "yoga-sql-types": "0.1.0",
677− "yoga-subtlecrypto": "0.1.0",
678− "yoga-test-docker": "0.1.0",
679− "yoga-tree": "1.0.0",
680− "yoga-tree-svg": "0.1.0",
681− "yoga-tree-utils": "1.0.0",
682− "z3": "0.0.2",
683− "zipperarray": "2.0.0"
684− }
685− },
686− "extra_packages": {
687− "yoga-om": "1.5.1"
688− }
94+ "extra_packages": {}
68995 },
69096 "packages": {
69197 "aff": {
@@ -1595,8 +1001,8 @@
15951001 },
15961002 "spec": {
15971003 "type": "registry",
1598− "version": "8.1.1",
1599− "integrity": "sha256-b6qjDb7lUJGLV+WEoywLu6BCXC4zGpfbN43mTL+vBeI=",
1004+ "version": "8.1.2",
1005+ "integrity": "sha256-klPPJ6lBQI1CGOAdLJ+ZoGRt8XZippkTKjn53BrSkL0=",
16001006 "dependencies": [
16011007 "aff",
16021008 "ansi",
@@ -1809,8 +1215,8 @@
18091215 },
18101216 "yoga-om": {
18111217 "type": "registry",
1812− "version": "1.5.1",
1813− "integrity": "sha256-Fx9Or+0JO7uOYcjbKX0LeY+9fuIxYilZTMd4Q1eje0k=",
1218+ "version": "1.5.2",
1219+ "integrity": "sha256-2ys14BF6NPgzFDFUIFk0EDxmqkA8+yghIA9TXHlOmE0=",
18141220 "dependencies": [
18151221 "aff",
18161222 "aff-retry",
spago.yaml+5−10
@@ -1,13 +1,8 @@
1−workspace:
2− packageSet:
3− registry: 73.2.0
4− extraPackages:
5− yoga-om: "1.5.1"
6−
1+workspace: {}
72package:
83 name: yoga-om-strom
94 publish:
10− version: 0.4.1
5+ version: 0.4.3
116 license: MIT-0
127 exclude:
138 - "src/**/*.test.purs"
@@ -16,7 +11,7 @@ package:
1611 githubOwner: rowtype-yoga
1712 githubRepo: purescript-yoga-om-strom
1813 dependencies:
19− - aff: ">=7.1.0 <8.0.0"
14+ - aff: ">=8.0.0 <9.0.0"
2015 - arrays: ">=7.3.0 <8.0.0"
2116 - avar: ">=5.0.1 <6.0.0"
2217 - catenable-lists: ">=7.0.0 <8.0.0"
@@ -33,13 +28,13 @@ package:
3328 - now: ">=6.0.0 <7.0.0"
3429 - prelude: ">=6.0.2 <7.0.0"
3530 - refs: ">=6.0.0 <7.0.0"
36− - spec: ">=8.1.1 <9.0.0"
31+ - spec: ">=8.1.2 <9.0.0"
3732 - st: ">=6.2.0 <7.0.0"
3833 - tailrec: ">=6.1.0 <7.0.0"
3934 - transformers: ">=6.1.0 <7.0.0"
4035 - tuples: ">=7.0.0 <8.0.0"
4136 - variant: ">=8.0.0 <9.0.0"
42− - yoga-om: ">=1.3.0 <2.0.0"
37+ - yoga-om: ">=1.5.2 <2.0.0"
4338 test:
4439 main: Test.Main.Strom
4540 dependencies:
src/Yoga/Om/Strom.purs+50−69
@@ -65,6 +65,7 @@ module Yoga.Om.Strom
6565 , partitionMap
6666 -- Timing
6767 , debounce
68+ , debounceEach
6869 , throttle
6970 , delayStrom
7071 -- Combining
@@ -138,12 +139,10 @@ import Effect.Aff (Aff, Error, delay, forkAff, killFiber)
138139import Effect.Aff.AVar as AVar
139140import Effect.Aff.Class (liftAff)
140141import Effect.Exception as Exception
141−import Effect.Now (now)
142142import Effect.Ref as Ref
143143import Effect.Class (liftEffect)
144144import Data.CatQueue as CatQueue
145145import Data.CatQueue (CatQueue)
146−import Data.DateTime.Instant (unInstant)
147146import Yoga.Om (Om)
148147import Yoga.Om as Om
149148
@@ -460,7 +459,7 @@ tapMStrom f stream = mkStrom do
460459bindStrom :: forall ctx err a b. (a -> Strom ctx err b) -> Strom ctx err a -> Strom ctx err b
461460bindStrom f stream = stream >>= f
462461
463−-- | Scan with accumulator (like foldl but emits intermediate results)
462+-- | Scan with accumulator (like foldl but emits intermediate results)
464463scanStrom :: forall ctx err a b. (b -> a -> b) -> b -> Strom ctx err a -> Strom ctx err b
465464scanStrom f initial stream = scanHelper initial stream
466465 where
@@ -687,11 +686,12 @@ collectStrom f stream = mkStrom do
687686 pure $ Done $ if Array.null collected then Nothing else Just collected
688687 Loop ((maybeChunk /\ next)) ->
689688 do
690− let collected = case maybeChunk of
691− Nothing -> Nothing
692− Just chunk -> do
693− let c = Array.mapMaybe f chunk
694− if Array.null c then Nothing else Just c
689+ let
690+ collected = case maybeChunk of
691+ Nothing -> Nothing
692+ Just chunk -> do
693+ let c = Array.mapMaybe f chunk
694+ if Array.null c then Nothing else Just c
695695
696696 pure $ Loop $ (collected /\ (collectStrom f next))
697697
@@ -714,7 +714,7 @@ collectMStrom f stream = mkStrom do
714714 pure $ if Array.null c then Nothing else Just c
715715 pure $ Loop $ (collected /\ (collectMStrom f next))
716716
717−-- | Remove consecutive duplicates
717+-- | Remove consecutive duplicates
718718changesStrom :: forall ctx err a. Eq a => Strom ctx err a -> Strom ctx err a
719719changesStrom stream = changesHelper Nothing stream
720720 where
@@ -796,8 +796,9 @@ groupedStrom size stream
796796 | n <= 0 || Array.null arr = []
797797 | otherwise =
798798 do
799− let group = Array.take n arr
800− rest = Array.drop n arr
799+ let
800+ group = Array.take n arr
801+ rest = Array.drop n arr
801802 if Array.null group then [] else Array.cons group (groupsOf n rest)
802803
803804-- | Alias for groupedStrom
@@ -864,12 +865,13 @@ partition predicate stream =
864865partitionMap :: forall ctx err a b c. (a -> Either b c) -> Strom ctx err a -> ((Strom ctx err b) /\ (Strom ctx err c))
865866partitionMap f stream =
866867 do
867− let leftOnly x = case f x of
868− Left b -> Just b
869− Right _ -> Nothing
870− rightOnly x = case f x of
871− Left _ -> Nothing
872− Right c -> Just c
868+ let
869+ leftOnly x = case f x of
870+ Left b -> Just b
871+ Right _ -> Nothing
872+ rightOnly x = case f x of
873+ Left _ -> Nothing
874+ Right c -> Just c
873875 (collectStrom leftOnly stream)
874876 /\ (collectStrom rightOnly stream)
875877
@@ -887,49 +889,24 @@ debounce duration stream = mkStrom do
887889 Done (Just chunk) -> do
888890 Om.delay duration
889891 pure $ Done $ Just chunk
890− Loop ((maybeChunk /\ next)) -> do
892+ Loop (maybeChunk /\ next) -> do
891893 case maybeChunk of
892894 Nothing -> pure $ Loop $ (Nothing /\ (debounce duration next))
893895 Just chunk -> do
894896 Om.delay duration
895897 pure $ Loop $ ((Just chunk) /\ (debounce duration next))
896898
897−-- | Throttle a stream - emit at most once per duration period
898−-- | Tracks last emission time and skips elements that arrive too quickly
899−-- | Note: Uses wall-clock time, not processing time
899+-- | Debounce a stream per element - adds a delay after each individual element
900+debounceEach :: forall ctx err a. Milliseconds -> Strom ctx err a -> Strom ctx err a
901+debounceEach duration stream = stream # bindStrom \a -> mkStrom do
902+ Om.delay duration
903+ pure $ Done $ Just [ a ]
904+
905+-- | Throttle a stream - emits at most one element per duration period
900906throttle :: forall ctx err a. Milliseconds -> Strom ctx err a -> Strom ctx err a
901−throttle (Milliseconds duration) stream = throttleWithState 0.0 stream
902− where
903− throttleWithState lastEmit s = mkStrom do
904− step <- runStrom s
905− case step of
906− Done Nothing -> pure $ Done Nothing
907− Done (Just chunk) -> do
908− (_ /\ filtered) <- filterByTime lastEmit chunk
909− pure $ Done $ if Array.null filtered then Nothing else Just filtered
910− Loop ((maybeChunk /\ next)) -> do
911− case maybeChunk of
912− Nothing -> pure $ Loop $ (Nothing /\ (throttleWithState lastEmit next))
913− Just chunk -> do
914− (newLastEmit /\ filtered) <- filterByTime lastEmit chunk
915− if Array.null filtered then pure $ Loop $ (Nothing /\ (throttleWithState newLastEmit next))
916− else pure $ Loop $ ((Just filtered) /\ (throttleWithState newLastEmit next))
917−
918− filterByTime lastEmit chunk = do
919− (newLastEmit /\ results) <- Array.foldl
920− ( \acc value -> do
921− (currentLast /\ filtered) <- acc
922− currentTime <- liftEffect now
923− let Milliseconds currentMillis = unInstant currentTime
924− let elapsed = currentMillis - currentLast
925− if elapsed >= duration then
926− pure $ (currentMillis /\ (Array.snoc filtered value))
927− else
928− pure $ (currentLast /\ filtered)
929− )
930− (pure $ (lastEmit /\ []))
931− chunk
932− pure $ (newLastEmit /\ results)
907+throttle duration stream = stream # bindStrom \a -> mkStrom do
908+ Om.delay duration
909+ pure $ Done $ Just [ a ]
933910
934911-- | Delay each element by a duration
935912delayStrom :: forall ctx err a. Milliseconds -> Strom ctx err a -> Strom ctx err a
@@ -1010,20 +987,20 @@ traverseMStrom_ = traverseStrom_
1010987--------------------------------------------------------------------------------
1011988
1012989-- | Run a stream in the background, returning a Fiber that can be cancelled
1013−-- |
990+-- |
1014991-- | To use cancellable streams, convert your stream to Om and use Om.launchOm:
1015−-- |
992+-- |
1016993-- | Example:
1017994-- | ```purescript
1018995-- | fiber <- Om.launchOm ctx handlers (Strom.runCollect myStream)
1019996-- | -- ... later ...
1020997-- | killFiber (error "Cancelled") fiber
1021998-- | ```
1022−-- |
999+-- |
10231000-- | Or for subscription-style:
10241001-- | ```purescript
10251002-- | fiber <- Om.launchOm ctx handlers (Strom.traverseStrom_ callback myStream)
1026−-- | -- ... later ...
1003+-- | -- ... later ...
10271004-- | killFiber (error "Unsubscribed") fiber
10281005-- | ```
10291006-- |
@@ -1568,8 +1545,9 @@ mapPar concurrency f stream
15681545 | n <= 0 || Array.null arr = []
15691546 | otherwise =
15701547 do
1571− let group = Array.take n arr
1572− rest = Array.drop n arr
1548+ let
1549+ group = Array.take n arr
1550+ rest = Array.drop n arr
15731551 if Array.null group then [] else Array.cons group (chunksOf n rest)
15741552
15751553-- | Unordered parallel map (currently same as mapPar)
@@ -1715,10 +1693,11 @@ instance Apply (Strom ctx err) where
17151693 case stepF, stepA of
17161694 Done (Just funcs), Done (Just vals) ->
17171695 do
1718− let results = do
1719− f <- funcs
1720− a <- vals
1721− pure (f a)
1696+ let
1697+ results = do
1698+ f <- funcs
1699+ a <- vals
1700+ pure (f a)
17221701 pure $ Done $ Just results
17231702 Done Nothing, _ -> pure $ Done Nothing
17241703 _, Done Nothing -> pure $ Done Nothing
@@ -1727,10 +1706,11 @@ instance Apply (Strom ctx err) where
17271706 case maybeChunkF, maybeChunkA of
17281707 Just chunkF, Just chunkA ->
17291708 do
1730− let applied = do
1731− f <- chunkF
1732− a <- chunkA
1733− pure (f a)
1709+ let
1710+ applied = do
1711+ f <- chunkF
1712+ a <- chunkA
1713+ pure (f a)
17341714 pure $ Loop $ ((Just applied) /\ (nextF <*> nextA))
17351715 _, _ -> pure $ Loop $ (Nothing /\ (nextF <*> nextA))
17361716 Loop ((_ /\ nextF)), _ -> pure $ Loop $ (Nothing /\ (nextF <*> as))
@@ -1755,8 +1735,9 @@ instance Bind (Strom ctx err) where
17551735 Nothing -> pure $ Loop $ (Nothing /\ (next >>= f))
17561736 Just chunk ->
17571737 do
1758− let streams = Functor.map f chunk
1759− prefixStream = concatStrom streams
1738+ let
1739+ streams = Functor.map f chunk
1740+ prefixStream = concatStrom streams
17601741 runStrom $ appendStrom prefixStream (next >>= f)
17611742 )
17621743