遅延評価と並行処理を備えた、
Dart のための関数型プログラミング。

FxDart は FxTS の Dart 移植版です。 同期・非同期データに対する遅延パイプラインを合成するためのライブラリで、 1秒かかるリクエスト6回の逐次処理を2秒の並行バッチに変えるのに 必要なのはメソッド呼び出し1つだけです。

📒 実際のアプリで確認: Daily Ledger — FxDart で作られたフル機能アプリ →

⚖️ Dart vs FxDart — 実践課題 53 問を並べて比較 →

RxDart vs FxDart — push 対 pull、正直な判定 50 件 →

▲ これは実際に動きます。コードを編集して Run を押してください。 本物の Dart コンパイラでコンパイルされ、ブラウザ上で実行されます。

FxDart とは?

FxDart は FxTS のプログラミングモデルを Dart にもたらします。コレクションと非同期データを 変換するための、小さく合成可能な約120個の関数のツールキットです。 3つの考え方がその核にあります。

時間とともに届くイベント、そして値としての失敗は、残る二つの面にあります。 どの面か? が 判断で、このページは紹介のままです。

なぜ必要なのか?

Dart には既に IterableStream があります。FxDart が 真価を発揮するのは、それらでは手が届かない領域です。

課題素の DartFxDart
API 呼び出しの並行数を n に制限しつつ順序を保つ 手作業のキュー、Completer、緻密な管理 .map(fetch).concurrent(3)
非同期の変換パイプライン Stream はプッシュ型。await、バックプレッシャー、遅延評価を混在させると複雑になる プル型のチェーン — 各値は要求されたときにだけ計算される
データ加工(group、index、count、partition、zip、chunk など) その都度ループを手書き 概念ごとに十分にテストされた名前付き関数が1つ
読みやすい多段変換 ネストした呼び出しや中間変数 左から右へ読める fx() チェーン、完全に型付き

長所 & 短所

✓ 長所

  • 遅延評価が標準 — パイプラインは短絡評価され、要求された値だけが計算されます。
  • 順序を保つ並行処理が演算子1つで実現できます: concurrent(n)、完了順なら concurrentPool(n)
  • 完全に型付きのチェーンfx() は端から端まで型推論を維持します。同期演算子はネイティブの Iterable に対する素の関数なので、通常の Dart とそのまま相互運用できます。
  • 小さく目的の明確な関数群 — 変換 / フィルタ / スライス / 結合 / 集約 / オブジェクト / ユーティリティを網羅する約120個の演算子。
  • 実績あるセマンティクス — FxTS から挙動を移植し、そのテスト850件以上も併せて移植しています。
  • 依存関係ゼロ — 純粋な Dart のみ。

✗ 短所

  • データラストのカリー化がない — Dart には関数オーバーロードがないため、FxTS のカリー化された pipe スタイルはチェーンになります。動的な pipe() は静的型を失います。
  • 非同期の抽象がもう1つ増えるStream では並行処理のバックチャネルを表現できないため FxAsyncIterable が存在します。相互変換は簡単ですが、学ぶべき概念が1つ増えます。
  • 学習コスト — 遅延パイプラインで考えることは、命令的なループとは異なります。
  • 常に最速とは限らない — ごく小さなホットループでは、手書きの for が演算子の合成より速いことがあります。FxDart は明快さと I/O バウンドな処理に最適化しています。
  • そのまま移植できない TS API もある — それらは Dart らしい書き方に置き換えられています: curry は型付きの .curried 拡張ゲッターになり、旧来の名前は移行用に非推奨スタブとして残されています。

並行処理を体験する

300 ms かかる疑似リクエストを6回 — 逐次なら約1.8 秒、 concurrent(3) なら約0.6 秒です。数字を変えて試してみてください:

学習を始める

FxDart 101 →

講義、ライブデモ、そして全関数のプレイグラウンドを備えたガイド付きコース。

最初のレッスン: map →

最も基本的な演算子から始めましょう。

インストール →

fxdart を pubspec に追加し、ソースコードを見てみましょう。