
지연 평가와 동시성을 기본으로 갖춘,
Dart를 위한 함수형 프로그래밍.
FxDart는 FxTS를 Dart로 포팅한 라이브러리입니다 — 동기 데이터와 비동기 데이터 위에서 지연 파이프라인을 조합할 수 있게 해 주며, 1초짜리 요청 여섯 개를 순차 실행에서 2초짜리 동시 실행 묶음으로 바꾸는 데 메서드 호출 하나면 충분합니다.
📒 실제 앱으로 확인하기: Daily Ledger — FxDart로 만든 완성형 앱 →
⚖️ Dart vs FxDart — 실전 과제 53개, 나란히 비교 →
⚡ RxDart vs FxDart — 푸시 vs 풀, 솔직한 판정 50개 →
▲ 실제로 동작합니다 — 코드를 수정하고 Run을 눌러 보세요. 실제 Dart 컴파일러로 컴파일되어 브라우저에서 실행됩니다.
FxDart란?
FxDart는 FxTS의 프로그래밍 모델을 Dart로 가져옵니다. 컬렉션과 비동기 데이터를 변환하는 작고 조합 가능한 함수 약 120개로 이루어진 도구 모음입니다. 핵심은 세 가지입니다.
- 지연 평가 —
map,filter,take같은 연산자는 파이프라인을 구성할 뿐 실제 작업은 하지 않습니다. 종결 연산자(toList,each,reduce…)가 값을 끌어당길 때 비로소 계산이 일어납니다. 100만 개짜리 범위를.take(3)으로 처리하면 정확히 3개만 계산됩니다. - 동기와 비동기를 아우르는 하나의 모델 — 동일한 연산자 이름이
일반
Iterable에서도, FxDart의 풀 기반 비동기 시퀀스인FxAsyncIterable에서도 그대로 동작합니다(Stream과는 양방향으로 이어집니다). - 선언적 동시성 —
concurrent(n)은 상류 파이프라인에 한 번에n개씩 평가하도록 요청하면서도 결과의 순서는 그대로 유지합니다. FxTS를 대표하는 기능이며, Dart에 충실하게 포팅했습니다.
시간에 따른 이벤트, 그리고 값으로서의 실패는 나머지 두 표면에 있습니다. 어느 표면?이 결정이고, 이 페이지는 소개 페이지로 남습니다.
왜 필요한가?
Dart에는 이미 Iterable과 Stream이 있습니다. FxDart는
그것들이 한계에 부딪히는 지점에서 제 몫을 합니다.
| 문제 | 순수 Dart | FxDart |
|---|---|---|
| 동시 API 호출을 n개로 제한하면서 순서 유지 | 직접 만든 큐, Completer, 세심한 상태 관리 |
.map(fetch).concurrent(3) |
| 비동기 변환 파이프라인 | Stream은 푸시 기반이라 await와 배압, 지연 평가를 섞으면 복잡해집니다 |
풀 기반 체인 — 각 값은 요청받았을 때만 계산됩니다 |
| 데이터 가공(그룹화, 인덱싱, 카운트, 분할, zip, 청크…) | 매번 직접 작성하는 반복문 | 개념마다 하나씩, 충분히 검증된 이름 있는 함수 |
| 읽기 쉬운 다단계 변환 | 중첩 호출 또는 중간 변수 | 완전한 타입이 유지되는 좌에서 우로 흐르는 fx() 체인 |
장점 & 단점
✓ 장점
- 거저 얻는 지연 평가 — 파이프라인은 단락 평가되며, 요청된 값만 계산됩니다.
- 순서를 보존하는 동시성을 연산자 하나로:
concurrent(n), 완료 순서가 필요하면concurrentPool(n). - 완전한 타입 체인 —
fx()는 처음부터 끝까지 타입 추론을 유지합니다. 동기 연산자는 네이티브Iterable을 다루는 평범한 함수이므로 일반 Dart 코드와 그대로 어울립니다. - 작고 목적이 분명한 함수 — 변환 / 필터 / 슬라이스 / 결합 / 집계 / 객체 / 유틸을 아우르는 약 120개의 연산자.
- 검증된 동작 — FxTS의 동작을 850개가 넘는 테스트와 함께 그대로 옮겼습니다.
- 의존성 없음 — 순수 Dart.
✗ 단점
- data-last 커링 없음 — Dart에는 함수 오버로드가 없어서 FxTS의 커링된
pipe스타일이 체인으로 바뀝니다. 동적인pipe()는 정적 타입을 잃습니다. - 또 하나의 비동기 추상화 —
Stream으로는 동시성 역채널을 표현할 수 없기 때문에FxAsyncIterable이 존재합니다. 상호 변환은 쉽지만, 익혀야 할 개념이 하나 늘어납니다. - 학습 곡선 — 지연 파이프라인으로 사고하는 방식은 명령형 반복문과 다릅니다.
- 항상 가장 빠르지는 않음 — 아주 작은 핫 루프라면 손으로 쓴
for가 연산자 조합보다 빠를 수 있습니다. FxDart는 명료함과 I/O 바운드 작업에 최적화되어 있습니다. - 그대로 옮겨지지 않는 TS API도 있음 — 대신 Dart다운 표기를 따릅니다.
curry는 타입이 있는.curried확장 게터가 되었고, 기존 이름은 마이그레이션을 위한 deprecated 스텁으로 남겨 두었습니다.
동시성 맛보기
각각 300 ms가 걸리는 가짜 요청 여섯 개 — 순차 실행이면 약 1.8 s,
concurrent(3)을 쓰면 약 0.6 s입니다. 숫자를 바꿔 보세요.