From c88f404555e566d255b653e6de2a6b51bacc6dd4 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Thu, 1 Jun 2023 15:20:57 +1000 Subject: [PATCH] Start working on range --- inputs/passing/helpers/range.ts | 56 +++++++++++++++++++++++++++ inputs/passing/iteration/testRange.ts | 12 ++++++ website/.eslintrc.cjs | 10 ++++- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 inputs/passing/helpers/range.ts create mode 100644 inputs/passing/iteration/testRange.ts diff --git a/inputs/passing/helpers/range.ts b/inputs/passing/helpers/range.ts new file mode 100644 index 0000000..339d4c2 --- /dev/null +++ b/inputs/passing/helpers/range.ts @@ -0,0 +1,56 @@ +export default function range(iter?: Iterable | Iterator) { + return new Range(iter); +} + +class Range implements Iterable { + iterable: Iterable; + + constructor(iter?: Iterable | Iterator) { + if (iter === undefined) { + this.iterable = []; + } else if (isIterator(iter)) { + this.iterable = { + [Symbol.iterator]: () => iter, + }; + } else { + this.iterable = iter; + } + } + + [Symbol.iterator]() { + return this.iterable[Symbol.iterator](); + } + + limit(n: number) { + const iterable = this.iterable; + + function* res() { + let i = 0; + + for (const x of iterable) { + if (i >= n) { + break; + } + + yield x; + i++; + } + } + + return range(res()); + } + + count() { + let i = 0; + + for (const _x of this.iterable) { + i++; + } + + return i; + } +} + +function isIterator(iter: Iterable | Iterator): iter is Iterator { + return (iter as unknown as Record).next !== undefined; +} diff --git a/inputs/passing/iteration/testRange.ts b/inputs/passing/iteration/testRange.ts new file mode 100644 index 0000000..231eb7d --- /dev/null +++ b/inputs/passing/iteration/testRange.ts @@ -0,0 +1,12 @@ +// test_output! [0,2,[2,3,5,7,11]] + +import range from "../helpers/range.ts"; +import { primes } from "../projEuler/helpers/primes.ts"; + +export default function main() { + return [ + range().count(), + range([1, 2, 3]).limit(2).count(), + [...range(primes()).limit(5)], + ]; +} diff --git a/website/.eslintrc.cjs b/website/.eslintrc.cjs index 0175f7c..d2a11a1 100644 --- a/website/.eslintrc.cjs +++ b/website/.eslintrc.cjs @@ -29,7 +29,15 @@ module.exports = { "comma-dangle": ["error", "always-multiline"], "react/react-in-jsx-scope": "off", "quote-props": ["error", "consistent-as-needed"], - "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + }, + ], "prettier/prettier": "error", "no-constant-condition": "off", "no-empty": ["error", { allowEmptyCatch: true }],