diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8d2e1a..87de45e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - name: Install dependencies run: | - npm install -g bower + npm install -g spago npm install - name: Build source diff --git a/.gitignore b/.gitignore index bbc4fe2..78b347c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ node_modules/ tmp/ .psci_modules/ .pulp-cache/ +.spago/ npm-debug.log docs/ diff --git a/.purs-repl b/.purs-repl new file mode 100644 index 0000000..6802fc7 --- /dev/null +++ b/.purs-repl @@ -0,0 +1 @@ +import Prelude diff --git a/bower.json b/bower.json deleted file mode 100644 index d195a18..0000000 --- a/bower.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "purescript-sequences", - "homepage": "https://github.com/hdgarrood/purescript-sequences", - "description": "An efficient, general purpose sequence type.", - "keywords": [ - "purescript" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/hdgarrood/purescript-sequences.git" - }, - "ignore": [ - "**/.*", - "bower_components", - "node_modules", - "output", - "tests", - "tmp", - "bower.json", - "Gruntfile.js", - "package.json" - ], - "dependencies": { - "purescript-arrays": "^v6.0.0", - "purescript-assert": "^v5.0.0", - "purescript-console": "^v5.0.0", - "purescript-effect": "^v3.0.0", - "purescript-lazy": "^v5.0.0", - "purescript-maybe": "^v5.0.0", - "purescript-newtype": "^v4.0.0", - "purescript-nonempty": "^v6.0.0", - "purescript-partial": "^v3.0.0", - "purescript-prelude": "^v5.0.0", - "purescript-profunctor": "^v5.0.0", - "purescript-psci-support": "^v5.0.0", - "purescript-tuples": "^v6.0.0", - "purescript-unfoldable": "^v5.0.0", - "purescript-unsafe-coerce": "^v5.0.0" - }, - "devDependencies": { - "purescript-quickcheck": "^7.0.0", - "purescript-quickcheck-laws": "^6.0.0" - } -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..21e13df --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2071 @@ +{ + "name": "purescript-sequences", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "hasInstallScript": true, + "devDependencies": { + "benchmark": "^2.1.4", + "purs-tidy": "^0.10.0", + "spago": "0.21.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/purs-tidy": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/purs-tidy/-/purs-tidy-0.10.0.tgz", + "integrity": "sha512-ULbJfBHRngczYwcOzugytRiNy+Guy2VXoAG1jMtGaSFEaUZk1lZkKU11t8jIZTrDdOrkgqlWCZLi3mfcHvdimA==", + "dev": true, + "bin": { + "purs-tidy": "bin/index.js" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/spago": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/spago/-/spago-0.21.0.tgz", + "integrity": "sha512-1qTPaIhrsLCvneSJt1fyq3CpNMu01Xhcn+b09IMbyrpLcptMoGH5uOtyNL9eohTRMzPWBKUs6ksFLGdjJp7yxQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "make-fetch-happen": "^11.0.1", + "tar": "^6.1.11" + }, + "bin": { + "spago": "spago" + } + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, + "dependencies": { + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + } + }, + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true + } + } + }, + "platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "purs-tidy": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/purs-tidy/-/purs-tidy-0.10.0.tgz", + "integrity": "sha512-ULbJfBHRngczYwcOzugytRiNy+Guy2VXoAG1jMtGaSFEaUZk1lZkKU11t8jIZTrDdOrkgqlWCZLi3mfcHvdimA==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "spago": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/spago/-/spago-0.21.0.tgz", + "integrity": "sha512-1qTPaIhrsLCvneSJt1fyq3CpNMu01Xhcn+b09IMbyrpLcptMoGH5uOtyNL9eohTRMzPWBKUs6ksFLGdjJp7yxQ==", + "dev": true, + "requires": { + "make-fetch-happen": "^11.0.1", + "tar": "^6.1.11" + } + }, + "ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, + "tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "requires": { + "unique-slug": "^4.0.0" + } + }, + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json index ffa132e..4fbd57c 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,14 @@ "private": true, "devDependencies": { "benchmark": "^2.1.4", - "pulp": "^12.3.1" + "purs-tidy": "^0.10.0", + "spago": "0.21.0" }, "scripts": { - "postinstall": "bower install", + "postinstall": "spago install", "bench": "pulp build -I benchmarks --main Benchmark.Main -O --to output/benchmarks.js && (echo '*' | node output/benchmarks.js)", - "build": "pulp build", - "test": "pulp test" + "build": "spago build", + "test": "spago test", + "tidy": "purs-tidy format-in-place src/**/*.purs && purs-tidy format-in-place test/**/*.purs && purs-tidy format-in-place benchmark/**/*.purs" } } diff --git a/packages.dhall b/packages.dhall new file mode 100644 index 0000000..3b10904 --- /dev/null +++ b/packages.dhall @@ -0,0 +1,105 @@ +{- +Welcome to your new Dhall package-set! + +Below are instructions for how to edit this file for most use +cases, so that you don't need to know Dhall to use it. + +## Use Cases + +Most will want to do one or both of these options: +1. Override/Patch a package's dependency +2. Add a package not already in the default package set + +This file will continue to work whether you use one or both options. +Instructions for each option are explained below. + +### Overriding/Patching a package + +Purpose: +- Change a package's dependency to a newer/older release than the + default package set's release +- Use your own modified version of some dependency that may + include new API, changed API, removed API by + using your custom git repo of the library rather than + the package set's repo + +Syntax: +where `entityName` is one of the following: +- dependencies +- repo +- version +------------------------------- +let upstream = -- +in upstream + with packageName.entityName = "new value" +------------------------------- + +Example: +------------------------------- +let upstream = -- +in upstream + with halogen.version = "master" + with halogen.repo = "https://example.com/path/to/git/repo.git" + + with halogen-vdom.version = "v4.0.0" + with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies +------------------------------- + +### Additions + +Purpose: +- Add packages that aren't already included in the default package set + +Syntax: +where `` is: +- a tag (i.e. "v4.0.0") +- a branch (i.e. "master") +- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977") +------------------------------- +let upstream = -- +in upstream + with new-package-name = + { dependencies = + [ "dependency1" + , "dependency2" + ] + , repo = + "https://example.com/path/to/git/repo.git" + , version = + "" + } +------------------------------- + +Example: +------------------------------- +let upstream = -- +in upstream + with benchotron = + { dependencies = + [ "arrays" + , "exists" + , "profunctor" + , "strings" + , "quickcheck" + , "lcg" + , "transformers" + , "foldable-traversable" + , "exceptions" + , "node-fs" + , "node-buffer" + , "node-readline" + , "datetime" + , "now" + ] + , repo = + "https://github.com/hdgarrood/purescript-benchotron.git" + , version = + "v7.0.0" + } +------------------------------- +-} +let upstream = + https://github.com/purescript/package-sets/releases/download/psc-0.15.10-20231014/packages.dhall + sha256:779d9425686b00140c0bb94b9f5b1eab052643d36e30b900c7fe7d45bab315d5 + +in upstream diff --git a/spago.dhall b/spago.dhall new file mode 100644 index 0000000..3696b01 --- /dev/null +++ b/spago.dhall @@ -0,0 +1,35 @@ +{- +Welcome to a Spago project! +You can edit this file as you like. + +Need help? See the following resources: +- Spago documentation: https://github.com/purescript/spago +- Dhall language tour: https://docs.dhall-lang.org/tutorials/Language-Tour.html + +When creating a new Spago project, you can use +`spago init --no-comments` or `spago init -C` +to generate this file without the comments in this block. +-} +{ name = "sequences" +, dependencies = + [ "arrays" + , "assert" + , "console" + , "control" + , "effect" + , "foldable-traversable" + , "lazy" + , "maybe" + , "newtype" + , "partial" + , "prelude" + , "profunctor" + , "quickcheck" + , "quickcheck-laws" + , "tuples" + , "unfoldable" + , "unsafe-coerce" + ] +, packages = ./packages.dhall +, sources = [ "src/**/*.purs", "test/**/*.purs" ] +} diff --git a/src/Data/FingerTree.purs b/src/Data/FingerTree.purs index 9aae62a..25566ed 100644 --- a/src/Data/FingerTree.purs +++ b/src/Data/FingerTree.purs @@ -1,4 +1,3 @@ - -- | This module defines a general-purpose data structure, known as a "finger -- | tree", which is intended to be used as a building block for implementing -- | other data structures. See, for example, `Seq` from `Data.Sequence`. @@ -55,9 +54,22 @@ import Data.Unfoldable (class Unfoldable, unfoldr) import Partial (crashWith) import Partial.Unsafe (unsafePartial) -import Data.FingerTree.Digit (Digit, initDigit, headDigit, tailDigit, - lastDigit, mkDigit, mkDigit1, mkDigit2, mkDigit3, mkDigitMay, runDigit, - digitLength, snocDigit, consDigit) +import Data.FingerTree.Digit + ( Digit + , initDigit + , headDigit + , tailDigit + , lastDigit + , mkDigit + , mkDigit1 + , mkDigit2 + , mkDigit3 + , mkDigitMay + , runDigit + , digitLength + , snocDigit + , consDigit + ) import Data.FingerTree.Digit as Digit import Data.Sequence.Internal (class Measured, (<$$$>), measure) @@ -65,16 +77,23 @@ data Node v a = Node2 v a a | Node3 v a a a instance showNode :: (Show a, Show v) => Show (Node v a) where show (Node2 v a b) = - ("Node2 (" <> show v - <> ") (" <> show a - <> ") (" <> show b - <> ")") + ( "Node2 (" <> show v + <> ") (" + <> show a + <> ") (" + <> show b + <> ")" + ) show (Node3 v a b c) = - ("Node3 (" <> show v - <> ") (" <> show a - <> ") (" <> show b - <> ") (" <> show c - <> ")") + ( "Node3 (" <> show v + <> ") (" + <> show a + <> ") (" + <> show b + <> ") (" + <> show c + <> ")" + ) node2 :: forall a v. Monoid v => Measured a v => a -> a -> Node v a node2 a b = Node2 (measure a <> measure b) a b @@ -89,13 +108,13 @@ nodeToDigit = go go (Node3 _ a b c) = mkDigit3 a b c instance functorNode :: Functor (Node v) where - map f (Node2 v a b) = Node2 v (f a) (f b) + map f (Node2 v a b) = Node2 v (f a) (f b) map f (Node3 v a b c) = Node3 v (f a) (f b) (f c) instance foldableNode :: Foldable (Node v) where - foldr r z (Node2 _ a b) = r a (r b z) + foldr r z (Node2 _ a b) = r a (r b z) foldr r z (Node3 _ a b c) = r a (r b (r c z)) - foldl l z (Node2 _ a b) = l (l z a) b + foldl l z (Node2 _ a b) = l (l z a) b foldl l z (Node3 _ a b c) = l (l (l z a) b) c foldMap f xs = foldr (\x acc -> f x <> acc) mempty xs @@ -110,23 +129,26 @@ instance measuredNode :: Measured (Node v a) v where -- Deep node may have debits, the cost of suspended code, as many as safe -- digits it has (i.e., 0, 1, or 2). -data FingerTree v a = Empty - | Single a - | Deep - (Lazy v) - (Digit a) - (Lazy (FingerTree v (Node v a))) - (Digit a) - +data FingerTree v a + = Empty + | Single a + | Deep + (Lazy v) + (Digit a) + (Lazy (FingerTree v (Node v a))) + (Digit a) lazyEmpty :: forall v a. Lazy (FingerTree v a) lazyEmpty = defer (\_ -> Empty) -deep :: forall a v. Monoid v => Measured a v - => Digit a - -> Lazy (FingerTree v (Node v a)) - -> Digit a - -> FingerTree v a +deep + :: forall a v + . Monoid v + => Measured a v + => Digit a + -> Lazy (FingerTree v (Node v a)) + -> Digit a + -> FingerTree v a deep pr m sf = Deep (defer (\_ -> measure pr <> measure m <> measure sf)) pr m sf @@ -134,11 +156,15 @@ instance showFingerTree :: (Show v, Show a) => Show (FingerTree v a) where show Empty = "Empty" show (Single a) = "Single (" <> show a <> ")" show (Deep v pr m sf) = - ("Deep (" <> show v - <> ") (" <> show pr - <> ") (" <> show m - <> ") (" <> show sf - <> ")") + ( "Deep (" <> show v + <> ") (" + <> show pr + <> ") (" + <> show m + <> ") (" + <> show sf + <> ")" + ) instance semigroupFingerTree :: (Monoid v, Measured a v) => Semigroup (FingerTree v a) where append = append @@ -147,37 +173,53 @@ instance semigroupFingerTree :: (Monoid v, Measured a v) => Semigroup (FingerTre -- about the meaning of the data, and because we expect actual uses of -- FingerTrees to use newtypes, so we provide this function instead to help -- with defining Ord instances. -eqFingerTree :: forall a v. Monoid v => Measured a v => Eq a => - FingerTree v a -> FingerTree v a -> Boolean +eqFingerTree + :: forall a v + . Monoid v + => Measured a v + => Eq a + => FingerTree v a + -> FingerTree v a + -> Boolean eqFingerTree xs ys = case Tuple (viewL xs) (viewL ys) of Tuple NilL NilL -> true - Tuple NilL _ -> false - Tuple _ NilL -> false + Tuple NilL _ -> false + Tuple _ NilL -> false Tuple (ConsL x xs') (ConsL y ys') -> - if x == y - then - let xs'' = force xs' - ys'' = force ys' - in eqFingerTree xs'' ys'' - else - false + if x == y then + let + xs'' = force xs' + ys'' = force ys' + in + eqFingerTree xs'' ys'' + else + false -- We don't implement an Ord instance because we can't implement a good Eq -- instance, and because we expect actual uses of FingerTrees to use newtypes, -- so we provide this function instead to help with defining Ord instances. -compareFingerTree :: forall a v. Monoid v => Measured a v => Ord a => - FingerTree v a -> FingerTree v a -> Ordering +compareFingerTree + :: forall a v + . Monoid v + => Measured a v + => Ord a + => FingerTree v a + -> FingerTree v a + -> Ordering compareFingerTree xs ys = case Tuple (viewL xs) (viewL ys) of Tuple NilL NilL -> EQ - Tuple NilL _ -> LT - Tuple _ NilL -> GT + Tuple NilL _ -> LT + Tuple _ NilL -> GT Tuple (ConsL x xs') (ConsL y ys') -> case compare x y of - EQ -> let xs'' = force xs' - ys'' = force ys' - in compareFingerTree xs'' ys'' + EQ -> + let + xs'' = force xs' + ys'' = force ys' + in + compareFingerTree xs'' ys'' other -> other instance functorFingerTree :: Functor (FingerTree v) where @@ -186,71 +228,77 @@ instance functorFingerTree :: Functor (FingerTree v) where map f (Deep v pr m sf) = Deep v (f <$> pr) (f <$$$> m) (f <$> sf) instance foldableFingerTree :: Foldable (FingerTree v) where - foldr _ z Empty = z - foldr r z (Single x) = r x z + foldr _ z Empty = z + foldr r z (Single x) = r x z foldr r z (Deep _ pr m sf) = flipFoldr' pr (deepFlipFoldr (force m) (flipFoldr sf z)) where flipFoldr = flip (foldr r) --- infix 2 flipFoldr as -<< + -- infix 2 flipFoldr as -<< -- this is a hack to get type inference to work flipFoldr' = flip (foldr r) --- infix 2 flipFoldr' as +<< + -- infix 2 flipFoldr' as +<< deepFlipFoldr = flip (foldr (flip (foldr r))) --- infix 2 deepFlipFoldr as -<<< - + -- infix 2 deepFlipFoldr as -<<< - foldl _ z Empty = z - foldl l z (Single x) = l z x + foldl _ z Empty = z + foldl l z (Single x) = l z x foldl l z (Deep _ pr m sf) = leftFold (deepLeftFold (leftFold z pr) (force m)) sf where leftFold = foldl l --- infix 2 leftFold as >>- + -- infix 2 leftFold as >>- deepLeftFold = foldl (foldl l) --- infix 2 deepLeftFold as >>>- + -- infix 2 deepLeftFold as >>>- foldMap f xs = foldr (\x acc -> f x <> acc) mempty xs - instance traversableFingerTree :: Traversable (FingerTree v) where - traverse f Empty = pure Empty - traverse f (Single x) = Single <$> f x + traverse f Empty = pure Empty + traverse f (Single x) = Single <$> f x traverse f (Deep v pr m sf) = Deep v <$> traverse f pr - <*> (defer <$> kl) - <*> traverse f sf + <*> (defer <$> kl) + <*> traverse f sf where l = traverse (traverse f) (force m) kl = const <$> l sequence = traverse identity -instance measuredFingerTree :: (Monoid v, Measured a v) - => Measured (FingerTree v a) v where +instance measuredFingerTree :: + ( Monoid v + , Measured a v + ) => + Measured (FingerTree v a) v where measure Empty = mempty measure (Single x) = measure x measure (Deep v _ _ _) = (force v) -cons :: forall a v. Monoid v => Measured a v => - a -> FingerTree v a -> FingerTree v a -cons a Empty = Single a -cons a (Single b) = deep (mkDigit1 a) lazyEmpty (mkDigit1 b) +cons + :: forall a v + . Monoid v + => Measured a v + => a + -> FingerTree v a + -> FingerTree v a +cons a Empty = Single a +cons a (Single b) = deep (mkDigit1 a) lazyEmpty (mkDigit1 b) cons a (Deep _ pr m sf) = case runDigit pr of - [b, c, d, e] -> + [ b, c, d, e ] -> let -- If sf is safe, we pass one debit to the outer suspension to force the -- suspension. If sf is dangerous, we have no debits, so that we can -- freely force the suspension. forcedM = force m in - -- Since we turn a dangerous digit to safe digit, we will get one extra - -- debit allowance after prepend. We creates one debit for unshared cost - -- of recursive call. We receives another debit from recursive call. - -- If sf is safe, we now have two debit allowance, so that the constraint - -- is satisfied. if sf is dangerous, we can pass a debit to the outer - -- suspension to satisfy constraint. - deep (mkDigit2 a b) (defer (\_ -> cons (node3 c d e) forcedM)) sf + -- Since we turn a dangerous digit to safe digit, we will get one extra + -- debit allowance after prepend. We creates one debit for unshared cost + -- of recursive call. We receives another debit from recursive call. + -- If sf is safe, we now have two debit allowance, so that the constraint + -- is satisfied. if sf is dangerous, we can pass a debit to the outer + -- suspension to satisfy constraint. + deep (mkDigit2 a b) (defer (\_ -> cons (node3 c d e) forcedM)) sf _ -> let -- This is safe because the previous pattern match ensures that pr has @@ -259,42 +307,68 @@ cons a (Deep _ pr m sf) = in deep pr' m sf -snoc :: forall a v. Monoid v => Measured a v => - FingerTree v a -> a -> FingerTree v a -snoc Empty a = Single a -snoc (Single b) a = deep (mkDigit1 b) lazyEmpty (mkDigit1 a) +snoc + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> a + -> FingerTree v a +snoc Empty a = Single a +snoc (Single b) a = deep (mkDigit1 b) lazyEmpty (mkDigit1 a) snoc (Deep _ pr m sf) a = case runDigit sf of - [e, d, c, b] -> + [ e, d, c, b ] -> let forcedM = force m in - deep pr (defer (\_ -> snoc forcedM (node3 e d c))) (mkDigit2 b a) + deep pr (defer (\_ -> snoc forcedM (node3 e d c))) (mkDigit2 b a) _ -> deep pr m (unsafePartial (snocDigit sf a)) -consAll :: forall f a v. Monoid v => Measured a v => Foldable f => - f a -> FingerTree v a -> FingerTree v a +consAll + :: forall f a v + . Monoid v + => Measured a v + => Foldable f + => f a + -> FingerTree v a + -> FingerTree v a consAll = flip (foldr cons) -snocAll :: forall f a v. Monoid v => Measured a v => Foldable f => - FingerTree v a -> f a -> FingerTree v a +snocAll + :: forall f a v + . Monoid v + => Measured a v + => Foldable f + => FingerTree v a + -> f a + -> FingerTree v a snocAll = foldl snoc -toFingerTree :: forall f a v. Monoid v => Measured a v => Foldable f => - f a -> FingerTree v a +toFingerTree + :: forall f a v + . Monoid v + => Measured a v + => Foldable f + => f a + -> FingerTree v a toFingerTree s = snocAll Empty s data ViewL s a = NilL | ConsL a (Lazy (s a)) instance functorViewL :: Functor s => Functor (ViewL s) where map f NilL = NilL - map f (ConsL x xs) = ConsL (f x) (map f <$> xs) - -viewL :: forall a v. Monoid v => Measured a v - => FingerTree v a -> ViewL (FingerTree v) a -viewL Empty = NilL -viewL (Single x) = ConsL x lazyEmpty + map f (ConsL x xs) = ConsL (f x) (map f <$> xs) + +viewL + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> ViewL (FingerTree v) a +viewL Empty = NilL +viewL (Single x) = ConsL x lazyEmpty -- If pr has more than two elements, no debits are discharged. -- If pr has exactly two elements, debit allowance is decreased by one, -- so that passes it to the outer suspension. @@ -311,68 +385,98 @@ viewL (Single x) = ConsL x lazyEmpty -- one debit to outer suspension satisfies the constraint. viewL (Deep _ pr m sf) = ConsL (headDigit pr) (defer (\_ -> deepL (tailDigit pr) m sf)) -deepL :: forall a v. Monoid v => Measured a v - => Array a -> Lazy (FingerTree v (Node v a)) -> Digit a -> FingerTree v a +deepL + :: forall a v + . Monoid v + => Measured a v + => Array a + -> Lazy (FingerTree v (Node v a)) + -> Digit a + -> FingerTree v a deepL pr' m sf = case mkDigitMay pr' of Just pr -> deep pr m sf Nothing -> case viewL (force m) of - NilL -> toFingerTree sf + NilL -> toFingerTree sf ConsL a m' -> deep (nodeToDigit a) m' sf isEmpty :: forall a v. Monoid v => Measured a v => FingerTree v a -> Boolean isEmpty x = case viewL x of - NilL -> true + NilL -> true ConsL _ _ -> false head :: forall a v. Monoid v => Measured a v => FingerTree v a -> Maybe a head x = case viewL x of ConsL a _ -> Just a - NilL -> Nothing - -tail :: forall a v. Monoid v => Measured a v => - FingerTree v a -> Maybe (FingerTree v a) + NilL -> Nothing + +tail + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> Maybe (FingerTree v a) tail x = case viewL x of ConsL _ x' -> Just (force x') - NilL -> Nothing + NilL -> Nothing data ViewR s a = NilR | SnocR (Lazy (s a)) a -viewR :: forall a v. Monoid v => Measured a v - => FingerTree v a -> ViewR (FingerTree v) a -viewR Empty = NilR -viewR (Single x) = SnocR lazyEmpty x +viewR + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> ViewR (FingerTree v) a +viewR Empty = NilR +viewR (Single x) = SnocR lazyEmpty x viewR (Deep _ pr m sf) = SnocR (defer (\_ -> deepR pr m (initDigit sf))) (lastDigit sf) -deepR :: forall a v. Monoid v => Measured a v - => Digit a -> Lazy (FingerTree v (Node v a)) -> Array a -> FingerTree v a +deepR + :: forall a v + . Monoid v + => Measured a v + => Digit a + -> Lazy (FingerTree v (Node v a)) + -> Array a + -> FingerTree v a deepR pr m sf' = case mkDigitMay sf' of Just sf -> deep pr m sf Nothing -> case viewR (force m) of - NilR -> toFingerTree pr + NilR -> toFingerTree pr SnocR m' a -> deep pr m' (nodeToDigit a) last :: forall a v. Monoid v => Measured a v => FingerTree v a -> Maybe a last x = case viewR x of SnocR _ a -> Just a - NilR -> Nothing - -init :: forall a v. Monoid v => Measured a v => - FingerTree v a -> Maybe (FingerTree v a) + NilR -> Nothing + +init + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> Maybe (FingerTree v a) init x = case viewR x of SnocR x' _ -> Just (force x') - NilR -> Nothing - -app3 :: forall a v. Monoid v => Measured a v - => FingerTree v a -> Array a -> FingerTree v a -> FingerTree v a -app3 Empty ts xs = consAll ts xs -app3 xs ts Empty = snocAll xs ts + NilR -> Nothing + +app3 + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> Array a + -> FingerTree v a + -> FingerTree v a +app3 Empty ts xs = consAll ts xs +app3 xs ts Empty = snocAll xs ts app3 (Single x) ts xs = cons x (consAll ts xs) app3 xs ts (Single x) = snoc (snocAll xs ts) x app3 (Deep _ pr1 m1 sf1) ts (Deep _ pr2 m2 sf2) = @@ -380,32 +484,43 @@ app3 (Deep _ pr1 m1 sf1) ts (Deep _ pr2 m2 sf2) = computeM' _ = app3 (force m1) (nodes (runDigit sf1 <> ts <> runDigit pr2)) (force m2) in - deep pr1 (defer computeM') sf2 + deep pr1 (defer computeM') sf2 nodes :: forall a v. Monoid v => Measured a v => Array a -> Array (Node v a) nodes xs = case xs of - [a, b] -> - [node2 a b] - [a, b, c] -> - [node3 a b c] - [a, b, c, d] -> - [node2 a b, node2 c d] + [ a, b ] -> + [ node2 a b ] + [ a, b, c ] -> + [ node3 a b c ] + [ a, b, c, d ] -> + [ node2 a b, node2 c d ] _ -> let idx = unsafePartial A.unsafeIndex in node3 (idx xs 0) (idx xs 1) (idx xs 2) A.: nodes (A.drop 3 xs) -append :: forall a v. Monoid v => Measured a v - => FingerTree v a -> FingerTree v a -> FingerTree v a +append + :: forall a v + . Monoid v + => Measured a v + => FingerTree v a + -> FingerTree v a + -> FingerTree v a append xs ys = app3 xs [] ys data Split f a = Split (f a) a (f a) data LazySplit f a = LazySplit (Lazy (f a)) a (Lazy (f a)) -splitDigit :: forall a v. Monoid v => Measured a v => - (v -> Boolean) -> v -> Digit a -> Split Array a +splitDigit + :: forall a v + . Monoid v + => Measured a v + => (v -> Boolean) + -> v + -> Digit a + -> Split Array a splitDigit p i as = case digitLength as of 1 -> Split [] (headDigit as) [] @@ -418,84 +533,112 @@ splitDigit p i as = bs = unsafePartial $ mkDigit bs' i' = i <> measure a in - if p i' - then Split [] a bs' - else case splitDigit p i' bs of - Split l x r -> - Split (A.cons a l) x r + if p i' then Split [] a bs' + else case splitDigit p i' bs of + Split l x r -> + Split (A.cons a l) x r -- | This function throws an error if the argument is empty. -splitTree :: forall a v. Monoid v => Measured a v => Partial => - (v -> Boolean) -> v -> FingerTree v a -> LazySplit (FingerTree v) a +splitTree + :: forall a v + . Monoid v + => Measured a v + => Partial + => (v -> Boolean) + -> v + -> FingerTree v a + -> LazySplit (FingerTree v) a splitTree p i (Single x) = LazySplit lazyEmpty x lazyEmpty splitTree _ _ Empty = crashWith "Data.FingerTree.splitTree: Empty" splitTree p i (Deep _ pr m sf) = - let vpr = i <> measure pr - in if p vpr - then case splitDigit p i pr of + let + vpr = i <> measure pr + in + if p vpr then case splitDigit p i pr of Split l x r -> LazySplit (defer (\_ -> toFingerTree l)) x (defer (\_ -> deepL r m sf)) else - let vm = vpr <> measure m - in if p vm - then + let + vm = vpr <> measure m + in + if p vm then case splitTree p vpr (force m) of LazySplit ml xs mr -> case splitDigit p (vpr <> measure ml) (nodeToDigit xs) of Split l x r -> LazySplit (defer (\_ -> deepR pr ml l)) - x - (defer (\_ -> deepL r mr sf)) + x + (defer (\_ -> deepL r mr sf)) else case splitDigit p vm sf of - Split l x r -> - LazySplit (defer (\_ -> deepR pr m l)) - x - (defer (\_ -> toFingerTree r)) + Split l x r -> + LazySplit (defer (\_ -> deepR pr m l)) + x + (defer (\_ -> toFingerTree r)) -- | Split a finger tree according to which elements satisfy a predicate. This -- | function is partial because it requires that the result of applying the -- | predicate to mempty is false; if this is not the case, the behaviour is -- | undefined. -split :: forall a v. Monoid v => Measured a v => Partial - => (v -> Boolean) - -> FingerTree v a - -> Tuple (Lazy (FingerTree v a)) (Lazy (FingerTree v a)) +split + :: forall a v + . Monoid v + => Measured a v + => Partial + => (v -> Boolean) + -> FingerTree v a + -> Tuple (Lazy (FingerTree v a)) (Lazy (FingerTree v a)) split p Empty = Tuple lazyEmpty lazyEmpty split p xs = - if p (measure xs) - then - case unsafePartial $ splitTree p mempty xs of - LazySplit l x r -> - Tuple l (defer (\_ -> cons x (force r))) - else - Tuple (defer (\_ -> xs)) lazyEmpty - -filter :: forall a v. Monoid v => Measured a v - => (a -> Boolean) -> FingerTree v a -> FingerTree v a + if p (measure xs) then + case unsafePartial $ splitTree p mempty xs of + LazySplit l x r -> + Tuple l (defer (\_ -> cons x (force r))) + else + Tuple (defer (\_ -> xs)) lazyEmpty + +filter + :: forall a v + . Monoid v + => Measured a v + => (a -> Boolean) + -> FingerTree v a + -> FingerTree v a filter p = foldr (\x acc -> if p x then cons x acc else acc) Empty -unfoldLeft :: forall f a v. Unfoldable f => Monoid v => Measured a v => - FingerTree v a -> f a +unfoldLeft + :: forall f a v + . Unfoldable f + => Monoid v + => Measured a v + => FingerTree v a + -> f a unfoldLeft = unfoldr step where step tree = case viewL tree of - ConsL x xs -> Just (Tuple x (force xs)) - NilL -> Nothing - -unfoldRight :: forall f a v. Unfoldable f => Monoid v => Measured a v => - FingerTree v a -> f a + ConsL x xs -> Just (Tuple x (force xs)) + NilL -> Nothing + +unfoldRight + :: forall f a v + . Unfoldable f + => Monoid v + => Measured a v + => FingerTree v a + -> f a unfoldRight = unfoldr step where step tree = case viewR tree of - SnocR xs x -> Just (Tuple x (force xs)) - NilR -> Nothing + SnocR xs x -> Just (Tuple x (force xs)) + NilR -> Nothing fullyForce :: forall a v. FingerTree v a -> FingerTree v a fullyForce ft = case ft of Deep v pr m sf -> - let v' = force v - m' = fullyForce (force m) - in ft + let + v' = force v + m' = fullyForce (force m) + in + ft _ -> ft diff --git a/src/Data/Sequence.purs b/src/Data/Sequence.purs index 761fe70..0288193 100644 --- a/src/Data/Sequence.purs +++ b/src/Data/Sequence.purs @@ -1,4 +1,3 @@ - -- | This module provides a sequence data type, intended for the same sort of -- | tasks as an Array would be in JavaScript, except with better asymptotic -- | complexity for many operations. @@ -66,7 +65,6 @@ import Prelude hiding (append, map) import Control.Alt (class Alt) import Control.Alternative (class Alternative) import Control.MonadPlus (class MonadPlus) -import Control.MonadZero (class MonadZero) import Control.Plus (class Plus) import Data.Foldable (class Foldable, foldl, foldMap, foldr) import Data.Lazy (Lazy(), force) @@ -80,8 +78,15 @@ import Data.Unfoldable (class Unfoldable, class Unfoldable1) import Partial.Unsafe (unsafePartial) import Unsafe.Coerce (unsafeCoerce) -import Data.Sequence.Internal (Elem(Elem), mapGetElem, getElem, liftElem, - lift2Elem, measure, strJoin) +import Data.Sequence.Internal + ( Elem(Elem) + , mapGetElem + , getElem + , liftElem + , lift2Elem + , measure + , strJoin + ) import Data.FingerTree as FT import Data.Sequence.Ordered as Ordered @@ -124,13 +129,13 @@ instance traversableSeq :: Traversable Seq where instance unfoldable1Seq :: Unfoldable1 Seq where unfoldr1 f xs = go xs empty where - go source memo = - case f source of - Tuple x Nothing -> - snoc memo x + go source memo = + case f source of + Tuple x Nothing -> + snoc memo x - Tuple x (Just ys) -> - go ys (snoc memo x) + Tuple x (Just ys) -> + go ys (snoc memo x) instance unfoldableSeq :: Unfoldable Seq where unfoldr f xs = go xs empty @@ -167,8 +172,6 @@ instance alternativeSeq :: Alternative Seq instance monadPlusSeq :: MonadPlus Seq -instance monadZeroSeq :: MonadZero Seq - -- | A sequence with no elements. empty :: forall a. Seq a empty = Seq FT.Empty @@ -208,7 +211,7 @@ length (Seq xs) = un Additive (measure xs) -- | O(1). True if the sequence has no elements, false otherwise. null :: forall a. Seq a -> Boolean null (Seq FT.Empty) = true -null _ = false +null _ = false -- | O(1). If the sequence is nonempty, take one element off its left side and -- | return that together with the rest of the original sequence. Otherwise, @@ -216,8 +219,8 @@ null _ = false uncons :: forall a. Seq a -> Maybe (Tuple a (Seq a)) uncons (Seq xs) = case FT.viewL xs of - FT.NilL -> Nothing - FT.ConsL y ys -> Just (Tuple (getElem y) (Seq (force ys))) + FT.NilL -> Nothing + FT.ConsL y ys -> Just (Tuple (getElem y) (Seq (force ys))) -- | O(1). If the sequence is nonempty, take one element off its right side and -- | return that together with the rest of the original sequence. Otherwise, @@ -225,16 +228,19 @@ uncons (Seq xs) = unsnoc :: forall a. Seq a -> Maybe (Tuple (Seq a) a) unsnoc (Seq xs) = case FT.viewR xs of - FT.NilR -> Nothing - FT.SnocR ys y -> Just (Tuple (Seq (force ys)) (getElem y)) + FT.NilR -> Nothing + FT.SnocR ys y -> Just (Tuple (Seq (force ys)) (getElem y)) splitAt' :: forall a. Int -> Seq a -> Tuple (Lazy (Seq a)) (Lazy (Seq a)) splitAt' i (Seq xs) = seqify tuple where tuple = unsafePartial $ FT.split (\n -> i < unwrap n) xs - seqify :: forall f. (Functor f) => - Tuple (f (SeqInner a)) (f (SeqInner a)) -> Tuple (f (Seq a)) (f (Seq a)) + seqify + :: forall f + . (Functor f) + => Tuple (f (SeqInner a)) (f (SeqInner a)) + -> Tuple (f (Seq a)) (f (Seq a)) seqify = unsafeCoerce -- | O(log(min(i,n-i))). Split the sequence into two subsequences. The first @@ -267,9 +273,8 @@ inBounds i seq = 0 <= i && i < length seq -- | sequence `xs` can be retrieved with `index 0 xs`. index :: forall a. Int -> Seq a -> Maybe a index i xs = - if inBounds i xs - then unsafePartial $ Just $ unsafeIndex i xs - else Nothing + if inBounds i xs then unsafePartial $ Just $ unsafeIndex i xs + else Nothing -- | O(log(min(i,n-i))). Like `index`, but this function will throw an error -- | instead of returning Nothing if the index is out of bounds. @@ -283,9 +288,8 @@ unsafeIndex i (Seq xs) = -- | sequence is returned unchanged. adjust :: forall a. (a -> a) -> Int -> Seq a -> Seq a adjust f i xs = - if inBounds i xs - then unsafePartial $ unsafeAdjust f i xs - else xs + if inBounds i xs then unsafePartial $ unsafeAdjust f i xs + else xs -- | Adjust the element at a specified index. This function throws an error -- | if the index supplied is out of bounds. diff --git a/test/Data/Sequence.purs b/test/Data/Sequence.purs index f98ad31..5bd0b63 100644 --- a/test/Data/Sequence.purs +++ b/test/Data/Sequence.purs @@ -12,7 +12,7 @@ import Data.Unfoldable (replicate, unfoldr, replicate1, unfoldr1) import Test.Assert (assert) import Test.QuickCheck ((), (===), quickCheck) -import Type.Proxy (Proxy(Proxy), Proxy2(Proxy2)) +import Type.Proxy (Proxy(Proxy)) import Test.QuickCheck.Laws (A()) import Test.QuickCheck.Laws.Data.Eq (checkEq) import Test.QuickCheck.Laws.Data.Ord (checkOrd) @@ -37,8 +37,8 @@ arr = S.toUnfoldable prx :: Proxy (ArbSeq A) prx = Proxy -prx2 :: Proxy2 ArbSeq -prx2 = Proxy2 +prx2 :: Proxy ArbSeq +prx2 = Proxy sequenceTests :: Effect Unit sequenceTests = do @@ -64,16 +64,20 @@ sequenceTests = do log "Test toUnfoldable homomorphism" quickCheck $ \(ArbSeq x) (ArbSeq y) -> arr (x <> y) == arr x <> (arr y :: Array Number) - ("x: " <> show x <> ", y: " <> show y) + ("x: " <> show x <> ", y: " <> show y) log "Test foldable instance" quickCheck $ \f z xs -> - let types = Tuple (f :: Number -> Number -> Number) (z :: Number) - in foldr f z (S.fromFoldable xs) == foldr f z (xs :: Array Number) + let + types = Tuple (f :: Number -> Number -> Number) (z :: Number) + in + foldr f z (S.fromFoldable xs) == foldr f z (xs :: Array Number) quickCheck $ \f z xs -> - let types = Tuple (f :: Number -> Number -> Number) (z :: Number) - in foldl f z (S.fromFoldable xs) == foldl f z (xs :: Array Number) + let + types = Tuple (f :: Number -> Number -> Number) (z :: Number) + in + foldl f z (S.fromFoldable xs) == foldl f z (xs :: Array Number) quickCheck $ \xs -> A.length xs == foldableSize (S.fromFoldable xs :: S.Seq Number) quickCheck $ \(ArbSeq xs) -> A.length (arr xs) == foldableSize (xs :: S.Seq Number) @@ -84,54 +88,68 @@ sequenceTests = do quickCheck $ \(ArbSeq xs) -> S.length xs + 1 == S.length (S.cons 0 xs) quickCheck $ \(ArbSeq xs) -> - let xs' = S.cons 0 xs -- ensure xs' has at least one element - in S.length xs' - 1 == S.length (S.drop 1 xs') + let + xs' = S.cons 0 xs -- ensure xs' has at least one element + in + S.length xs' - 1 == S.length (S.drop 1 xs') log "Test splitAt/head/last" quickCheck $ \idx (ArbSeq seq) -> - let idx' :: Int - idx' = integerBetween 0 (S.length seq) idx + let + idx' :: Int + idx' = integerBetween 0 (S.length seq) idx - split :: Tuple (S.Seq Number) (S.Seq Number) - split = S.splitAt idx' seq + split :: Tuple (S.Seq Number) (S.Seq Number) + split = S.splitAt idx' seq - in S.last (fst split) == S.index (idx' - 1) seq - && S.head (snd split) == S.index idx' seq - ("seq: " <> show seq <> ", idx':" <> show idx') + in + S.last (fst split) == S.index (idx' - 1) seq + && S.head (snd split) == S.index idx' seq + ("seq: " <> show seq <> ", idx':" <> show idx') log "Test that adjust is safe" quickCheck $ \(ArbSeq seq) -> - let f n = S.adjust identity n (seq :: S.Seq Number) - in f (-1) == f (S.length seq) + let + f n = S.adjust identity n (seq :: S.Seq Number) + in + f (-1) == f (S.length seq) log "Test that index is safe" quickCheck $ \(ArbSeq seq) -> - let f n = S.index n (seq :: S.Seq Number) - in f (-1) == Nothing && f (S.length seq) == Nothing + let + f n = S.index n (seq :: S.Seq Number) + in + f (-1) == Nothing && f (S.length seq) == Nothing log "Test inBounds" quickCheck $ \(ArbSeq seq) -> - let seq' = S.cons 0 seq - lowerBound = 0 - upperBound = S.length seq' - 1 - in S.inBounds lowerBound seq' && S.inBounds upperBound seq' + let + seq' = S.cons 0 seq + lowerBound = 0 + upperBound = S.length seq' - 1 + in + S.inBounds lowerBound seq' && S.inBounds upperBound seq' && not (S.inBounds (lowerBound - 1) seq') && not (S.inBounds (upperBound + 1) seq') log "Test adjust" quickCheck $ \(ArbSeq seq) idx -> - let seq' = const 0 <$> S.cons 0 seq - idx' = integerBetween 0 (S.length seq') idx - result = sum (S.adjust (_+1) idx' seq') - in result == 1 "seq': " <> show seq' <> ", result: " <> show result + let + seq' = const 0 <$> S.cons 0 seq + idx' = integerBetween 0 (S.length seq') idx + result = sum (S.adjust (_ + 1) idx' seq') + in + result == 1 "seq': " <> show seq' <> ", result: " <> show result log "Test adjust modifies at the correct index" quickCheck $ \(ArbSeq seq) idx -> - let seq' = const "hello" <$> S.cons 0 seq - idx' = integerBetween 0 (S.length seq') idx - result = S.index idx' (S.adjust (_ <> ", world") idx' seq') - in (result == Just "hello, world") - "seq': " <> show seq' <> ", result: " <> show result + let + seq' = const "hello" <$> S.cons 0 seq + idx' = integerBetween 0 (S.length seq') idx + result = S.index idx' (S.adjust (_ <> ", world") idx' seq') + in + (result == Just "hello, world") + "seq': " <> show seq' <> ", result: " <> show result log "Test take" -- We must account for potentially negative indices generated by QuickCheck @@ -139,20 +157,26 @@ sequenceTests = do -- will be 0, so we must check that the result length is less than the -- absolute value of the index quickCheck $ \(ArbSeq seq) n -> - let result = S.length $ S.take n (seq :: S.Seq Number) - in (0 <= result && result <= abs n) err [ "n = " <> show n - , "seq = " <> show seq - , "result = " <> show result - ] + let + result = S.length $ S.take n (seq :: S.Seq Number) + in + (0 <= result && result <= abs n) err + [ "n = " <> show n + , "seq = " <> show seq + , "result = " <> show result + ] log "Test drop" -- See note on "Test take" about negative indices quickCheck $ \(ArbSeq seq) n -> - let dropped = S.length (seq :: S.Seq Number) - S.length (S.drop n seq) - in (0 <= dropped && dropped <= abs n) err [ "n = " <> show n - , "seq = " <> show seq - , "dropped = " <> show dropped - ] + let + dropped = S.length (seq :: S.Seq Number) - S.length (S.drop n seq) + in + (0 <= dropped && dropped <= abs n) err + [ "n = " <> show n + , "seq = " <> show seq + , "dropped = " <> show dropped + ] log "Test filter" quickCheck $ \(ArbSeq seq) -> S.null (S.filter (const false) (seq :: S.Seq Number)) @@ -185,14 +209,13 @@ sequenceTests = do assert $ 100000 == S.length (replicate 100000 1) log "unfoldr should maintain order" - assert $ S.fromFoldable [1, 2, 3, 4, 5] == unfoldr step 1 + assert $ S.fromFoldable [ 1, 2, 3, 4, 5 ] == unfoldr step 1 log "unfoldr1 should be stack-safe" assert $ 100000 == S.length (replicate1 100000 1) log "unfoldr1 should maintain order" - assert $ S.fromFoldable [1, 2, 3, 4, 5] == unfoldr1 step1 1 - + assert $ S.fromFoldable [ 1, 2, 3, 4, 5 ] == unfoldr1 step1 1 step :: Int -> Maybe (Tuple Int Int) step 6 = Nothing diff --git a/test/Data/Sequence/NonEmpty.purs b/test/Data/Sequence/NonEmpty.purs index 608c538..4365566 100644 --- a/test/Data/Sequence/NonEmpty.purs +++ b/test/Data/Sequence/NonEmpty.purs @@ -1,7 +1,6 @@ module Tests.Data.Sequence.NonEmpty (nonEmptySequenceTests) where import Prelude - import Data.Array as A import Data.Foldable (all, foldl, foldr, sum) import Data.Maybe (Maybe(..)) @@ -25,7 +24,7 @@ import Test.QuickCheck.Laws.Data.Functor (checkFunctor) import Test.QuickCheck.Laws.Data.Ord (checkOrd) import Test.QuickCheck.Laws.Data.Semigroup (checkSemigroup) import Tests.Utils (ArbNESeq(..), err, abs, integerBetween, foldableSize) -import Type.Proxy (Proxy(..), Proxy2(..)) +import Type.Proxy (Proxy(..)) arr :: forall a. NonEmpty.Seq a -> Array a arr = NonEmpty.toUnfoldable @@ -33,8 +32,8 @@ arr = NonEmpty.toUnfoldable prx :: Proxy (ArbNESeq A) prx = Proxy -prx2 :: Proxy2 ArbNESeq -prx2 = Proxy2 +prx2 :: Proxy ArbNESeq +prx2 = Proxy nonEmptySequenceTests :: Effect Unit nonEmptySequenceTests = do @@ -42,7 +41,6 @@ nonEmptySequenceTests = do log "Data.Sequence.NonEmpty" log "======================" log "" - checkEq prx checkOrd prx checkFunctor prx2 @@ -52,127 +50,150 @@ nonEmptySequenceTests = do checkMonad prx2 checkSemigroup prx checkAlt prx2 - log "Test toUnfoldable homomorphism" - quickCheck $ \(ArbNESeq x) (ArbNESeq y) -> - arr (x <> y) == arr x <> (arr y :: Array Int) - ("x: " <> show x <> ", y: " <> show y) - + quickCheck + $ \(ArbNESeq x) (ArbNESeq y) -> + arr (x <> y) == arr x <> (arr y :: Array Int) + ("x: " <> show x <> ", y: " <> show y) log "Test foldable instance" - quickCheck $ \f z (ArbNESeq xs) -> - let types = Tuple (f :: Int -> Int -> Int) (z :: Int) - in foldr f z xs == foldr f z (arr xs :: Array Int) - - quickCheck $ \f z (ArbNESeq xs) -> - let types = Tuple (f :: Int -> Int -> Int) (z :: Int) - in foldl f z xs == foldl f z (arr xs :: Array Int) - - quickCheck $ \(ArbNESeq xs) -> - A.length (arr xs) == foldableSize (xs :: NonEmpty.Seq Int) - - quickCheck $ \(ArbNESeq xs) -> - NonEmpty.length xs + 1 == NonEmpty.length (NonEmpty.cons 0 xs) - quickCheck $ \(ArbNESeq xs) -> - NonEmpty.length xs - 1 == S.length (NonEmpty.drop 1 (xs :: NonEmpty.Seq Int)) - + quickCheck + $ \f z (ArbNESeq xs) -> + let + types = Tuple (f :: Int -> Int -> Int) (z :: Int) + in + foldr f z xs == foldr f z (arr xs :: Array Int) + quickCheck + $ \f z (ArbNESeq xs) -> + let + types = Tuple (f :: Int -> Int -> Int) (z :: Int) + in + foldl f z xs == foldl f z (arr xs :: Array Int) + quickCheck + $ \(ArbNESeq xs) -> + A.length (arr xs) == foldableSize (xs :: NonEmpty.Seq Int) + quickCheck + $ \(ArbNESeq xs) -> + NonEmpty.length xs + 1 == NonEmpty.length (NonEmpty.cons 0 xs) + quickCheck + $ \(ArbNESeq xs) -> + NonEmpty.length xs - 1 == S.length (NonEmpty.drop 1 (xs :: NonEmpty.Seq Int)) log "Test splitAt/head/last" - quickCheck $ \idx (ArbNESeq seq) -> - let idx' :: Int - idx' = integerBetween 0 (NonEmpty.length seq) idx - - split :: Tuple (S.Seq Int) (S.Seq Int) - split = NonEmpty.splitAt idx' seq - - in S.last (fst split) == NonEmpty.index (idx' - 1) seq - && S.head (snd split) == NonEmpty.index idx' seq - ("seq: " <> show seq <> ", idx':" <> show idx') - + quickCheck + $ \idx (ArbNESeq seq) -> + let + idx' :: Int + idx' = integerBetween 0 (NonEmpty.length seq) idx + + split :: Tuple (S.Seq Int) (S.Seq Int) + split = NonEmpty.splitAt idx' seq + in + S.last (fst split) == NonEmpty.index (idx' - 1) seq + && S.head (snd split) + == NonEmpty.index idx' seq + ("seq: " <> show seq <> ", idx':" <> show idx') log "Test that adjust is safe" - quickCheck $ \(ArbNESeq seq) -> - let f n = NonEmpty.adjust identity n (seq :: NonEmpty.Seq Int) - in f (-1) == f (NonEmpty.length seq) - + quickCheck + $ \(ArbNESeq seq) -> + let + f n = NonEmpty.adjust identity n (seq :: NonEmpty.Seq Int) + in + f (-1) == f (NonEmpty.length seq) log "Test that index is safe" - quickCheck $ \(ArbNESeq seq) -> - let f n = NonEmpty.index n (seq :: NonEmpty.Seq Int) - in f (-1) == Nothing && f (NonEmpty.length seq) == Nothing - + quickCheck + $ \(ArbNESeq seq) -> + let + f n = NonEmpty.index n (seq :: NonEmpty.Seq Int) + in + f (-1) == Nothing && f (NonEmpty.length seq) == Nothing log "Test inBounds" - quickCheck $ \(ArbNESeq seq) -> - let lowerBound = 0 - upperBound = NonEmpty.length seq - 1 - types = (seq :: NonEmpty.Seq Int) - in NonEmpty.inBounds lowerBound seq && NonEmpty.inBounds upperBound seq - && not (NonEmpty.inBounds (lowerBound - 1) seq) - && not (NonEmpty.inBounds (upperBound + 1) seq) - + quickCheck + $ \(ArbNESeq seq) -> + let + lowerBound = 0 + + upperBound = NonEmpty.length seq - 1 + + types = (seq :: NonEmpty.Seq Int) + in + NonEmpty.inBounds lowerBound seq && NonEmpty.inBounds upperBound seq + && not (NonEmpty.inBounds (lowerBound - 1) seq) + && not (NonEmpty.inBounds (upperBound + 1) seq) log "Test adjust" - quickCheck $ \(ArbNESeq seq) idx -> - let seq' = const 0 <$> (seq :: NonEmpty.Seq Unit) - idx' = integerBetween 0 (NonEmpty.length seq') idx - result = sum (NonEmpty.adjust (_+1) idx' seq') - in result == 1 "seq': " <> show seq' <> ", result: " <> show result + quickCheck + $ \(ArbNESeq seq) idx -> + let + seq' = const 0 <$> (seq :: NonEmpty.Seq Unit) - log "Test take" - quickCheck $ \(ArbNESeq seq) n -> - let result = S.length (NonEmpty.take n (seq :: NonEmpty.Seq Int)) - in 0 <= result && result <= abs n err [ "n = " <> show n - , "seq = " <> show seq - , "result = " <> show result - ] + idx' = integerBetween 0 (NonEmpty.length seq') idx + result = sum (NonEmpty.adjust (_ + 1) idx' seq') + in + result == 1 "seq': " <> show seq' <> ", result: " <> show result + log "Test take" + quickCheck + $ \(ArbNESeq seq) n -> + let + result = S.length (NonEmpty.take n (seq :: NonEmpty.Seq Int)) + in + 0 <= result && result <= abs n + err + [ "n = " <> show n + , "seq = " <> show seq + , "result = " <> show result + ] log "Test drop" - quickCheck $ \(ArbNESeq seq) n -> - let dropped = NonEmpty.length (seq :: NonEmpty.Seq Int) - S.length (NonEmpty.drop n seq) - in 0 <= dropped && dropped <= abs n err [ "n = " <> show n - , "seq = " <> show seq - , "dropped = " <> show dropped - ] - + quickCheck + $ \(ArbNESeq seq) n -> + let + dropped = NonEmpty.length (seq :: NonEmpty.Seq Int) - S.length (NonEmpty.drop n seq) + in + 0 <= dropped && dropped <= abs n + err + [ "n = " <> show n + , "seq = " <> show seq + , "dropped = " <> show dropped + ] log "Test filter" quickCheck $ \(ArbNESeq seq) -> S.null (NonEmpty.filter (const false) (seq :: NonEmpty.Seq Int)) quickCheck $ \(ArbNESeq seq) -> NonEmpty.filter (const true) seq === (NonEmpty.toPlain seq :: S.Seq Int) quickCheck $ \(ArbNESeq seq) f -> all f (NonEmpty.filter f (seq :: NonEmpty.Seq Int)) - log "Test length" quickCheck $ \(ArbNESeq seq) -> NonEmpty.length (seq :: NonEmpty.Seq Int) >= 1 show seq - log "Test cons/uncons" - quickCheck $ \(ArbNESeq seq) x -> - NonEmpty.uncons (NonEmpty.cons x seq) === Tuple (x :: Int) (NonEmpty.toPlain seq) - quickCheck $ \(ArbNESeq seq) x -> - NonEmpty.unsnoc (NonEmpty.snoc seq x) === Tuple (NonEmpty.toPlain seq) (x :: Int) - + quickCheck + $ \(ArbNESeq seq) x -> + NonEmpty.uncons (NonEmpty.cons x seq) === Tuple (x :: Int) (NonEmpty.toPlain seq) + quickCheck + $ \(ArbNESeq seq) x -> + NonEmpty.unsnoc (NonEmpty.snoc seq x) === Tuple (NonEmpty.toPlain seq) (x :: Int) log "Test init" - quickCheck $ \(ArbNESeq seq) -> - NonEmpty.init seq === NonEmpty.take (NonEmpty.length seq - 1) (seq :: NonEmpty.Seq Int) - + quickCheck + $ \(ArbNESeq seq) -> + NonEmpty.init seq === NonEmpty.take (NonEmpty.length seq - 1) (seq :: NonEmpty.Seq Int) log "Test tail" - quickCheck $ \(ArbNESeq seq) -> - NonEmpty.tail seq === NonEmpty.drop 1 (seq :: NonEmpty.Seq Int) - + quickCheck + $ \(ArbNESeq seq) -> + NonEmpty.tail seq === NonEmpty.drop 1 (seq :: NonEmpty.Seq Int) log "Test head" - quickCheck $ \(ArbNESeq seq) x -> - NonEmpty.head (NonEmpty.cons x seq) === (x :: Int) - + quickCheck + $ \(ArbNESeq seq) x -> + NonEmpty.head (NonEmpty.cons x seq) === (x :: Int) log "Test last" - quickCheck $ \(ArbNESeq seq) x -> - NonEmpty.last (NonEmpty.snoc seq x) === (x :: Int) - + quickCheck + $ \(ArbNESeq seq) x -> + NonEmpty.last (NonEmpty.snoc seq x) === (x :: Int) log "unfoldr1 should be stack-safe" assert $ 100000 == NonEmpty.length (replicate1 100000 1) - - let oneToFive = unfoldr1 step1 1 :: NonEmpty.Seq Int - + let + oneToFive = unfoldr1 step1 1 :: NonEmpty.Seq Int log "unfoldr1 should maintain order" - assert $ NonEmpty.toUnfoldable oneToFive == [1, 2, 3, 4, 5] - + assert $ NonEmpty.toUnfoldable oneToFive == [ 1, 2, 3, 4, 5 ] log "fold1 should maintain order" - assert $ fold1 (map pure oneToFive) == [1, 2, 3, 4, 5] - + assert $ fold1 (map pure oneToFive) == [ 1, 2, 3, 4, 5 ] log "foldMap1 should maintain order" - assert $ foldMap1 pure oneToFive == [1, 2, 3, 4, 5] + assert $ foldMap1 pure oneToFive == [ 1, 2, 3, 4, 5 ] step1 :: Int -> Tuple Int (Maybe Int) step1 5 = Tuple 5 Nothing + step1 n = Tuple n (Just (n + 1)) diff --git a/test/Utils.purs b/test/Utils.purs index a57c795..6ac192f 100644 --- a/test/Utils.purs +++ b/test/Utils.purs @@ -5,7 +5,6 @@ import Prelude import Control.Alt (class Alt, (<|>)) import Control.Alternative (class Alternative) import Control.MonadPlus (class MonadPlus) -import Control.MonadZero (class MonadZero) import Control.Plus (class Plus, empty) import Data.Array as A import Data.Foldable (class Foldable, intercalate, foldr, foldMap) @@ -71,8 +70,6 @@ instance alternativeArbseq :: Alternative ArbSeq instance monadPlusArbSeq :: MonadPlus ArbSeq -instance monadZeroArbSeq :: MonadZero ArbSeq - instance arbitraryArbSeq :: (Arbitrary a) => Arbitrary (ArbSeq a) where arbitrary = (ArbSeq <<< S.fromFoldable) <$> (arbitrary :: Gen (Array a))