From eaaeb071a2a37ac237238e974e8af0985be46cba Mon Sep 17 00:00:00 2001 From: orion kindel Date: Thu, 19 Feb 2026 17:10:12 -0600 Subject: [PATCH] initial commit --- bun.lockb | Bin 53117 -> 30482 bytes package.json | 5 +- spago.lock | 1827 ++++++++++++++++++++++++++++++++ spago.yaml | 41 +- src/Main.purs | 7 - src/Mujoco.XML.Node.Prop.purs | 75 ++ src/Mujoco.XML.Node.purs | 98 ++ src/Mujoco.purs | 1 + test/Main.purs | 13 + test/Mujoco.XML.Node.Prop.purs | 51 + 10 files changed, 2093 insertions(+), 25 deletions(-) create mode 100644 spago.lock delete mode 100644 src/Main.purs create mode 100644 src/Mujoco.XML.Node.Prop.purs create mode 100644 src/Mujoco.XML.Node.purs create mode 100644 src/Mujoco.purs create mode 100644 test/Main.purs create mode 100644 test/Mujoco.XML.Node.Prop.purs diff --git a/bun.lockb b/bun.lockb index c42d05ceb16556e06bd80e7e360bf13128ae05e8..7f27bdff192f6df82e1c88c475d4ecda9964911a 100755 GIT binary patch literal 30482 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 literal 53117 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 PI~KK=Wm9R{|M&MVW8Q-k diff --git a/package.json b/package.json index e446309..f244199 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "module": "index.js", "type": "module", "scripts": { - "fmt": "bun bun/fmt.js" + "fmt": "bun bun/fmt.js", + "spago": "spago" }, "devDependencies": { "bun-types": "1.0.11", "purs-tidy": "^0.10.0", - "spago": "next" + "spago": "^1.0.0" }, "peerDependencies": { "typescript": "^5.0.0" diff --git a/spago.lock b/spago.lock new file mode 100644 index 0000000..7f39648 --- /dev/null +++ b/spago.lock @@ -0,0 +1,1827 @@ +{ + "workspace": { + "packages": { + "mujoco-mjcf": { + "path": "./", + "core": { + "dependencies": [ + "arrays", + "elmish", + "elmish-html", + "integers", + "numbers", + "prelude", + "tuples", + "typelevel-prelude", + "unsafe-coerce" + ] + }, + "test": { + "dependencies": [ + "spec", + "spec-node" + ] + } + } + }, + "package_set": { + "address": { + "registry": "73.2.0" + }, + "compiler": ">=0.15.15 <0.16.0", + "content": { + "abc-parser": "2.1.0", + "ace": "9.1.0", + "address-rfc2821": "0.1.1", + "aff": "8.0.0", + "aff-bus": "6.0.0", + "aff-coroutines": "9.0.0", + "aff-promise": "4.0.0", + "aff-retry": "2.0.0", + "affjax": "13.0.0", + "affjax-node": "1.0.0", + "affjax-web": "1.0.0", + "ansi": "7.0.0", + "apexcharts": "0.5.0", + "applicative-phases": "1.0.0", + "argonaut": "9.0.0", + "argonaut-aeson-generic": "0.4.1", + "argonaut-codecs": "9.1.0", + "argonaut-core": "7.0.0", + "argonaut-generic": "8.0.0", + "argonaut-traversals": "10.0.0", + "argparse-basic": "2.0.0", + "array-builder": "0.1.2", + "array-search": "0.6.0", + "arraybuffer": "13.2.0", + "arraybuffer-builder": "3.1.0", + "arraybuffer-types": "3.0.2", + "arrays": "7.3.0", + "arrays-extra": "0.6.1", + "arrays-zipper": "2.0.1", + "ask": "1.0.0", + "assert": "6.0.0", + "assert-multiple": "0.4.0", + "avar": "5.0.1", + "axon": "0.0.3", + "b64": "0.0.8", + "barbies": "1.0.1", + "barlow-lens": "0.9.0", + "benchlib": "0.0.4", + "bifunctors": "6.1.0", + "bigints": "7.0.1", + "blessed": "1.0.0", + "bolson": "0.3.9", + "bookhound": "0.1.7", + "bower-json": "3.0.0", + "call-by-name": "4.0.1", + "canvas": "6.0.0", + "canvas-action": "9.0.0", + "cartesian": "1.0.6", + "catenable-lists": "7.0.0", + "cbor-stream": "1.3.0", + "chameleon": "1.0.0", + "chameleon-halogen": "1.0.3", + "chameleon-react-basic": "1.1.0", + "chameleon-styled": "2.5.0", + "chameleon-transformers": "1.0.0", + "channel": "1.0.0", + "checked-exceptions": "3.1.1", + "choku": "1.0.2", + "classless": "0.1.1", + "classless-arbitrary": "0.1.1", + "classless-decode-json": "0.1.1", + "classless-encode-json": "0.1.3", + "classnames": "2.0.0", + "codec": "6.1.0", + "codec-argonaut": "10.0.0", + "codec-json": "2.0.0", + "colors": "7.0.1", + "concur-core": "0.5.0", + "concur-react": "0.5.0", + "concurrent-queues": "3.0.0", + "console": "6.1.0", + "const": "6.0.0", + "contravariant": "6.0.0", + "control": "6.0.0", + "convertable-options": "1.0.0", + "coroutines": "7.0.0", + "css": "6.0.0", + "css-class-name-extractor": "0.0.4", + "css-frameworks": "1.1.0", + "csv-stream": "2.3.0", + "data-mvc": "0.0.2", + "datetime": "6.1.0", + "datetime-parsing": "0.2.0", + "debounce": "0.1.0", + "debug": "6.0.2", + "decimals": "7.1.0", + "default-values": "1.0.1", + "deku": "0.9.23", + "deno": "0.0.5", + "dissect": "1.0.0", + "distributive": "6.0.0", + "dodo-printer": "2.2.3", + "dom-filereader": "7.0.0", + "dom-indexed": "13.0.0", + "dom-simple": "0.4.0", + "dotenv": "4.0.3", + "droplet": "0.6.0", + "dts": "1.0.0", + "dual-numbers": "1.0.3", + "dynamic-buffer": "3.0.1", + "echarts-simple": "0.0.1", + "effect": "4.0.0", + "either": "6.1.0", + "elmish": "0.13.0", + "elmish-enzyme": "0.1.1", + "elmish-hooks": "0.11.0", + "elmish-html": "0.10.0", + "elmish-testing-library": "0.3.2", + "elmish-time-machine": "0.4.2", + "email-validate": "7.0.0", + "encoding": "0.0.9", + "enums": "6.0.1", + "env-names": "0.4.0", + "environment": "2.0.0", + "error": "2.0.0", + "eta-conversion": "0.3.2", + "exceptions": "6.1.0", + "exists": "6.0.0", + "exitcodes": "4.0.0", + "expect-inferred": "3.0.0", + "express": "0.9.1", + "ezfetch": "1.1.1", + "fahrtwind": "2.0.0", + "fakerjs": "0.0.1", + "fallback": "0.1.0", + "fast-vect": "1.2.0", + "fetch": "4.1.0", + "fetch-argonaut": "1.0.1", + "fetch-core": "5.1.0", + "fetch-yoga-json": "1.1.0", + "ffi-simple": "0.5.1", + "fft": "0.3.0", + "fft-js": "0.1.0", + "filterable": "5.0.0", + "fix-functor": "0.1.0", + "fixed-points": "7.0.0", + "fixed-precision": "5.0.0", + "flame": "1.6.0", + "float32": "2.0.0", + "fmt": "0.2.1", + "foldable-traversable": "6.0.0", + "foldable-traversable-extra": "0.0.6", + "foreign": "7.0.0", + "foreign-object": "4.1.0", + "foreign-readwrite": "3.4.0", + "forgetmenot": "0.1.0", + "fork": "6.0.0", + "form-urlencoded": "7.0.0", + "formatters": "7.0.0", + "framer-motion": "2.0.1", + "free": "7.1.0", + "freeap": "7.0.0", + "freer-free": "0.0.1", + "freet": "7.0.0", + "functions": "6.0.0", + "functor1": "3.0.0", + "functors": "5.0.0", + "fuzzy": "0.4.0", + "gen": "4.0.0", + "generate-values": "1.0.1", + "generic-router": "0.0.1", + "geojson": "0.0.5", + "geometria": "2.2.0", + "gesso": "1.0.1", + "gojs": "0.1.1", + "golem-fetch": "0.1.0", + "grain": "3.0.0", + "grain-router": "3.0.0", + "grain-virtualized": "3.0.0", + "graphql-client": "10.1.1", + "graphs": "8.1.0", + "group": "4.1.1", + "halogen": "7.0.0", + "halogen-bootstrap5": "5.3.2", + "halogen-canvas": "1.0.0", + "halogen-css": "10.0.0", + "halogen-declarative-canvas": "0.0.8", + "halogen-echarts-simple": "0.0.4", + "halogen-formless": "4.0.3", + "halogen-helix": "1.1.0", + "halogen-hooks": "0.6.3", + "halogen-hooks-extra": "0.9.0", + "halogen-infinite-scroll": "1.1.0", + "halogen-store": "0.5.4", + "halogen-storybook": "2.0.0", + "halogen-subscriptions": "2.0.0", + "halogen-svg-elems": "8.0.0", + "halogen-typewriter": "1.0.4", + "halogen-use-trigger-hooks": "1.0.0", + "halogen-vdom": "8.0.0", + "halogen-vdom-string-renderer": "0.5.0", + "halogen-xterm": "2.0.0", + "heckin": "2.0.1", + "heterogeneous": "0.7.0", + "homogeneous": "0.4.0", + "http-methods": "6.0.0", + "httpurple": "4.0.0", + "huffman": "0.4.0", + "humdrum": "0.0.1", + "hylograph-canvas": "0.1.0", + "hylograph-d3-kernel": "0.1.0", + "hylograph-graph": "0.1.0", + "hylograph-layout": "0.1.0", + "hylograph-music": "0.1.0", + "hylograph-optics": "0.1.0", + "hylograph-selection": "0.1.1", + "hylograph-simulation": "0.1.0", + "hylograph-simulation-core": "0.1.0", + "hylograph-simulation-halogen": "0.1.0", + "hylograph-transitions": "0.1.0", + "hylograph-wasm-kernel": "0.1.0", + "hyrule": "2.3.8", + "identity": "6.0.0", + "identy": "4.0.1", + "indexed-db": "1.0.0", + "indexed-monad": "3.0.0", + "ink": "0.0.1", + "int64": "3.0.0", + "integers": "6.0.0", + "interpolate": "5.0.2", + "intersection-observer": "1.0.1", + "invariant": "6.0.0", + "jarilo": "1.0.1", + "jelly": "0.10.0", + "jelly-router": "0.3.0", + "jelly-signal": "0.4.0", + "jest": "1.0.0", + "js-abort-controller": "1.0.0", + "js-bigints": "2.2.1", + "js-date": "8.0.0", + "js-fetch": "0.2.1", + "js-fileio": "3.0.0", + "js-intl": "1.1.4", + "js-iterators": "0.1.1", + "js-maps": "0.1.2", + "js-promise": "1.0.0", + "js-promise-aff": "1.0.0", + "js-timers": "6.1.0", + "js-uri": "3.1.0", + "jsdom": "1.0.0", + "json": "1.1.0", + "json-codecs": "5.0.0", + "justifill": "0.5.0", + "jwt": "0.0.9", + "labeled-data": "0.2.0", + "language-cst-parser": "0.14.1", + "lazy": "6.0.0", + "lazy-joe": "1.0.0", + "lcg": "4.0.0", + "leibniz": "5.0.0", + "leveldb": "1.0.1", + "liminal": "1.0.1", + "linalg": "6.0.0", + "lists": "7.0.0", + "literals": "1.0.2", + "logging": "3.0.0", + "logging-journald": "0.4.0", + "lumi-components": "18.0.0", + "machines": "7.0.0", + "maps-eager": "0.5.0", + "marionette": "1.0.0", + "marionette-react-basic-hooks": "0.1.1", + "marked": "0.1.0", + "matrices": "5.0.1", + "matryoshka": "1.0.0", + "maybe": "6.0.0", + "media-types": "6.0.0", + "meowclient": "1.0.0", + "midi": "4.0.0", + "milkis": "9.0.0", + "mimetype": "0.0.1", + "minibench": "4.0.1", + "mmorph": "7.0.0", + "monad-control": "5.0.0", + "monad-logger": "1.3.1", + "monad-loops": "0.5.0", + "monad-unlift": "1.0.1", + "monoid-extras": "0.0.1", + "monoidal": "0.16.0", + "morello": "0.4.0", + "mote": "3.0.0", + "motsunabe": "2.0.0", + "mvc": "0.0.1", + "mysql": "6.0.1", + "n3": "0.1.0", + "nano-id": "1.1.0", + "nanoid": "0.1.0", + "naturals": "3.0.0", + "nested-functor": "0.2.1", + "newtype": "5.0.0", + "nextjs": "0.1.1", + "nextui": "0.2.0", + "node-buffer": "9.0.0", + "node-child-process": "11.1.0", + "node-event-emitter": "3.0.0", + "node-execa": "5.0.0", + "node-fs": "9.2.0", + "node-glob-basic": "2.0.0", + "node-http": "9.1.0", + "node-http2": "1.1.1", + "node-human-signals": "1.0.0", + "node-net": "5.1.0", + "node-os": "5.1.0", + "node-path": "5.0.1", + "node-process": "11.2.0", + "node-readline": "8.1.1", + "node-sqlite3": "8.0.0", + "node-stream-pipes": "2.1.6", + "node-streams": "9.0.1", + "node-tls": "0.3.1", + "node-url": "7.0.1", + "node-workerbees": "0.3.1", + "node-zlib": "0.4.0", + "nonempty": "7.0.0", + "now": "6.0.0", + "npm-package-json": "2.0.0", + "nullable": "6.0.0", + "numberfield": "0.2.2", + "numbers": "9.0.1", + "oak": "3.1.1", + "oak-debug": "1.2.2", + "object-maps": "0.3.0", + "ocarina": "1.5.4", + "oooooooooorrrrrrrmm-lib": "0.0.1", + "open-colors-scales-and-schemes": "1.0.0", + "open-drawing": "6.0.4", + "open-folds": "6.4.0", + "open-foreign-generic": "11.0.3", + "open-memoize": "6.2.0", + "open-mkdirp-aff": "1.2.0", + "open-pairing": "6.2.0", + "open-smolder": "12.0.2", + "options": "7.0.0", + "optparse": "5.0.1", + "ordered-collections": "3.2.0", + "ordered-set": "0.5.0", + "orders": "6.0.0", + "org-doc": "0.1.0", + "owoify": "1.2.0", + "pairs": "9.0.1", + "parallel": "7.0.0", + "parsing": "11.0.0", + "parsing-dataview": "3.2.4", + "partial": "4.0.0", + "pathy": "9.0.0", + "pha": "0.13.0", + "phaser": "0.7.0", + "phylio": "1.1.2", + "pipes": "8.0.0", + "pirates-charm": "0.0.1", + "play": "1.0.0", + "pmock": "0.9.0", + "point-free": "1.0.0", + "pointed-list": "0.5.1", + "polymorphic-vectors": "4.0.0", + "posix-types": "6.0.0", + "postgresql": "2.0.21", + "precise": "6.0.0", + "precise-datetime": "7.0.0", + "prelude": "6.0.2", + "prettier-printer": "3.0.0", + "printf": "0.1.0", + "priority-queue": "0.1.2", + "profunctor": "6.0.1", + "profunctor-lenses": "8.0.0", + "protobuf": "4.4.0", + "psa-utils": "8.0.0", + "psci-support": "6.0.0", + "punycode": "1.0.0", + "pursfmt": "0.17.0", + "qualified-do": "2.2.0", + "quantities": "12.2.0", + "quickcheck": "8.0.1", + "quickcheck-combinators": "0.1.3", + "quickcheck-laws": "7.0.0", + "quickcheck-utf8": "0.0.0", + "random": "6.0.0", + "rationals": "6.0.0", + "rdf": "0.1.0", + "react": "11.0.0", + "react-aria": "0.2.0", + "react-basic": "17.0.0", + "react-basic-classic": "3.0.0", + "react-basic-dnd": "10.1.0", + "react-basic-dom": "7.0.0", + "react-basic-dom-beta": "0.1.1", + "react-basic-emotion": "7.1.0", + "react-basic-hooks": "9.0.0", + "react-basic-storybook": "2.0.0", + "react-dom": "8.0.0", + "react-halo": "3.0.0", + "react-icons": "1.1.5", + "react-markdown": "0.1.0", + "react-testing-library": "4.0.1", + "react-virtuoso": "1.0.0", + "reactix": "0.6.1", + "read": "1.0.1", + "recharts": "1.1.0", + "record": "4.0.0", + "record-extra": "5.0.1", + "record-extra-srghma": "0.2.8", + "record-ptional-fields": "0.1.2", + "record-studio": "1.0.4", + "refs": "6.0.0", + "remotedata": "5.0.1", + "repr": "0.5.0", + "resize-arrays": "0.0.1", + "resize-observer": "1.0.0", + "resource": "2.0.1", + "resourcet": "1.0.0", + "result": "1.0.3", + "return": "0.2.0", + "ring-modules": "5.0.1", + "rito": "0.3.4", + "roman": "0.4.0", + "rough-notation": "1.0.2", + "routing": "11.0.0", + "routing-duplex": "0.7.0", + "run": "5.0.0", + "safe-coerce": "2.0.0", + "safely": "4.0.1", + "school-of-music": "1.3.0", + "selection-foldable": "0.2.0", + "selective-functors": "1.0.1", + "semirings": "7.0.0", + "shuffle": "2.0.0", + "sigil": "0.2.0", + "signal": "13.0.0", + "simple-emitter": "3.0.1", + "simple-i18n": "2.0.1", + "simple-json": "9.0.0", + "simple-json-generics": "0.2.1", + "simple-ulid": "3.0.0", + "sized-matrices": "1.0.0", + "sized-vectors": "5.0.2", + "slug": "3.2.0", + "small-ffi": "4.0.1", + "soundfonts": "4.1.0", + "sparse-matrices": "2.0.1", + "sparse-polynomials": "3.0.1", + "spec": "8.1.1", + "spec-discovery": "8.4.1", + "spec-mocha": "5.1.1", + "spec-node": "0.0.3", + "spec-quickcheck": "5.0.2", + "spec-reporter-xunit": "0.7.1", + "splitmix": "2.1.0", + "ssrs": "1.0.0", + "st": "6.2.0", + "statistics": "0.3.2", + "strictlypositiveint": "1.0.1", + "string-parsers": "8.0.0", + "strings": "6.0.1", + "strings-extra": "4.0.0", + "stringutils": "0.0.12", + "structured-logging": "1.0.0", + "substitute": "0.2.3", + "supply": "0.2.0", + "svg-parser": "3.0.0", + "systemd-journald": "0.3.0", + "tagged": "4.0.2", + "tailrec": "6.1.0", + "tanstack-query": "2.0.0", + "tecton": "0.2.1", + "tecton-halogen": "0.2.0", + "test-unit": "17.0.0", + "text-formatting": "0.1.0", + "thermite": "6.3.1", + "thermite-dom": "0.3.1", + "these": "6.0.0", + "threading": "0.0.3", + "tidy": "0.11.1", + "tidy-codegen": "4.0.1", + "tldr": "0.0.0", + "toestand": "0.9.0", + "transformation-matrix": "1.0.1", + "transformers": "6.1.0", + "transit": "1.0.0", + "tree-rose": "4.0.2", + "trivial-unfold": "0.5.0", + "ts-bridge": "4.0.0", + "tuples": "7.0.0", + "two-or-more": "1.0.0", + "type-equality": "4.0.1", + "typedenv": "2.0.1", + "typelevel": "6.0.0", + "typelevel-lists": "2.1.0", + "typelevel-peano": "1.0.1", + "typelevel-prelude": "7.0.0", + "typelevel-regex": "0.0.3", + "typelevel-rows": "0.1.0", + "typisch": "0.4.0", + "uint": "7.0.0", + "ulid": "3.0.1", + "uncurried-transformers": "1.1.0", + "undefined": "2.0.0", + "undefined-is-not-a-problem": "1.1.0", + "unfoldable": "6.0.0", + "unicode": "6.0.0", + "unique": "0.6.1", + "unlift": "1.0.1", + "unordered-collections": "3.1.0", + "unsafe-coerce": "6.0.0", + "unsafe-reference": "5.0.0", + "untagged-to-tagged": "0.1.4", + "untagged-union": "1.0.0", + "uri": "9.0.0", + "url-immutable": "1.0.0", + "url-regex-safe": "0.1.1", + "uuid": "9.0.0", + "uuidv4": "1.0.0", + "validation": "6.0.0", + "variant": "8.0.0", + "variant-encodings": "2.0.0", + "variant-gen": "1.0.0", + "vectorfield": "1.0.1", + "vectors": "2.1.0", + "versions": "7.0.0", + "visx": "0.0.2", + "vitest": "2.0.0", + "web-clipboard": "6.0.0", + "web-cssom": "2.0.0", + "web-cssom-view": "0.1.0", + "web-dom": "6.0.0", + "web-dom-parser": "8.0.0", + "web-dom-xpath": "3.0.0", + "web-encoding": "3.0.0", + "web-events": "4.0.0", + "web-fetch": "4.0.1", + "web-file": "4.0.0", + "web-geometry": "0.1.0", + "web-html": "4.1.1", + "web-pointerevents": "2.0.0", + "web-proletarian": "1.0.0", + "web-promise": "3.2.0", + "web-resize-observer": "2.1.0", + "web-router": "1.0.0", + "web-socket": "4.0.0", + "web-storage": "5.0.0", + "web-streams": "4.0.0", + "web-touchevents": "4.0.0", + "web-uievents": "5.0.0", + "web-url": "2.0.0", + "web-workers": "1.1.0", + "web-xhr": "5.0.1", + "webb-aff-list": "0.0.2", + "webb-array": "0.0.2", + "webb-channel": "0.0.3", + "webb-commandline": "0.0.3", + "webb-directory": "0.0.7", + "webb-file": "0.0.1", + "webb-map": "0.0.1", + "webb-monad": "0.0.2", + "webb-mutex": "0.0.7", + "webb-parsing": "0.0.5", + "webb-random": "0.0.1", + "webb-refer": "0.0.3", + "webb-set": "0.0.1", + "webb-slot": "0.0.1", + "webb-stateful": "0.0.3", + "webb-string": "0.0.1", + "webb-test": "0.0.1", + "webb-thread": "0.0.2", + "webb-writer": "0.0.3", + "webextension-polyfill": "0.1.0", + "webgpu": "0.0.1", + "which": "2.0.0", + "whine-core": "0.0.33", + "xterm": "1.0.0", + "yaml-next": "3.1.1", + "yoga-fetch": "1.0.1", + "yoga-json": "5.1.0", + "yoga-om": "0.1.0", + "yoga-postgres": "6.0.0", + "yoga-react-dom": "1.0.1", + "yoga-redis": "0.1.0", + "yoga-sql-types": "0.1.0", + "yoga-subtlecrypto": "0.1.0", + "yoga-test-docker": "0.1.0", + "yoga-tree": "1.0.0", + "yoga-tree-svg": "0.1.0", + "yoga-tree-utils": "1.0.0", + "z3": "0.0.2", + "zipperarray": "2.0.0" + } + }, + "extra_packages": {} + }, + "packages": { + "aff": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-9BRIrSdRoYybfiUmBqgKJ66cPqxYHb277bVWQMn/9sg=", + "dependencies": [ + "control", + "datetime", + "effect", + "either", + "exceptions", + "functions", + "newtype", + "parallel", + "partial", + "prelude", + "st", + "tailrec", + "transformers", + "unsafe-coerce" + ] + }, + "ansi": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-tOUaXJFzPSfBVAqLI8hc+Tz2M1rg16cXqyHaK/3SmFg=", + "dependencies": [ + "foldable-traversable", + "lists", + "prelude" + ] + }, + "argonaut-codecs": { + "type": "registry", + "version": "9.1.0", + "integrity": "sha256-K910SBrmYallESsm8pxJYThs7lig6hxX3M4PW33Cgew=", + "dependencies": [ + "argonaut-core", + "arrays", + "bifunctors", + "either", + "foldable-traversable", + "foreign-object", + "identity", + "integers", + "lists", + "maybe", + "nonempty", + "ordered-collections", + "prelude", + "record", + "strings", + "tuples" + ] + }, + "argonaut-core": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-gYZihtBIKthVuXXoiPphMookSf8M5aHyFYkcIWqlxTM=", + "dependencies": [ + "arrays", + "control", + "either", + "foreign-object", + "functions", + "gen", + "maybe", + "nonempty", + "prelude", + "strings", + "tailrec" + ] + }, + "arraybuffer-types": { + "type": "registry", + "version": "3.0.2", + "integrity": "sha256-p05cJnSkyeoB7VHzMyc2Eb1RwUaB7Nl0sQSqEGNEUD8=", + "dependencies": [] + }, + "arrays": { + "type": "registry", + "version": "7.3.0", + "integrity": "sha256-GD4z7LCi9wzi7FCQqbWhvs8paoUK9NO+HwgXZ+KP8Rk=", + "dependencies": [ + "bifunctors", + "control", + "foldable-traversable", + "functions", + "maybe", + "nonempty", + "partial", + "prelude", + "safe-coerce", + "st", + "tailrec", + "tuples", + "unfoldable", + "unsafe-coerce" + ] + }, + "avar": { + "type": "registry", + "version": "5.0.1", + "integrity": "sha256-8V4SxF4TIWZ9Ik1P4lPzIRUAZeFBe8w5WA2VcCEKsIk=", + "dependencies": [ + "aff", + "effect", + "either", + "exceptions", + "functions", + "maybe", + "prelude" + ] + }, + "bifunctors": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-CvZRb8uI75eKIqiYntR+k05Wk6tKlMS5w8sCA2AFna0=", + "dependencies": [ + "const", + "either", + "newtype", + "prelude", + "tuples" + ] + }, + "catenable-lists": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-7+i/MHBLIRh604iCNT4ENWRWE/wuHIotER4kpdX9Ve0=", + "dependencies": [ + "control", + "foldable-traversable", + "lists", + "maybe", + "prelude", + "tuples", + "unfoldable" + ] + }, + "console": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-3T5PPz1mATZmV0C4GzkCkpLlCa5xG7u8ZNgnLrrrI1Q=", + "dependencies": [ + "effect", + "prelude" + ] + }, + "const": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-S+m0lQsxnji0z1XRUmkn+3RFuWJ5CXWuIr1u3i8Bfoc=", + "dependencies": [ + "invariant", + "newtype", + "prelude" + ] + }, + "contravariant": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-nuckEWqL80NaPmR/l9AUyrfycNh18XcvlZV9PAamwqc=", + "dependencies": [ + "const", + "either", + "newtype", + "prelude", + "tuples" + ] + }, + "control": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-0vxyYh5FL+ilxgLo954w1LqCUC0RSIivNNlb9CaNUQg=", + "dependencies": [ + "newtype", + "prelude" + ] + }, + "datetime": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-tbv6eDXy6QOD7YSknxYSbsDF32OC2JrNbSBpzMs7Doc=", + "dependencies": [ + "bifunctors", + "control", + "either", + "enums", + "foldable-traversable", + "functions", + "gen", + "integers", + "lists", + "maybe", + "newtype", + "numbers", + "ordered-collections", + "partial", + "prelude", + "tuples" + ] + }, + "debug": { + "type": "registry", + "version": "6.0.2", + "integrity": "sha256-d/EzRm/J2JyzvlIeo2Ex78Y7HRB0IXBitnVJywL4gHk=", + "dependencies": [ + "functions", + "prelude" + ] + }, + "distributive": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-netyJK4B32PDYHD0tF2AenKgo3urzbI770ycM0pArAo=", + "dependencies": [ + "identity", + "newtype", + "prelude", + "tuples", + "type-equality" + ] + }, + "effect": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-DdqU3bncRTjgMVPPRlAuGHVeajSPEcRaRhNuio7if6s=", + "dependencies": [ + "prelude" + ] + }, + "either": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-tBHx3PgtH4GZOApZCDkcM7szRTYJinrUrVGWazQCUUg=", + "dependencies": [ + "control", + "invariant", + "maybe", + "prelude" + ] + }, + "elmish": { + "type": "registry", + "version": "0.13.0", + "integrity": "sha256-ikyo9n9XJXU3AY0kiuQD7paVXsMJQXYjiwwPjrsAMNs=", + "dependencies": [ + "aff", + "argonaut-core", + "arrays", + "bifunctors", + "console", + "debug", + "effect", + "either", + "foldable-traversable", + "foreign", + "foreign-object", + "functions", + "integers", + "js-date", + "maybe", + "nullable", + "partial", + "prelude", + "refs", + "safe-coerce", + "type-equality", + "typelevel-prelude", + "undefined-is-not-a-problem", + "unsafe-coerce", + "web-dom", + "web-html" + ] + }, + "elmish-html": { + "type": "registry", + "version": "0.10.0", + "integrity": "sha256-AdeG6lucnGTEmNmITMtO8iyOVCF7ePPzATc47roBUBM=", + "dependencies": [ + "effect", + "elmish", + "foreign", + "foreign-object", + "maybe", + "prelude", + "record", + "typelevel-prelude", + "unsafe-coerce", + "web-dom", + "web-events", + "web-html" + ] + }, + "enums": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-sdZOmLX5+5pASGpvVyT0vSD5BBYQjZiayjV5XiPutso=", + "dependencies": [ + "control", + "either", + "gen", + "maybe", + "newtype", + "nonempty", + "partial", + "prelude", + "tuples", + "unfoldable" + ] + }, + "exceptions": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-nRrr+N0wk0TUFOWLR7e1n1oxcXo/X345bQUtoY9lW6A=", + "dependencies": [ + "effect", + "either", + "maybe", + "prelude" + ] + }, + "exists": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-vtLbrWNaI+pzx/2fw2AQnCovoLtcosClIhjO26QKkh8=", + "dependencies": [ + "unsafe-coerce" + ] + }, + "exitcodes": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-xBl4aFSEQ05Owp1ZvO6OxxvLK3LVzU35RSbj79SsePQ=", + "dependencies": [ + "enums", + "maybe", + "prelude" + ] + }, + "foldable-traversable": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-NGGWyCio/xjce6fPP7y3wwg7CheqllID6aJudDxbWhA=", + "dependencies": [ + "bifunctors", + "const", + "control", + "either", + "functors", + "identity", + "maybe", + "newtype", + "orders", + "prelude", + "tuples" + ] + }, + "foreign": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-jiDRMVQfovGsbbA/FzbzYf6iWk9i2b5gNrIjz+gFfsI=", + "dependencies": [ + "either", + "functions", + "integers", + "lists", + "maybe", + "prelude", + "strings", + "transformers", + "unsafe-coerce" + ] + }, + "foreign-object": { + "type": "registry", + "version": "4.1.0", + "integrity": "sha256-x/Q7r80z/vmHRKvPwhYmHP/DnJciPtsyGfRTMzayKIU=", + "dependencies": [ + "arrays", + "foldable-traversable", + "functions", + "gen", + "lists", + "maybe", + "prelude", + "st", + "tailrec", + "tuples", + "typelevel-prelude", + "unfoldable", + "unsafe-coerce" + ] + }, + "fork": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-0keBVeZZg1eCZEy/En1CohVW829gQUqKtqBNIRa93/A=", + "dependencies": [ + "aff", + "prelude", + "transformers" + ] + }, + "free": { + "type": "registry", + "version": "7.1.0", + "integrity": "sha256-tUBInfUpRQEw4u94GWcYW7EYdmSdDHSRn88a+C0eltU=", + "dependencies": [ + "catenable-lists", + "control", + "distributive", + "either", + "exists", + "foldable-traversable", + "invariant", + "lazy", + "maybe", + "prelude", + "tailrec", + "transformers", + "tuples", + "unsafe-coerce" + ] + }, + "functions": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-0jgtOr+SFO4UScKc40oA/9Vdcf2rLn3h3vZlY0KfqVo=", + "dependencies": [ + "prelude" + ] + }, + "functors": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-W1o/4wcp6S3chodYL8uixlXK2mfr1L+SzM1R+whqUco=", + "dependencies": [ + "bifunctors", + "const", + "contravariant", + "control", + "distributive", + "either", + "invariant", + "maybe", + "newtype", + "prelude", + "profunctor", + "tuples", + "unsafe-coerce" + ] + }, + "gen": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-kyOateeOtQa07vfTMYeSuCKdelgKE1R65fwKkZ10wsY=", + "dependencies": [ + "either", + "foldable-traversable", + "identity", + "maybe", + "newtype", + "nonempty", + "prelude", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "identity": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-RY/iXPpxpqvKHYfJeFVNI1J06kohB9rbtWYuha8t0LE=", + "dependencies": [ + "control", + "invariant", + "newtype", + "prelude" + ] + }, + "integers": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-Y8yozC1uHRLcruobEyv5/bMKzE1BoKJ/olHv6o+bgm8=", + "dependencies": [ + "maybe", + "numbers", + "prelude" + ] + }, + "invariant": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-HyoT1I5qIHRq8RSZji6zZDvqnpVjLw748utrKwZtqsw=", + "dependencies": [ + "control", + "prelude" + ] + }, + "js-date": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-DNQrp4xYc8o80jtxo0aOkUeXGi6h0Xidkk2ZQ8Y4l5Y=", + "dependencies": [ + "datetime", + "effect", + "enums", + "foreign", + "functions", + "integers", + "maybe", + "prelude" + ] + }, + "lazy": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-MHRC+1Pc+AjortBp4b/e1e6KpEpsDwaJBNBB7TOL+1I=", + "dependencies": [ + "control", + "foldable-traversable", + "invariant", + "prelude" + ] + }, + "lists": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-/mGd7wLoU+wsTcqii7SSUByxsvwvjnu2PjwAD47yYb4=", + "dependencies": [ + "bifunctors", + "control", + "foldable-traversable", + "lazy", + "maybe", + "newtype", + "nonempty", + "partial", + "prelude", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "maybe": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-8X6XEgtZ5lqfkEuc1hWOofnL6mwhk8gSJTxwvbR/SbY=", + "dependencies": [ + "control", + "invariant", + "newtype", + "prelude" + ] + }, + "media-types": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-3Wyq+vfqJFTmy1k6DGVnXStxtZxgK631wusDPzlFVxg=", + "dependencies": [ + "newtype", + "prelude" + ] + }, + "mmorph": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-Cfltaq+tfYjuSoSBN/b8cSQZbvZTqIRs6ebQewbIkGs=", + "dependencies": [ + "bifunctors", + "either", + "free", + "functors", + "identity", + "maybe", + "newtype", + "prelude", + "transformers", + "tuples" + ] + }, + "newtype": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-dt6w0cty4OS+Pjt9fsh3iU6ottqSU83mdAZkaEEvo6c=", + "dependencies": [ + "prelude", + "safe-coerce" + ] + }, + "node-buffer": { + "type": "registry", + "version": "9.0.0", + "integrity": "sha256-RdQjilmEHqsT4fwpCr8Mavw8KTafYrS3ZM6zeAAVAl8=", + "dependencies": [ + "arraybuffer-types", + "effect", + "functions", + "maybe", + "nullable", + "partial", + "prelude", + "st", + "unsafe-coerce" + ] + }, + "node-event-emitter": { + "type": "registry", + "version": "3.0.0", + "integrity": "sha256-wodx71NxJBPXOaawFn01V1ByYB2vT+I3RuV2giOVKMg=", + "dependencies": [ + "effect", + "either", + "functions", + "maybe", + "nullable", + "prelude", + "unsafe-coerce" + ] + }, + "node-fs": { + "type": "registry", + "version": "9.2.0", + "integrity": "sha256-fxioTSm9y47WuYs9F/7nxCh/RVDCl3Kr3Hg779J4SJA=", + "dependencies": [ + "aff", + "datetime", + "effect", + "either", + "enums", + "exceptions", + "functions", + "integers", + "js-date", + "maybe", + "node-buffer", + "node-path", + "node-streams", + "nullable", + "partial", + "prelude", + "strings" + ] + }, + "node-path": { + "type": "registry", + "version": "5.0.1", + "integrity": "sha256-j7n/SmpVz0FOMJl4XZop3ofJ+MeIPkMNqUEUKHEL6Us=", + "dependencies": [ + "effect" + ] + }, + "node-process": { + "type": "registry", + "version": "11.2.0", + "integrity": "sha256-onzKeNmaeYfN3HSDPqSFTrrP2Yl9tnVsfKKhnf2plxM=", + "dependencies": [ + "effect", + "exceptions", + "foreign", + "foreign-object", + "maybe", + "node-event-emitter", + "node-streams", + "nullable", + "posix-types", + "prelude", + "strings" + ] + }, + "node-streams": { + "type": "registry", + "version": "9.0.1", + "integrity": "sha256-yuVGm/R/tBr4Nphi+a1a984Z0fkmN9Q5wWtSmbmJTpA=", + "dependencies": [ + "aff", + "arrays", + "effect", + "either", + "exceptions", + "maybe", + "node-buffer", + "node-event-emitter", + "nullable", + "prelude", + "refs", + "st", + "tailrec", + "unsafe-coerce" + ] + }, + "nonempty": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-Ctkq8/+KiGqCE53Y/LvibA/coy7ev9HtRZU+GYS7yfQ=", + "dependencies": [ + "control", + "foldable-traversable", + "maybe", + "prelude", + "tuples", + "unfoldable" + ] + }, + "now": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-mTyG4s8tps3XIf0jjV/lME2/QlwMzrQly2wqfSSUM3o=", + "dependencies": [ + "datetime", + "effect", + "prelude" + ] + }, + "nullable": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-CDAZk+L9Sc0GCFTkE8n+qdp4Ys8avvnkU+m2hVALt7M=", + "dependencies": [ + "functions", + "maybe", + "prelude" + ] + }, + "numbers": { + "type": "registry", + "version": "9.0.1", + "integrity": "sha256-ZydYckgwRAnRaFC7pu6fADhzdwX+UqHZrfJyet64zls=", + "dependencies": [ + "functions", + "maybe", + "prelude" + ] + }, + "open-memoize": { + "type": "registry", + "version": "6.2.0", + "integrity": "sha256-yJLuVYX8FocHIJ+6q7efH/Pj4S+e1Y57DZ5Dn7qf4ww=", + "dependencies": [ + "either", + "integers", + "lazy", + "lists", + "maybe", + "partial", + "prelude", + "strings", + "tuples" + ] + }, + "optparse": { + "type": "registry", + "version": "5.0.1", + "integrity": "sha256-2btDjHPRR0uujUQJuZAN9AzvVoXe7yG6IwnY5evERhQ=", + "dependencies": [ + "arrays", + "bifunctors", + "control", + "effect", + "either", + "enums", + "exists", + "exitcodes", + "foldable-traversable", + "free", + "integers", + "lazy", + "lists", + "maybe", + "newtype", + "node-buffer", + "node-process", + "node-streams", + "nonempty", + "numbers", + "open-memoize", + "partial", + "prelude", + "strings", + "tailrec", + "transformers", + "tuples" + ] + }, + "ordered-collections": { + "type": "registry", + "version": "3.2.0", + "integrity": "sha256-NaEXc2cz/7lJfxPWEja4XlZbGxuRqJwFKQJjsJf51kQ=", + "dependencies": [ + "arrays", + "control", + "foldable-traversable", + "functions", + "gen", + "lists", + "maybe", + "newtype", + "partial", + "prelude", + "safe-coerce", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "orders": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-nSMxZK7wxyDULkjZqvMyB71mVo6b0AyLLHosDVbv1XM=", + "dependencies": [ + "newtype", + "prelude" + ] + }, + "parallel": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-bAGpVhrFz2IyHkA4MR7+tE/19FZ7dzYBdYPgK5svkqw=", + "dependencies": [ + "control", + "effect", + "either", + "foldable-traversable", + "functors", + "maybe", + "newtype", + "prelude", + "profunctor", + "refs", + "transformers" + ] + }, + "partial": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-mdrlJBAgFMh79hNRW39uv7c+BwnnaOrAMmdh7+VhEhs=", + "dependencies": [] + }, + "pipes": { + "type": "registry", + "version": "8.0.0", + "integrity": "sha256-dtUNpG8BGVr7pu6mQZyAnUAftUHgNS7f0QH3Kw5UTpQ=", + "dependencies": [ + "aff", + "control", + "effect", + "either", + "foldable-traversable", + "identity", + "lists", + "maybe", + "mmorph", + "newtype", + "prelude", + "tailrec", + "transformers", + "tuples" + ] + }, + "posix-types": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-Je5jG439F/SFO/IvVevZnWVxDIonrehlKuJkefP2lHE=", + "dependencies": [ + "maybe", + "newtype", + "prelude" + ] + }, + "prelude": { + "type": "registry", + "version": "6.0.2", + "integrity": "sha256-IqykrDRquGUD/LRSad7y75hZv3bUsGQ4knc8tdez8Qw=", + "dependencies": [] + }, + "profunctor": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-Ow0mJC+PIIRq/a3mzCWY5vxuTgR/e+Ee68+mWeSRnWY=", + "dependencies": [ + "control", + "distributive", + "either", + "exists", + "invariant", + "newtype", + "prelude", + "tuples" + ] + }, + "record": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-WQ8fqp4X1wTA70J4qUcPW4Z7DCwx6e5KJnT/EuTdWSc=", + "dependencies": [ + "functions", + "prelude", + "unsafe-coerce" + ] + }, + "refs": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-KKD5G9dR2SauuDGULUJsxjqDOEi1Jqm+2Sq5U2mY8YU=", + "dependencies": [ + "effect", + "prelude" + ] + }, + "safe-coerce": { + "type": "registry", + "version": "2.0.0", + "integrity": "sha256-EJrxtKt5xC7TYjBZrSBO/J7Aw3DmtilYjt4olpAXWVc=", + "dependencies": [ + "unsafe-coerce" + ] + }, + "spec": { + "type": "registry", + "version": "8.1.1", + "integrity": "sha256-b6qjDb7lUJGLV+WEoywLu6BCXC4zGpfbN43mTL+vBeI=", + "dependencies": [ + "aff", + "ansi", + "arrays", + "avar", + "bifunctors", + "control", + "datetime", + "effect", + "either", + "exceptions", + "foldable-traversable", + "fork", + "identity", + "integers", + "lists", + "maybe", + "newtype", + "now", + "ordered-collections", + "parallel", + "pipes", + "prelude", + "refs", + "strings", + "tailrec", + "transformers", + "tuples" + ] + }, + "spec-node": { + "type": "registry", + "version": "0.0.3", + "integrity": "sha256-8/9+g0obbamV0YtqzmttbWs8HaWF7CEeW+eDtqzuAAo=", + "dependencies": [ + "aff", + "argonaut-codecs", + "argonaut-core", + "arrays", + "control", + "datetime", + "effect", + "either", + "foldable-traversable", + "identity", + "integers", + "maybe", + "newtype", + "node-buffer", + "node-fs", + "node-process", + "now", + "numbers", + "optparse", + "ordered-collections", + "partial", + "prelude", + "spec", + "strings", + "tuples" + ] + }, + "st": { + "type": "registry", + "version": "6.2.0", + "integrity": "sha256-WI4MEkkwUd4pnwZQ3G8VKWgX5t1RSNJludm5e9boaRo=", + "dependencies": [ + "effect", + "partial", + "prelude", + "tailrec", + "unsafe-coerce" + ] + }, + "strings": { + "type": "registry", + "version": "6.0.1", + "integrity": "sha256-FNto2hoNW5Da6W6crIk77YXMagBvOGHZE1kO7eZ1vLM=", + "dependencies": [ + "arrays", + "control", + "either", + "enums", + "foldable-traversable", + "gen", + "integers", + "maybe", + "newtype", + "nonempty", + "partial", + "prelude", + "tailrec", + "tuples", + "unfoldable", + "unsafe-coerce" + ] + }, + "tailrec": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-xrorCfP0xV1wubs27idQCHQqdvSUuqmmL/am7Ji1wVU=", + "dependencies": [ + "bifunctors", + "effect", + "either", + "identity", + "maybe", + "partial", + "prelude", + "refs" + ] + }, + "transformers": { + "type": "registry", + "version": "6.1.0", + "integrity": "sha256-QJmgNT/y7ljPHSsXaW4zxF/982BFiQ90KNL1g/NtEOQ=", + "dependencies": [ + "control", + "distributive", + "effect", + "either", + "exceptions", + "foldable-traversable", + "identity", + "lazy", + "maybe", + "newtype", + "prelude", + "st", + "tailrec", + "tuples", + "unfoldable" + ] + }, + "tuples": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-BKy7EfK8S1KeTCwyWqyW1wwcpSAQuh3IsczSVgS6fzY=", + "dependencies": [ + "control", + "invariant", + "prelude" + ] + }, + "type-equality": { + "type": "registry", + "version": "4.0.1", + "integrity": "sha256-BBqYOSnAKmayRvR5mtZoCf4SlYs2ipatD/+5nQx73aw=", + "dependencies": [] + }, + "typelevel-prelude": { + "type": "registry", + "version": "7.0.0", + "integrity": "sha256-+pHi14/40mTj/+lmCWqL0T7iXIXD1+NSg/KItyyoB0A=", + "dependencies": [ + "prelude", + "type-equality" + ] + }, + "undefined-is-not-a-problem": { + "type": "registry", + "version": "1.1.0", + "integrity": "sha256-0YkVzpcKi40T43go7/f8uLVIYgir6lGzOytL6LPfiog=", + "dependencies": [ + "effect", + "either", + "foreign", + "maybe", + "newtype", + "prelude", + "tuples", + "type-equality", + "unsafe-coerce" + ] + }, + "unfoldable": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-BK/6By1sKp/ztk+9CF3q43SV0QDTLVdsGqFerKHSmbg=", + "dependencies": [ + "foldable-traversable", + "maybe", + "partial", + "prelude", + "tuples" + ] + }, + "unsafe-coerce": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-0L1QsaY20OILjfU5TV72d3U/tSjhmL9hJ32WMp857Lk=", + "dependencies": [] + }, + "web-dom": { + "type": "registry", + "version": "6.0.0", + "integrity": "sha256-rVeqkxChkjqisDvOujy9BMEgGqJkwX3t6g21bXfiG5o=", + "dependencies": [ + "effect", + "enums", + "maybe", + "newtype", + "nullable", + "prelude", + "unsafe-coerce", + "web-events" + ] + }, + "web-events": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-wZNeldG0OU+8qGycUJ9e6vxf1/GC4Ep4OlRMhvjs9LA=", + "dependencies": [ + "datetime", + "effect", + "enums", + "foreign", + "functions", + "maybe", + "newtype", + "nullable", + "prelude", + "unsafe-coerce" + ] + }, + "web-file": { + "type": "registry", + "version": "4.0.0", + "integrity": "sha256-txsdkeWBKU/+5v9m5c6kysgJQSDyV1r7MHaeT4STpjQ=", + "dependencies": [ + "datetime", + "effect", + "enums", + "foreign", + "integers", + "maybe", + "media-types", + "nullable", + "numbers", + "partial", + "prelude", + "tuples", + "unfoldable", + "unsafe-coerce", + "web-events" + ] + }, + "web-html": { + "type": "registry", + "version": "4.1.1", + "integrity": "sha256-yOuZJGUxFrivHKpo/jKuKzFZaq6PPPE64ftSysXFssk=", + "dependencies": [ + "effect", + "enums", + "foreign", + "functions", + "js-date", + "maybe", + "media-types", + "newtype", + "nullable", + "prelude", + "unsafe-coerce", + "web-dom", + "web-events", + "web-file", + "web-storage" + ] + }, + "web-storage": { + "type": "registry", + "version": "5.0.0", + "integrity": "sha256-YJfos55oeKtBStNfoWfeflSy8j+4IDym5eaZtIY7YM4=", + "dependencies": [ + "effect", + "maybe", + "nullable", + "prelude", + "unsafe-coerce", + "web-events" + ] + } + } +} diff --git a/spago.yaml b/spago.yaml index c5aa839..56fd5d7 100644 --- a/spago.yaml +++ b/spago.yaml @@ -1,24 +1,33 @@ package: + name: mujoco-mjcf + publish: + version: '0.0.1' + license: 'GPL-3.0-or-later' + location: + githubOwner: 'cakekindel' + githubRepo: 'purescript-mujoco-mjcf' build: + censorProjectWarnings: + - 'ImplicitQualifiedImport' + - 'ImplicitQualifiedImportReExport' strict: true - pedantic_packages: true + pedanticPackages: true + test: + main: Test.Main + dependencies: + - spec + - spec-node dependencies: + - arrays + - elmish + - elmish-html + - integers + - numbers - prelude - - aff - - effect - - either - - maybe - - foldable-traversable - - console - - newtype - - strings - - stringutils - - transformers - tuples - typelevel-prelude - name: project + - unsafe-coerce workspace: - extra_packages: {} - package_set: - url: https://raw.githubusercontent.com/purescript/package-sets/psc-0.15.10-20230930/packages.json - hash: sha256-nTsd44o7/hrTdk0c6dh0wyBqhFFDJJIeKdQU6L1zv/A= + extraPackages: {} + packageSet: + registry: 73.2.0 diff --git a/src/Main.purs b/src/Main.purs deleted file mode 100644 index ee561ac..0000000 --- a/src/Main.purs +++ /dev/null @@ -1,7 +0,0 @@ -module Main where - -import Prelude -import Effect (Effect) - -main :: Effect Unit -main = pure unit diff --git a/src/Mujoco.XML.Node.Prop.purs b/src/Mujoco.XML.Node.Prop.purs new file mode 100644 index 0000000..e9a2b48 --- /dev/null +++ b/src/Mujoco.XML.Node.Prop.purs @@ -0,0 +1,75 @@ +module Mujoco.XML.Node.Prop (class Serialize, serialize, serializeProps, class SerializeProps', serializeProps') where + +import Prelude + +import Data.Array as Array +import Data.Int as Int +import Data.Number.Format (toString) as Number +import Data.Symbol (class IsSymbol, reflectSymbol) +import Data.Tuple (Tuple) +import Data.Tuple.Nested ((/\)) +import Prim.Row (class Cons, class Union) +import Prim.RowList (class RowToList, RowList) +import Prim.RowList as RL +import Record.Unsafe (unsafeSet, unsafeHas, unsafeGet) as Record +import Type.Prelude (Proxy(..)) +import Unsafe.Coerce (unsafeCoerce) + +class Serialize a where + serialize :: a -> String + +instance Serialize String where + serialize = identity +else instance Serialize Int where + serialize = Int.toStringAs Int.decimal +else instance Serialize Number where + serialize = Number.toString +else instance Serialize Boolean where + serialize = show +else instance Serialize a => Serialize (Array a) where + serialize = Array.intercalate " " <<< map serialize +else instance (Serialize a, Serialize b) => Serialize (Tuple a b) where + serialize (a /\ b) = serialize [serialize a, serialize b] + +serializeProps :: forall @props part missing propsrl. RowToList props propsrl => SerializeProps' props propsrl => Union part missing props => Record part -> {} +serializeProps = + (unsafeCoerce :: Record props -> {}) + <<< serializeProps' @props @propsrl + <<< (unsafeCoerce :: Record part -> Record props) + +class SerializeProps' :: Row Type -> RowList Type -> Constraint +class SerializeProps' p prl | prl -> p where + serializeProps' :: Record p -> Record p + +instance + ( IsSymbol k + , RowToList p' prl' + , RowToList p (RL.Cons k v prl') + , Cons k v p' p + , SerializeProps' p' prl' + , Serialize v + ) => SerializeProps' p (RL.Cons k v prl') where + serializeProps' = + patchUnsafe @k serialize + <<< remember @k + <<< serializeProps' @p' @prl' + <<< forget @k +instance SerializeProps' () RL.Nil where + serializeProps' = identity + +patchUnsafe :: forall (@k :: Symbol) a b @r @lacksK. IsSymbol k => Cons k a lacksK r => (a -> b) -> Record r -> Record r +patchUnsafe f r = + let + k = reflectSymbol $ Proxy @k + btoa = unsafeCoerce :: b -> a + in + if Record.unsafeHas k r then + Record.unsafeSet k (btoa $ f $ Record.unsafeGet k r) r + else + r + +forget :: forall @k @r' @r a. Cons k a r' r => Record r -> Record r' +forget = unsafeCoerce + +remember :: forall @k @r' @r a. Cons k a r' r => Record r' -> Record r +remember = unsafeCoerce diff --git a/src/Mujoco.XML.Node.purs b/src/Mujoco.XML.Node.purs new file mode 100644 index 0000000..fa91d5d --- /dev/null +++ b/src/Mujoco.XML.Node.purs @@ -0,0 +1,98 @@ +module Mujoco.XML.Node + ( Node + , render + , tag + , tagNoContent + , class Children + , asChildren + , fragment + , empty + , text + ) where + +import Prelude + +import Elmish.HTML (empty, fragment, text) as HTML +import Elmish.HTML.Internal (tag, tagNoContent) as HTML +import Elmish.React (ReactElement) +import Elmish.React as React +import Mujoco.XML.Node.Prop (class SerializeProps', serializeProps) +import Prim.Row (class Union) +import Prim.RowList (class RowToList) +import Unsafe.Coerce (unsafeCoerce) + +type Tag props + = forall r missing a propsrl + . Children a + => Union r missing props + => React.ValidReactProps (Record r) + => RowToList props propsrl + => SerializeProps' props propsrl + => Record r + -> a + -> Node + +type TagNoContent props + = forall r missing propsrl + . Union r missing props + => React.ValidReactProps (Record r) + => RowToList props propsrl + => SerializeProps' props propsrl + => Record r + -> Node + +foreign import data Node :: Type + +render :: Node -> String +render = React.renderToString <<< toReact + +fromReact :: ReactElement -> Node +fromReact = unsafeCoerce + +toReact :: Node -> ReactElement +toReact = unsafeCoerce + +tag + :: forall @props propsrl + . RowToList props propsrl + => SerializeProps' props propsrl + => String + -> ( forall r missing a. + Union r missing props + => Children a + => React.ValidReactProps (Record r) + => Record r + -> a + -> Node + ) +tag el p a = fromReact $ HTML.tag el (serializeProps @props p) $ toReact <$> asChildren a + +tagNoContent + :: forall @props propsrl + . RowToList props propsrl + => SerializeProps' props propsrl + => String + -> ( forall r missing. + Union r missing props + => React.ValidReactProps (Record r) + => Record r + -> Node + ) +tagNoContent el p = fromReact $ HTML.tagNoContent el (serializeProps @props p) + +fragment :: Array Node -> Node +fragment = fromReact <<< HTML.fragment <<< map toReact + +empty :: Node +empty = fromReact HTML.empty + +text :: String -> Node +text = fromReact <<< HTML.text + +class Children a where + asChildren :: a -> Array Node + +instance Children (Array Node) where asChildren = identity +instance Children String where asChildren s = [ unsafeCoerce s ] +instance Children Node where asChildren e = [ e ] +instance Children Unit where asChildren _ = [] diff --git a/src/Mujoco.purs b/src/Mujoco.purs new file mode 100644 index 0000000..82c990f --- /dev/null +++ b/src/Mujoco.purs @@ -0,0 +1 @@ +module Mujoco where diff --git a/test/Main.purs b/test/Main.purs new file mode 100644 index 0000000..4b5435c --- /dev/null +++ b/test/Main.purs @@ -0,0 +1,13 @@ +module Test.Main where + +import Prelude + +import Effect (Effect) +import Test.Mujoco.XML.Node.Prop as Test.Mujoco.XML.Node.Prop +import Test.Spec.Reporter.Console (consoleReporter) +import Test.Spec.Runner.Node (runSpecAndExitProcess) + +main :: Effect Unit +main = + runSpecAndExitProcess [consoleReporter] do + Test.Mujoco.XML.Node.Prop.spec diff --git a/test/Mujoco.XML.Node.Prop.purs b/test/Mujoco.XML.Node.Prop.purs new file mode 100644 index 0000000..9be7458 --- /dev/null +++ b/test/Mujoco.XML.Node.Prop.purs @@ -0,0 +1,51 @@ +module Test.Mujoco.XML.Node.Prop where + +import Prelude + +import Data.Tuple.Nested (type (/\), (/\)) +import Mujoco.XML.Node.Prop (class SerializeProps', serialize, serializeProps) +import Prim.Row (class Union) +import Prim.RowList (class RowToList) +import Test.Spec (Spec, describe, it) +import Test.Spec.Assertions (shouldEqual) +import Unsafe.Coerce (unsafeCoerce) + +type Props = + ( int :: Int + , string :: String + , array :: Array Int + , array2 :: Array (Array Int) + , tuple :: Int /\ Int + , tuple3 :: Int /\ Int /\ Int + , bool :: Boolean + ) + +spec :: Spec Unit +spec = + describe "Mujoco.XML.Node.Prop" do + describe "Serialize" do + it "serializes boolean" $ serialize true `shouldEqual` "true" + it "serializes string" $ serialize "a" `shouldEqual` "a" + it "serializes array" $ serialize ["a", "b"] `shouldEqual` "a b" + it "serializes nested array" $ serialize [["a", "b"], ["c"]] `shouldEqual` "a b c" + it "serializes int" $ serialize 1 `shouldEqual` "1" + it "serializes int array" $ serialize [1, 2] `shouldEqual` "1 2" + it "serializes number array" $ serialize [1.0, 2.0] `shouldEqual` "1 2" + it "serializes tuple" $ serialize (1 /\ 2) `shouldEqual` "1 2" + it "serializes nested tuple" $ serialize (1 /\ 2 /\ 3) `shouldEqual` "1 2 3" + + describe "SerializeProps" do + let + serializeProps' + :: forall part missing propsrl x + . RowToList Props propsrl + => SerializeProps' Props propsrl + => Union part missing Props + => Record part + -> Record x + serializeProps' = unsafeCoerce <<< serializeProps @Props + + it "handles empty" $ serializeProps' {} `shouldEqual` {} + it "handles int" $ serializeProps' { int: 1 } `shouldEqual` { int: "1" } + it "handles string" $ serializeProps' { string: "a" } `shouldEqual` { string: "a" } + it "handles array2" $ serializeProps' { array2: [[1, 2, 3], [4, 5]] } `shouldEqual` { array2: "1 2 3 4 5" }