From a54e4d1834a06f82164acbbe64dbbdc97e98170b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=B1=EB=B0=B1?= Date: Tue, 6 Aug 2024 20:34:22 +0900 Subject: [PATCH] Itertools/pairwise (#40) * feat(pairwise): implement operation * chore: apply changeset --- .changeset/tough-bananas-end.md | 5 ++++ .../python/src/itertools/pairwise.test.ts | 26 +++++++++++++++++++ packages/python/src/itertools/pairwise.ts | 19 ++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 .changeset/tough-bananas-end.md create mode 100644 packages/python/src/itertools/pairwise.test.ts create mode 100644 packages/python/src/itertools/pairwise.ts diff --git a/.changeset/tough-bananas-end.md b/.changeset/tough-bananas-end.md new file mode 100644 index 0000000..20c77e9 --- /dev/null +++ b/.changeset/tough-bananas-end.md @@ -0,0 +1,5 @@ +--- +"@iter-x/python": patch +--- + +implement pairwise operation diff --git a/packages/python/src/itertools/pairwise.test.ts b/packages/python/src/itertools/pairwise.test.ts new file mode 100644 index 0000000..285b693 --- /dev/null +++ b/packages/python/src/itertools/pairwise.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from "vitest"; +import { pairwise } from "./pairwise"; + +describe("pairwise", () => { + it("should generate pairwise iterator", () => { + const result = [...pairwise("ABCDEFG")]; + expect(result).toEqual([ + ["A", "B"], + ["B", "C"], + ["C", "D"], + ["D", "E"], + ["E", "F"], + ["F", "G"], + ]); + }); + + it("should not generate any values when iterator is empty", () => { + const result = [...pairwise("")]; + expect(result).toEqual([]); + }); + + it("should not generate any values when iterator is short to be pair", () => { + const result = [...pairwise("A")]; + expect(result).toEqual([]); + }); +}); diff --git a/packages/python/src/itertools/pairwise.ts b/packages/python/src/itertools/pairwise.ts new file mode 100644 index 0000000..3254c4e --- /dev/null +++ b/packages/python/src/itertools/pairwise.ts @@ -0,0 +1,19 @@ +import { iter } from "../built-in"; + +/** + * @example pairwise('ABCDEFG') -> AB BC CD DE EF FG + */ +export function* pairwise(iterable: Iterable): IterableIterator<[T, T]> { + const it = iter(iterable); + let item = it.next(); + let prevValue = item.value; + + if (item.done) return; + + while (true) { + item = it.next(); + if (item.done) return; + yield [prevValue, item.value]; + prevValue = item.value; + } +}