📦

イテレータのためのユーティリティライブラリ Rotery を公開しました

2024/03/24に公開

概要

イテレータを使った反復処理のための npm パッケージ、 Rotery を作成・公開しました。

https://www.npmjs.com/package/rotery
https://github.com/somnicattus/rotery

パッケージの特徴

  • JavaScriptの反復処理プロトコルの機能を使ったユーティリティライブラリです。
  • 反復処理プロトコルにより遅延評価されるため、必要な処理だけが実行されます。
  • map, filter, reduce などのイテレータヘルパー関数を提供します。
  • curry, compose などの関数型プログラミングのヘルパー関数を提供します。
  • 非同期の「並列処理」と「逐次処理」の両方に対応できます。
    • 「一定の並列度で逐次繰り返す」ような処理も簡単に書けます。
  • ユーティリティライブラリ Remeda と互換性のある設計になっています。

イテレータヘルパーや関数のパイプの機能は、標準化のプロポーザルが提出されて議論が進んでいるようです。将来的に JavaScript の標準になるかもしれない機能が気になる方は、是非 Rotery で先取りしてみてください。

https://github.com/tc39/proposal-iterator-helpers
https://github.com/tc39/proposal-async-iterator-helpers
https://github.com/tc39/proposal-pipeline-operator

使い方(サンプルコード)

import * as Rt from 'rotery'; // tree-shaking 対応
import { dataAccess } from './some-asynchronous-data-access.js';

const result = await Rt.pipe(
    userIds,
    // 100 件ずつ逐次処理する
    Rt.chunk.sync(100),
    Rt.map.async(async ids => await dataAccess.findUsersByIds(ids)),
    Rt.flatten.async,
    Rt.filter.async(user => user.age >= 20),
    // 最初に 10 件見つけたら終了
    Rt.take.async(10),
    Rt.accumulate.async
);

開発状況と今後の方針

現在のところ個人の趣味で開発しているため、最低限のコアコンセプト機能だけを備えています。
今後も少しずつ拡張を進めていく予定です。新機能の提案、不具合報告、 PR は大歓迎です。

その他

Rotery で使用したコーディング技術やプロジェクト設定について、いずれ記事で紹介しようと思います。

Discussion