git.iko.soy/rowtype-yoga/purescript-yoga-om-strom
on e10b6e8 help sign in
4 files changed+681−64
since splitsnapshots
unifiedsplit
README.md−1 spago.lock+602−8 spago.yaml+10−5 src/Yoga/Om/Strom.purs+69−50
README.md−1
@@ -441,4 +441,3 @@ This design enables:
441441## Credits
442442
443443Inspired by [ZIO ZStream](https://zio.dev/reference/stream/zstream) from the Scala ZIO ecosystem.
444−
spago.lock+602−8
@@ -6,7 +6,7 @@
66 "core": {
77 "dependencies": [
88 {
9− "aff": ">=8.0.0 <9.0.0"
9+ "aff": ">=7.1.0 <8.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.2 <9.0.0"
60+ "spec": ">=8.1.1 <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.5.2 <2.0.0"
78+ "yoga-om": ">=1.3.0 <2.0.0"
7979 }
8080 ]
8181 },
@@ -91,7 +91,601 @@
9191 }
9292 }
9393 },
94− "extra_packages": {}
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+ }
95689 },
96690 "packages": {
97691 "aff": {
@@ -1001,8 +1595,8 @@
10011595 },
10021596 "spec": {
10031597 "type": "registry",
1004− "version": "8.1.2",
1005− "integrity": "sha256-klPPJ6lBQI1CGOAdLJ+ZoGRt8XZippkTKjn53BrSkL0=",
1598+ "version": "8.1.1",
1599+ "integrity": "sha256-b6qjDb7lUJGLV+WEoywLu6BCXC4zGpfbN43mTL+vBeI=",
10061600 "dependencies": [
10071601 "aff",
10081602 "ansi",
@@ -1215,8 +1809,8 @@
12151809 },
12161810 "yoga-om": {
12171811 "type": "registry",
1218− "version": "1.5.2",
1219− "integrity": "sha256-2ys14BF6NPgzFDFUIFk0EDxmqkA8+yghIA9TXHlOmE0=",
1812+ "version": "1.5.1",
1813+ "integrity": "sha256-Fx9Or+0JO7uOYcjbKX0LeY+9fuIxYilZTMd4Q1eje0k=",
12201814 "dependencies": [
12211815 "aff",
12221816 "aff-retry",
spago.yaml+10−5
@@ -1,8 +1,13 @@
1−workspace: {}
1+workspace:
2+ packageSet:
3+ registry: 73.2.0
4+ extraPackages:
5+ yoga-om: "1.5.1"
6+
27package:
38 name: yoga-om-strom
49 publish:
5− version: 0.4.3
10+ version: 0.4.1
611 license: MIT-0
712 exclude:
813 - "src/**/*.test.purs"
@@ -11,7 +16,7 @@ package:
1116 githubOwner: rowtype-yoga
1217 githubRepo: purescript-yoga-om-strom
1318 dependencies:
14− - aff: ">=8.0.0 <9.0.0"
19+ - aff: ">=7.1.0 <8.0.0"
1520 - arrays: ">=7.3.0 <8.0.0"
1621 - avar: ">=5.0.1 <6.0.0"
1722 - catenable-lists: ">=7.0.0 <8.0.0"
@@ -28,13 +33,13 @@ package:
2833 - now: ">=6.0.0 <7.0.0"
2934 - prelude: ">=6.0.2 <7.0.0"
3035 - refs: ">=6.0.0 <7.0.0"
31− - spec: ">=8.1.2 <9.0.0"
36+ - spec: ">=8.1.1 <9.0.0"
3237 - st: ">=6.2.0 <7.0.0"
3338 - tailrec: ">=6.1.0 <7.0.0"
3439 - transformers: ">=6.1.0 <7.0.0"
3540 - tuples: ">=7.0.0 <8.0.0"
3641 - variant: ">=8.0.0 <9.0.0"
37− - yoga-om: ">=1.5.2 <2.0.0"
42+ - yoga-om: ">=1.3.0 <2.0.0"
3843 test:
3944 main: Test.Main.Strom
4045 dependencies:
src/Yoga/Om/Strom.purs+69−50
@@ -65,7 +65,6 @@ module Yoga.Om.Strom
6565 , partitionMap
6666 -- Timing
6767 , debounce
68− , debounceEach
6968 , throttle
7069 , delayStrom
7170 -- Combining
@@ -139,10 +138,12 @@ import Effect.Aff (Aff, Error, delay, forkAff, killFiber)
139138import Effect.Aff.AVar as AVar
140139import Effect.Aff.Class (liftAff)
141140import 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)
146147import Yoga.Om (Om)
147148import Yoga.Om as Om
148149
@@ -459,7 +460,7 @@ tapMStrom f stream = mkStrom do
459460bindStrom :: forall ctx err a b. (a -> Strom ctx err b) -> Strom ctx err a -> Strom ctx err b
460461bindStrom f stream = stream >>= f
461462
462−-- | Scan with accumulator (like foldl but emits intermediate results)
463+-- | Scan with accumulator (like foldl but emits intermediate results)
463464scanStrom :: forall ctx err a b. (b -> a -> b) -> b -> Strom ctx err a -> Strom ctx err b
464465scanStrom f initial stream = scanHelper initial stream
465466 where
@@ -686,12 +687,11 @@ collectStrom f stream = mkStrom do
686687 pure $ Done $ if Array.null collected then Nothing else Just collected
687688 Loop ((maybeChunk /\ next)) ->
688689 do
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
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
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,9 +796,8 @@ groupedStrom size stream
796796 | n <= 0 || Array.null arr = []
797797 | otherwise =
798798 do
799− let
800− group = Array.take n arr
801− rest = Array.drop n arr
799+ let group = Array.take n arr
800+ rest = Array.drop n arr
802801 if Array.null group then [] else Array.cons group (groupsOf n rest)
803802
804803-- | Alias for groupedStrom
@@ -865,13 +864,12 @@ partition predicate stream =
865864partitionMap :: forall ctx err a b c. (a -> Either b c) -> Strom ctx err a -> ((Strom ctx err b) /\ (Strom ctx err c))
866865partitionMap f stream =
867866 do
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
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
875873 (collectStrom leftOnly stream)
876874 /\ (collectStrom rightOnly stream)
877875
@@ -889,24 +887,49 @@ debounce duration stream = mkStrom do
889887 Done (Just chunk) -> do
890888 Om.delay duration
891889 pure $ Done $ Just chunk
892− Loop (maybeChunk /\ next) -> do
890+ Loop ((maybeChunk /\ next)) -> do
893891 case maybeChunk of
894892 Nothing -> pure $ Loop $ (Nothing /\ (debounce duration next))
895893 Just chunk -> do
896894 Om.delay duration
897895 pure $ Loop $ ((Just chunk) /\ (debounce duration next))
898896
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
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
906900throttle :: forall ctx err a. Milliseconds -> Strom ctx err a -> Strom ctx err a
907−throttle duration stream = stream # bindStrom \a -> mkStrom do
908− Om.delay duration
909− pure $ Done $ Just [ 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)
910933
911934-- | Delay each element by a duration
912935delayStrom :: forall ctx err a. Milliseconds -> Strom ctx err a -> Strom ctx err a
@@ -987,20 +1010,20 @@ traverseMStrom_ = traverseStrom_
9871010--------------------------------------------------------------------------------
9881011
9891012-- | Run a stream in the background, returning a Fiber that can be cancelled
990−-- |
1013+-- |
9911014-- | To use cancellable streams, convert your stream to Om and use Om.launchOm:
992−-- |
1015+-- |
9931016-- | Example:
9941017-- | ```purescript
9951018-- | fiber <- Om.launchOm ctx handlers (Strom.runCollect myStream)
9961019-- | -- ... later ...
9971020-- | killFiber (error "Cancelled") fiber
9981021-- | ```
999−-- |
1022+-- |
10001023-- | Or for subscription-style:
10011024-- | ```purescript
10021025-- | fiber <- Om.launchOm ctx handlers (Strom.traverseStrom_ callback myStream)
1003−-- | -- ... later ...
1026+-- | -- ... later ...
10041027-- | killFiber (error "Unsubscribed") fiber
10051028-- | ```
10061029-- |
@@ -1545,9 +1568,8 @@ mapPar concurrency f stream
15451568 | n <= 0 || Array.null arr = []
15461569 | otherwise =
15471570 do
1548− let
1549− group = Array.take n arr
1550− rest = Array.drop n arr
1571+ let group = Array.take n arr
1572+ rest = Array.drop n arr
15511573 if Array.null group then [] else Array.cons group (chunksOf n rest)
15521574
15531575-- | Unordered parallel map (currently same as mapPar)
@@ -1693,11 +1715,10 @@ instance Apply (Strom ctx err) where
16931715 case stepF, stepA of
16941716 Done (Just funcs), Done (Just vals) ->
16951717 do
1696− let
1697− results = do
1698− f <- funcs
1699− a <- vals
1700− pure (f a)
1718+ let results = do
1719+ f <- funcs
1720+ a <- vals
1721+ pure (f a)
17011722 pure $ Done $ Just results
17021723 Done Nothing, _ -> pure $ Done Nothing
17031724 _, Done Nothing -> pure $ Done Nothing
@@ -1706,11 +1727,10 @@ instance Apply (Strom ctx err) where
17061727 case maybeChunkF, maybeChunkA of
17071728 Just chunkF, Just chunkA ->
17081729 do
1709− let
1710− applied = do
1711− f <- chunkF
1712− a <- chunkA
1713− pure (f a)
1730+ let applied = do
1731+ f <- chunkF
1732+ a <- chunkA
1733+ pure (f a)
17141734 pure $ Loop $ ((Just applied) /\ (nextF <*> nextA))
17151735 _, _ -> pure $ Loop $ (Nothing /\ (nextF <*> nextA))
17161736 Loop ((_ /\ nextF)), _ -> pure $ Loop $ (Nothing /\ (nextF <*> as))
@@ -1735,9 +1755,8 @@ instance Bind (Strom ctx err) where
17351755 Nothing -> pure $ Loop $ (Nothing /\ (next >>= f))
17361756 Just chunk ->
17371757 do
1738− let
1739− streams = Functor.map f chunk
1740− prefixStream = concatStrom streams
1758+ let streams = Functor.map f chunk
1759+ prefixStream = concatStrom streams
17411760 runStrom $ appendStrom prefixStream (next >>= f)
17421761 )
17431762