diff --git a/spago.lock b/spago.lock new file mode 100644 index 0000000..5bb3085 --- /dev/null +++ b/spago.lock @@ -0,0 +1,1238 @@ +workspace: + packages: + parsing: + path: ./ + core: + dependencies: + - arrays + - control + - effect + - either + - enums + - foldable-traversable + - functions + - identity + - integers + - lazy + - lists + - maybe + - newtype + - nullable + - numbers + - partial + - prelude + - st + - strings + - tailrec + - transformers + - tuples + - unfoldable + - unicode + - unsafe-coerce + build_plan: + - arrays + - bifunctors + - const + - contravariant + - control + - distributive + - effect + - either + - enums + - exceptions + - exists + - foldable-traversable + - functions + - functors + - gen + - identity + - integers + - invariant + - lazy + - lists + - maybe + - newtype + - nonempty + - nullable + - numbers + - orders + - partial + - prelude + - profunctor + - refs + - safe-coerce + - st + - strings + - tailrec + - transformers + - tuples + - type-equality + - unfoldable + - unicode + - unsafe-coerce + test: + dependencies: + - assert + - debug + - node-process + build_plan: + - aff + - arraybuffer-types + - arrays + - assert + - bifunctors + - console + - const + - contravariant + - control + - datetime + - debug + - distributive + - effect + - either + - enums + - exceptions + - exists + - foldable-traversable + - foreign + - foreign-object + - functions + - functors + - gen + - identity + - integers + - invariant + - lazy + - lists + - maybe + - newtype + - node-buffer + - node-event-emitter + - node-process + - node-streams + - nonempty + - nullable + - numbers + - ordered-collections + - orders + - parallel + - partial + - posix-types + - prelude + - profunctor + - refs + - safe-coerce + - st + - strings + - tailrec + - transformers + - tuples + - type-equality + - typelevel-prelude + - unfoldable + - unsafe-coerce + package_set: + address: + registry: 60.2.1 + compiler: ">=0.15.15 <0.16.0" + content: + abc-parser: 2.0.1 + 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.0 + b64: 0.0.8 + barbies: 1.0.1 + barlow-lens: 0.9.0 + bifunctors: 6.0.0 + bigints: 7.0.1 + 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.1 + 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-frameworks: 1.0.1 + 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 + dom-filereader: 7.0.0 + dom-indexed: 12.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.10.3 + elmish-html: 0.9.0 + elmish-testing-library: 0.3.2 + email-validate: 7.0.0 + encoding: 0.0.9 + enums: 6.0.1 + env-names: 0.4.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 + ezfetch: 1.0.0 + fahrtwind: 2.0.0 + 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-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.3.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: 1.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 + gojs: 0.1.1 + grain: 3.0.0 + grain-router: 3.0.0 + grain-virtualized: 3.0.0 + 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-echarts-simple: 0.0.4 + halogen-formless: 4.0.3 + halogen-helix: 1.0.1 + 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-vdom: 8.0.0 + halogen-vdom-string-renderer: 0.5.0 + halogen-xterm: 2.0.0 + heckin: 2.0.1 + heterogeneous: 0.6.0 + homogeneous: 0.4.0 + http-methods: 6.0.0 + httpurple: 4.0.0 + huffman: 0.4.0 + humdrum: 0.0.1 + hyrule: 2.3.8 + identity: 6.0.0 + identy: 4.0.1 + indexed-db: 1.0.0 + indexed-monad: 3.0.0 + 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.0.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 + 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.0 + 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 + 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: 1.3.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.0 + 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.0 + node-tls: 0.3.1 + node-url: 7.0.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-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.4.0 + orders: 6.0.0 + owoify: 1.2.0 + pairs: 9.0.1 + parallel: 7.0.0 + parsing: 10.2.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 + 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.19 + precise: 6.0.0 + precise-datetime: 7.0.0 + prelude: 6.0.1 + prettier-printer: 3.0.0 + priority-queue: 0.1.2 + profunctor: 6.0.1 + profunctor-lenses: 8.0.0 + protobuf: 4.3.0 + psa-utils: 8.0.0 + psci-support: 6.0.0 + punycode: 1.0.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: 6.1.0 + react-basic-emotion: 7.1.0 + react-basic-hooks: 8.2.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-ptional-fields: 0.1.2 + record-studio: 1.0.4 + refs: 6.0.0 + remotedata: 5.0.1 + repr: 0.5.0 + 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 + 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.1.0 + small-ffi: 4.0.1 + soundfonts: 4.1.0 + sparse-matrices: 2.0.1 + sparse-polynomials: 3.0.1 + spec: 8.0.0 + spec-discovery: 8.3.0 + spec-mocha: 5.1.1 + spec-node: 0.0.2 + 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 + 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 + tecton: 0.2.1 + tecton-halogen: 0.2.0 + test-unit: 17.0.0 + thermite: 6.3.1 + thermite-dom: 0.3.1 + these: 6.0.0 + threading: 0.0.3 + tldr: 0.0.0 + toestand: 0.9.0 + transformation-matrix: 1.0.1 + transformers: 6.1.0 + tree-rose: 4.0.2 + 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 + uuid: 9.0.0 + uuidv4: 1.0.0 + validation: 6.0.0 + variant: 8.0.0 + variant-encodings: 2.0.0 + vectorfield: 1.0.1 + vectors: 2.1.0 + versions: 7.0.0 + visx: 0.0.2 + 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.0 + 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 + webextension-polyfill: 0.1.0 + webgpu: 0.0.1 + which: 2.0.0 + xterm: 1.0.0 + yoga-fetch: 1.0.1 + yoga-json: 5.1.0 + yoga-om: 0.1.0 + yoga-postgres: 6.0.0 + yoga-tree: 1.0.0 + z3: 0.0.2 + zipperarray: 2.0.0 + extra_packages: {} +packages: + aff: + type: registry + version: 8.0.0 + integrity: sha256-5MmdI4+0RHBtSBy+YlU3/Cq4R5W2ih3OaRedJIrVHdk= + dependencies: + - bifunctors + - control + - datetime + - effect + - either + - exceptions + - foldable-traversable + - functions + - maybe + - newtype + - parallel + - prelude + - refs + - tailrec + - transformers + - unsafe-coerce + arraybuffer-types: + type: registry + version: 3.0.2 + integrity: sha256-mQKokysYVkooS4uXbO+yovmV/s8b138Ws3zQvOwIHRA= + dependencies: [] + arrays: + type: registry + version: 7.3.0 + integrity: sha256-tmcklBlc/muUtUfr9RapdCPwnlQeB3aSrC4dK85gQlc= + dependencies: + - bifunctors + - control + - foldable-traversable + - functions + - maybe + - nonempty + - partial + - prelude + - safe-coerce + - st + - tailrec + - tuples + - unfoldable + - unsafe-coerce + assert: + type: registry + version: 6.0.0 + integrity: sha256-hCSYcCw9kj3qujoDcriWhCdmrpPZoguSPDZhEMnTl3A= + dependencies: + - console + - effect + - prelude + bifunctors: + type: registry + version: 6.0.0 + integrity: sha256-/gZwC9YhNxZNQpnHa5BIYerCGM2jeX9ukZiEvYxm5Nw= + dependencies: + - const + - either + - newtype + - prelude + - tuples + console: + type: registry + version: 6.1.0 + integrity: sha256-CxmAzjgyuGDmt9FZW51VhV6rBPwR6o0YeKUzA9rSzcM= + dependencies: + - effect + - prelude + const: + type: registry + version: 6.0.0 + integrity: sha256-tNrxDW8D8H4jdHE2HiPzpLy08zkzJMmGHdRqt5BQuTc= + dependencies: + - invariant + - newtype + - prelude + contravariant: + type: registry + version: 6.0.0 + integrity: sha256-TP+ooAp3vvmdjfQsQJSichF5B4BPDHp3wAJoWchip6c= + dependencies: + - const + - either + - newtype + - prelude + - tuples + control: + type: registry + version: 6.0.0 + integrity: sha256-sH7Pg9E96JCPF9PIA6oQ8+BjTyO/BH1ZuE/bOcyj4Jk= + dependencies: + - newtype + - prelude + datetime: + type: registry + version: 6.1.0 + integrity: sha256-g/5X5BBegQWLpI9IWD+sY6mcaYpzzlW5lz5NBzaMtyI= + 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-vmkYFuXYuELBzeauvgHG6E6Kf/Hp1dAnxwE9ByHfwSg= + dependencies: + - functions + - prelude + distributive: + type: registry + version: 6.0.0 + integrity: sha256-HTDdmEnzigMl+02SJB88j+gAXDx9VKsbvR4MJGDPbOQ= + dependencies: + - identity + - newtype + - prelude + - tuples + - type-equality + effect: + type: registry + version: 4.0.0 + integrity: sha256-eBtZu+HZcMa5HilvI6kaDyVX3ji8p0W9MGKy2K4T6+M= + dependencies: + - prelude + either: + type: registry + version: 6.1.0 + integrity: sha256-6hgTPisnMWVwQivOu2PKYcH8uqjEOOqDyaDQVUchTpY= + dependencies: + - control + - invariant + - maybe + - prelude + enums: + type: registry + version: 6.0.1 + integrity: sha256-HWaD73JFLorc4A6trKIRUeDMdzE+GpkJaEOM1nTNkC8= + dependencies: + - control + - either + - gen + - maybe + - newtype + - nonempty + - partial + - prelude + - tuples + - unfoldable + exceptions: + type: registry + version: 6.1.0 + integrity: sha256-K0T89IHtF3vBY7eSAO7eDOqSb2J9kZGAcDN5+IKsF8E= + dependencies: + - effect + - either + - maybe + - prelude + exists: + type: registry + version: 6.0.0 + integrity: sha256-A0JQHpTfo1dNOj9U5/Fd3xndlRSE0g2IQWOGor2yXn8= + dependencies: + - unsafe-coerce + foldable-traversable: + type: registry + version: 6.0.0 + integrity: sha256-fLeqRYM4jUrZD5H4WqcwUgzU7XfYkzO4zhgtNc3jcWM= + dependencies: + - bifunctors + - const + - control + - either + - functors + - identity + - maybe + - newtype + - orders + - prelude + - tuples + foreign: + type: registry + version: 7.0.0 + integrity: sha256-1ORiqoS3HW+qfwSZAppHPWy4/6AQysxZ2t29jcdUMNA= + dependencies: + - either + - functions + - identity + - integers + - lists + - maybe + - prelude + - strings + - transformers + foreign-object: + type: registry + version: 4.1.0 + integrity: sha256-q24okj6mT+yGHYQ+ei/pYPj5ih6sTbu7eDv/WU56JVo= + dependencies: + - arrays + - foldable-traversable + - functions + - gen + - lists + - maybe + - prelude + - st + - tailrec + - tuples + - typelevel-prelude + - unfoldable + functions: + type: registry + version: 6.0.0 + integrity: sha256-adMyJNEnhGde2unHHAP79gPtlNjNqzgLB8arEOn9hLI= + dependencies: + - prelude + functors: + type: registry + version: 5.0.0 + integrity: sha256-zfPWWYisbD84MqwpJSZFlvM6v86McM68ob8p9s27ywU= + dependencies: + - bifunctors + - const + - contravariant + - control + - distributive + - either + - invariant + - maybe + - newtype + - prelude + - profunctor + - tuples + - unsafe-coerce + gen: + type: registry + version: 4.0.0 + integrity: sha256-f7yzAXWwr+xnaqEOcvyO3ezKdoes8+WXWdXIHDBCAPI= + dependencies: + - either + - foldable-traversable + - identity + - maybe + - newtype + - nonempty + - prelude + - tailrec + - tuples + - unfoldable + identity: + type: registry + version: 6.0.0 + integrity: sha256-4wY0XZbAksjY6UAg99WkuKyJlQlWAfTi2ssadH0wVMY= + dependencies: + - control + - invariant + - newtype + - prelude + integers: + type: registry + version: 6.0.0 + integrity: sha256-sf+sK26R1hzwl3NhXR7WAu9zCDjQnfoXwcyGoseX158= + dependencies: + - maybe + - numbers + - prelude + invariant: + type: registry + version: 6.0.0 + integrity: sha256-RGWWyYrz0Hs1KjPDA+87Kia67ZFBhfJ5lMGOMCEFoLo= + dependencies: + - control + - prelude + lazy: + type: registry + version: 6.0.0 + integrity: sha256-lMsfFOnlqfe4KzRRiW8ot5ge6HtcU3Eyh2XkXcP5IgU= + dependencies: + - control + - foldable-traversable + - invariant + - prelude + lists: + type: registry + version: 7.0.0 + integrity: sha256-EKF15qYqucuXP2lT/xPxhqy58f0FFT6KHdIB/yBOayI= + dependencies: + - bifunctors + - control + - foldable-traversable + - lazy + - maybe + - newtype + - nonempty + - partial + - prelude + - tailrec + - tuples + - unfoldable + maybe: + type: registry + version: 6.0.0 + integrity: sha256-5cCIb0wPwbat2PRkQhUeZO0jcAmf8jCt2qE0wbC3v2Q= + dependencies: + - control + - invariant + - newtype + - prelude + newtype: + type: registry + version: 5.0.0 + integrity: sha256-gdrQu8oGe9eZE6L3wOI8ql/igOg+zEGB5ITh2g+uttw= + dependencies: + - prelude + - safe-coerce + node-buffer: + type: registry + version: 9.0.0 + integrity: sha256-PWE2DJ5ruBLCmeA/fUiuySEFmUJ/VuRfyrnCuVZBlu4= + dependencies: + - arraybuffer-types + - effect + - maybe + - nullable + - st + - unsafe-coerce + node-event-emitter: + type: registry + version: 3.0.0 + integrity: sha256-Qw0MjsT4xRH2j2i4K8JmRjcMKnH5z1Cw39t00q4LE4w= + dependencies: + - effect + - either + - functions + - maybe + - nullable + - prelude + - unsafe-coerce + node-process: + type: registry + version: 11.2.0 + integrity: sha256-+2MQDYChjGbVbapCyJtuWYwD41jk+BntF/kcOTKBMVs= + dependencies: + - effect + - foreign + - foreign-object + - maybe + - node-event-emitter + - node-streams + - posix-types + - prelude + - unsafe-coerce + node-streams: + type: registry + version: 9.0.0 + integrity: sha256-2n6dq7YWleTDmD1Kur/ul7Cn08IvWrScgPf+0PgX2TQ= + dependencies: + - aff + - effect + - either + - exceptions + - node-buffer + - node-event-emitter + - nullable + - prelude + nonempty: + type: registry + version: 7.0.0 + integrity: sha256-54ablJZUHGvvlTJzi3oXyPCuvY6zsrWJuH/dMJ/MFLs= + dependencies: + - control + - foldable-traversable + - maybe + - prelude + - tuples + - unfoldable + nullable: + type: registry + version: 6.0.0 + integrity: sha256-yiGBVl3AD+Guy4kNWWeN+zl1gCiJK+oeIFtZtPCw4+o= + dependencies: + - effect + - functions + - maybe + numbers: + type: registry + version: 9.0.1 + integrity: sha256-/9M6aeMDBdB4cwYDeJvLFprAHZ49EbtKQLIJsneXLIk= + dependencies: + - functions + - maybe + ordered-collections: + type: registry + version: 3.2.0 + integrity: sha256-o9jqsj5rpJmMdoe/zyufWHFjYYFTTsJpgcuCnqCO6PM= + dependencies: + - arrays + - foldable-traversable + - gen + - lists + - maybe + - partial + - prelude + - st + - tailrec + - tuples + - unfoldable + orders: + type: registry + version: 6.0.0 + integrity: sha256-nBA0g3/ai0euH8q9pSbGqk53W2q6agm/dECZTHcoink= + dependencies: + - newtype + - prelude + parallel: + type: registry + version: 7.0.0 + integrity: sha256-gUC9i4Txnx9K9RcMLsjujbwZz6BB1bnE2MLvw4GIw5o= + dependencies: + - control + - effect + - either + - foldable-traversable + - functors + - maybe + - newtype + - prelude + - profunctor + - refs + - transformers + partial: + type: registry + version: 4.0.0 + integrity: sha256-fwXerld6Xw1VkReh8yeQsdtLVrjfGiVuC5bA1Wyo/J4= + dependencies: [] + posix-types: + type: registry + version: 6.0.0 + integrity: sha256-ZfFz8RR1lee/o/Prccyeut3Q+9tYd08mlR72sIh6GzA= + dependencies: + - maybe + - prelude + prelude: + type: registry + version: 6.0.1 + integrity: sha256-o8p6SLYmVPqzXZhQFd2hGAWEwBoXl1swxLG/scpJ0V0= + dependencies: [] + profunctor: + type: registry + version: 6.0.1 + integrity: sha256-E58hSYdJvF2Qjf9dnWLPlJKh2Z2fLfFLkQoYi16vsFk= + dependencies: + - control + - distributive + - either + - exists + - invariant + - newtype + - prelude + - tuples + refs: + type: registry + version: 6.0.0 + integrity: sha256-Vgwne7jIbD3ZMoLNNETLT8Litw6lIYo3MfYNdtYWj9s= + dependencies: + - effect + - prelude + safe-coerce: + type: registry + version: 2.0.0 + integrity: sha256-a1ibQkiUcbODbLE/WAq7Ttbbh9ex+x33VCQ7GngKudU= + dependencies: + - unsafe-coerce + st: + type: registry + version: 6.2.0 + integrity: sha256-z9X0WsOUlPwNx9GlCC+YccCyz8MejC8Wb0C4+9fiBRY= + dependencies: + - partial + - prelude + - tailrec + - unsafe-coerce + strings: + type: registry + version: 6.0.1 + integrity: sha256-WssD3DbX4OPzxSdjvRMX0yvc9+pS7n5gyPv5I2Trb7k= + 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-Xx19ECVDRrDWpz9D2GxQHHV89vd61dnXxQm0IcYQHGk= + dependencies: + - bifunctors + - effect + - either + - identity + - maybe + - partial + - prelude + - refs + transformers: + type: registry + version: 6.1.0 + integrity: sha256-3Bm+Z6tsC/paG888XkywDngJ2JMos+JfOhRlkVfb7gI= + 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-1rXgTomes9105BjgXqIw0FL6Fz1lqqUTLWOumhWec1M= + dependencies: + - control + - invariant + - prelude + type-equality: + type: registry + version: 4.0.1 + integrity: sha256-Hs9D6Y71zFi/b+qu5NSbuadUQXe5iv5iWx0226vOHUw= + dependencies: [] + typelevel-prelude: + type: registry + version: 7.0.0 + integrity: sha256-uFF2ph+vHcQpfPuPf2a3ukJDFmLhApmkpTMviHIWgJM= + dependencies: + - prelude + - type-equality + unfoldable: + type: registry + version: 6.0.0 + integrity: sha256-JtikvJdktRap7vr/K4ITlxUX1QexpnqBq0G/InLr6eg= + dependencies: + - foldable-traversable + - maybe + - partial + - prelude + - tuples + unicode: + type: registry + version: 6.0.0 + integrity: sha256-QJnTVZpmihEAUiMeYrfkusVoziJWp2hJsgi9bMQLue8= + dependencies: + - foldable-traversable + - maybe + - strings + unsafe-coerce: + type: registry + version: 6.0.0 + integrity: sha256-IqIYW4Vkevn8sI+6aUwRGvd87tVL36BBeOr0cGAE7t0= + dependencies: [] diff --git a/spago.yaml b/spago.yaml new file mode 100644 index 0000000..2611d55 --- /dev/null +++ b/spago.yaml @@ -0,0 +1,38 @@ +package: + name: parsing + dependencies: + - arrays + - control + - effect + - either + - enums + - foldable-traversable + - functions + - identity + - integers + - lazy + - lists + - maybe + - newtype + - nullable + - numbers + - partial + - prelude + - st + - strings + - tailrec + - transformers + - tuples + - unfoldable + - unicode + - unsafe-coerce + test: + main: Test.Main + dependencies: + - assert + - node-process + - debug +workspace: + extraPackages: {} + packageSet: + registry: 60.2.1 diff --git a/src/Parsing.purs b/src/Parsing.purs index ffff1b1..11e0d67 100644 --- a/src/Parsing.purs +++ b/src/Parsing.purs @@ -28,6 +28,7 @@ module Parsing , getParserT , hoistParserT , mapParserT + , eqPositionFull ) where import Prelude @@ -464,6 +465,9 @@ instance Show Position where instance Eq Position where eq (Position l) (Position r) = l.index == r.index +eqPositionFull :: Position -> Position -> Boolean +eqPositionFull (Position l) (Position r) = l.index == r.index && l.line == r.line && l.column == r.column + instance Ord Position where compare (Position l) (Position r) = compare l.index r.index diff --git a/test/Test/IndentationTests.purs b/test/Test/IndentationTests.purs new file mode 100644 index 0000000..6e0592b --- /dev/null +++ b/test/Test/IndentationTests.purs @@ -0,0 +1,133 @@ +module Test.IndentationTests where + +import Parsing.Indent (IndentParser, checkIndent, indentParens, indented, runIndent, withPos) +import Prelude (class Eq, class Show, Unit, bind, discard, pure, void, ($), (*>), (<$>), (<*), (<<<)) +import Test.Lib (class ParseErrorHuman__OnlyString, TestM, mkParseErrorTestMessage, mkParseErrorTestPosition, mkParseErrorTestPositionAndMessage, mkParseTest) + +import Control.Alt ((<|>)) +import Data.Array as Array +import Data.Array.NonEmpty as NonEmpty +import Data.Generic.Rep (class Generic) +import Data.List (fromFoldable) +import Data.Show.Generic (genericShow) +import Data.String (joinWith) +import Data.String.CodeUnits (fromCharArray) +import Effect (Effect) +import Parsing (Position(..), runParserT) +import Parsing.Combinators (many, sepBy) +import Parsing.Combinators.Array as Combinators.Array +import Parsing.Indent as Indent +import Parsing.String (char, eof, string) +import Parsing.String.Basic (alphaNum, intDecimal, skipSpaces) + +parseTest :: forall s a. Show a => Eq a => ParseErrorHuman__OnlyString s => s -> a -> IndentParser s a -> Effect Unit +parseTest = mkParseTest (\input -> runIndent <<< runParserT input) + +parseErrorTestPosition :: forall s a. Show a => IndentParser s a -> s -> Position -> Effect Unit +parseErrorTestPosition = mkParseErrorTestPosition (\input -> runIndent <<< runParserT input) + +parseErrorTestMessage :: forall s a. Show a => IndentParser s a -> s -> String -> Effect Unit +parseErrorTestMessage = mkParseErrorTestMessage (\input -> runIndent <<< runParserT input) + +parseErrorTestPositionAndMessage :: forall s a. Show a => IndentParser s a -> s -> String -> Position -> Effect Unit +parseErrorTestPositionAndMessage = mkParseErrorTestPositionAndMessage (\input -> runIndent <<< runParserT input) + +-- test from https://github.com/jaspervdj/indents/blob/f9e10707c1fe91d7c1aa2dbaf9fb107e146255da/tests/Text/Parsec/Indent/Tests.hs#L12 +data Taxonomy = Taxonomy String (Array Taxonomy) + +derive instance Generic Taxonomy _ +derive instance Eq Taxonomy +instance Show Taxonomy where + show x = genericShow x + +-- | NOTE: skipSpaces will skip " \n " in +-- | ```purs +-- | [ "k \n" +-- | , " a1 \n" +-- | ... +-- | ``` +pTerm :: IndentParser String String +pTerm = ((fromCharArray <$> NonEmpty.toArray) <$> Combinators.Array.many1 alphaNum) <* skipSpaces + +pTaxonomy :: IndentParser String Taxonomy +pTaxonomy = withPos $ do + term <- pTerm + subs <- many $ Indent.indented *> pTaxonomy + pure $ Taxonomy term (Array.fromFoldable subs) + +testIndentationParser :: TestM +testIndentationParser = do + parseTest + ( joinWith "\n" + [ "k \n" + , " a1 \n" + , " a2 \n" + , " b1 \n" + , " a3 \n" + , " haha \n" + , " it \n" + , " works \n" + , " " + ] + ) + ( Taxonomy "k" + [ Taxonomy "a1" [] + , Taxonomy "a2" + [ Taxonomy "b1" [] + ] + , Taxonomy "a3" + [ Taxonomy "haha" [] + , Taxonomy "it" [] + , Taxonomy "works" [] + ] + ] + ) + (pTaxonomy <* eof) + + -- Testing function 'indented' + parseTest "111\n 222\n 333" { x: 111, y: 222, z: 333 } do + x <- intDecimal + void $ string "\n " + indented *> withPos do + checkIndent + y <- intDecimal + void $ string "\n " + indented *> withPos do + checkIndent + z <- intDecimal + eof + pure { x, y, z } + + parseErrorTestPositionAndMessage (do + x <- intDecimal + void $ string "\n " + indented *> withPos do + checkIndent -- This should pass. + y <- intDecimal + void $ string "\n" + indented *> withPos do -- indented should fail + z <- intDecimal + eof + pure { x, y, z } + ) + "111\n 222\n333" + """not indented""" + (Position { column: 1, index: 10, line: 3 }) + + -- Testing function 'indentParens' + parseTest "(1,2,3)" (fromFoldable ["1", "2", "3"]) $ + indentParens $ sepBy (string "1" <|> string "2" <|> string "3") (char ',') + + -- doesnt work, dont understand idea of this method + -- parseTest """(\n 1,\n 2,\n 3)""" (fromFoldable ["1", "2", "3"]) $ + -- indentParens $ sepBy (string "1" <|> string "2" <|> string "3") (char ',') + -- + -- parseTest """(1,\n 2,\n 3)""" (fromFoldable ["1", "2", "3"]) $ + -- indentParens $ sepBy (string "1" <|> string "2" <|> string "3") (char ',') + + parseErrorTestPositionAndMessage + (indentParens $ sepBy (string "1" <|> string "2" <|> string "3") (char ',')) + "(1, 2,3)" + """Expected "3"""" + (Position { column: 4, index: 3, line: 1 }) + diff --git a/test/Test/Lib.purs b/test/Test/Lib.purs new file mode 100644 index 0000000..91aad88 --- /dev/null +++ b/test/Test/Lib.purs @@ -0,0 +1,57 @@ +module Test.Lib where + +import Prelude hiding (between, when) + +import Data.Either (Either(..)) +import Data.String (joinWith) +import Effect (Effect) +import Effect.Console (logShow) +import Parsing (ParseError, ParserT, Position, eqPositionFull, parseErrorMessage, parseErrorPosition) +import Parsing.String (parseErrorHuman) +import Test.Assert (assert') + +type TestM = Effect Unit + +-- For pretty printing error if input is string, but print nothing if input is not string +class ParseErrorHuman__OnlyString s where + parseErrorHuman__onlyString :: s -> Int -> ParseError -> Array String + +instance ParseErrorHuman__OnlyString String where + parseErrorHuman__onlyString = parseErrorHuman +else instance ParseErrorHuman__OnlyString a where + parseErrorHuman__onlyString _ _ _ = [] + +-- | Generalized version of `mkParseTest` that works with any input type +mkParseTest :: forall s a m. Show a => Eq a => ParseErrorHuman__OnlyString s => (s -> ParserT s m a -> Either ParseError a) -> s -> a -> ParserT s m a -> Effect Unit +mkParseTest runParser input expected p = case runParser input p of + Right actual -> do + assert' ("expected output: " <> show expected <> ", actual output: " <> show actual) (expected == actual) + logShow actual + Left err -> assert' (joinWith "\n" $ ["error: " <> show err] <> parseErrorHuman__onlyString input 60 err) false + +mkParseErrorTestPosition :: forall s a m. Show a => (s -> ParserT s m a -> Either ParseError a) -> ParserT s m a -> s -> Position -> Effect Unit +mkParseErrorTestPosition runParser p input expected = case runParser input p of + Right x -> assert' ("ParseError expected at " <> show expected <> " but parsed " <> show x) false + Left err -> do + let pos = parseErrorPosition err + assert' ("expected position: " <> show expected <> ", actual position: " <> show pos) (eqPositionFull expected pos) + logShow expected + +mkParseErrorTestMessage :: forall s a m. Show a => (s -> ParserT s m a -> Either ParseError a) -> ParserT s m a -> s -> String -> Effect Unit +mkParseErrorTestMessage runParser p input expected = case runParser input p of + Right x -> assert' ("ParseError expected '" <> expected <> "' but parsed " <> show x) false + Left err -> do + let msg = parseErrorMessage err + assert' ("expected message: " <> expected <> ", actual message: " <> msg) (expected == msg) + logShow expected + +mkParseErrorTestPositionAndMessage :: forall s a m. Show a => (s -> ParserT s m a -> Either ParseError a) -> ParserT s m a -> s -> String -> Position -> Effect Unit +mkParseErrorTestPositionAndMessage runParser p input expectedMessage expectedPosition = case runParser input p of + Right x -> assert' ("ParseError '" <> expectedMessage <> "' expected at " <> show expectedPosition <> " but parsed " <> show x) false + Left err -> do + let pos = parseErrorPosition err + let msg = parseErrorMessage err + assert' ("expected position: " <> show expectedPosition <> ", actual position: " <> show pos) (eqPositionFull expectedPosition pos) + assert' ("expected message: " <> expectedMessage <> ", actual message: " <> msg) (expectedMessage == msg) + logShow expectedMessage + logShow expectedPosition diff --git a/test/Main.purs b/test/Test/Main.purs similarity index 97% rename from test/Main.purs rename to test/Test/Main.purs index a204298..e2c0e23 100644 --- a/test/Main.purs +++ b/test/Test/Main.purs @@ -5,7 +5,7 @@ module Test.Main where -import Prelude hiding (between, when) +import Prelude (class Eq, class Show, Unit, append, bind, const, discard, div, flip, identity, map, negate, pure, show, unit, void, ($), ($>), (*), (*>), (+), (-), (/), (/=), (<$), (<$>), (<*), (<*>), (<>), (==), (>>=)) import Control.Alt ((<|>)) import Control.Lazy (fix, defer) @@ -35,7 +35,7 @@ import Effect (Effect) import Effect.Console (log, logShow) import Effect.Unsafe (unsafePerformEffect) import Node.Process (lookupEnv) -import Parsing (ParseError(..), ParseState(..), Parser, ParserT, Position(..), consume, fail, getParserT, initialPos, parseErrorMessage, parseErrorPosition, position, region, runParser) +import Parsing (ParseError(..), ParseState(..), Parser, ParserT, Position(..), consume, fail, getParserT, initialPos, parseErrorPosition, position, region, runParser) import Parsing.Combinators (advance, between, chainl, chainl1, chainr, chainr1, choice, empty, endBy, endBy1, lookAhead, many, many1, many1Till, many1Till_, manyIndex, manyTill, manyTill_, notFollowedBy, optionMaybe, replicateA, sepBy, sepBy1, sepEndBy, sepEndBy1, skipMany, skipMany1, try, tryRethrow, (), (), (<~?>)) import Parsing.Combinators.Array as Combinators.Array import Parsing.Expr (Assoc(..), Operator(..), buildExprParser) @@ -48,6 +48,17 @@ import Parsing.Token (TokenParser, makeTokenParser, token, when) import Parsing.Token as Token import Partial.Unsafe (unsafePartial) import Test.Assert (assert', assertEqual') +import Test.IndentationTests as IndentationTests +import Test.Lib + +parseTest :: forall s a. Show a => Eq a => ParseErrorHuman__OnlyString s => s -> a -> Parser s a -> Effect Unit +parseTest = mkParseTest runParser + +parseErrorTestPosition :: forall s a. Show a => Parser s a -> s -> Position -> Effect Unit +parseErrorTestPosition = mkParseErrorTestPosition runParser + +parseErrorTestMessage :: forall s a. Show a => Parser s a -> s -> String -> Effect Unit +parseErrorTestMessage = mkParseErrorTestMessage runParser parens :: forall m a. ParserT String m a -> ParserT String m a parens = between (string "(") (string ")") @@ -59,29 +70,6 @@ nested = fix \p -> pure 0 ) <|> ((+) 1) <$> parens p -parseTest :: forall s a. Show a => Eq a => s -> a -> Parser s a -> Effect Unit -parseTest input expected p = case runParser input p of - Right actual -> do - assert' ("expected: " <> show expected <> ", actual: " <> show actual) (expected == actual) - logShow actual - Left err -> assert' ("error: " <> show err) false - -parseErrorTestPosition :: forall s a. Show a => Parser s a -> s -> Position -> Effect Unit -parseErrorTestPosition p input expected = case runParser input p of - Right x -> assert' ("ParseError expected at " <> show expected <> " but parsed " <> show x) false - Left err -> do - let pos = parseErrorPosition err - assert' ("expected: " <> show expected <> ", pos: " <> show pos) (expected == pos) - logShow expected - -parseErrorTestMessage :: forall s a. Show a => Parser s a -> s -> String -> Effect Unit -parseErrorTestMessage p input expected = case runParser input p of - Right x -> assert' ("ParseError expected '" <> expected <> "' but parsed " <> show x) false - Left err -> do - let msg = parseErrorMessage err - assert' ("expected: " <> expected <> ", message: " <> msg) (expected == msg) - logShow expected - opTest :: Parser String String opTest = chainl (singleton <$> anyChar) (char '+' $> append) "" @@ -259,8 +247,6 @@ testTokenParser = makeTokenParser haskellDef mkPos :: Int -> Position mkPos n = Position { index: n - 1, line: 1, column: n } -type TestM = Effect Unit - tokenParserIdentifierTest :: TestM tokenParserIdentifierTest = do -- parse normal identifier @@ -589,6 +575,9 @@ javaStyleTest = do main :: Effect Unit main = do + log "\nTESTS Indentation\n" + IndentationTests.testIndentationParser + log "\nTESTS String\n" parseErrorTestPosition (many $ char 'f' *> char '?')