Aller au contenu principal

Paradigme Data-First vs Data-Last

Les deux approches

// Data-First (Radash, es-toolkit, Pithos standard)
map(users, (user) => user.name);
filter(numbers, (n) => n > 0);

// Data-Last (Ramda, fp-ts, Remeda pipe)
map((user) => user.name)(users);
filter((n) => n > 0)(numbers);

Choix Pithos : Data-First par défaut

(Sauf pour Zygos qui utilise des méthodes chaînées)

Pourquoi Data-First ?

  1. Inférence TypeScript supérieure : TypeScript déduit facilement le type de l'itérateur (user ou n) car les données (users, numbers) sont fournies avant. Avec Data-Last, l'inférence est souvent cassée ou nécessite des génériques explicites.
  2. Standard JavaScript : Toutes les méthodes natives (Array.map, Array.filter) et modernes (Promise.then) mettent les données dans le contexte principal.
  3. Lisibilité directe : verbe(sujet, params) se lit comme une phrase (« Map users to names »).
ParadigmeExempleInférence TSUsage Pithos
Data-Firstmap(items, fn) Excellente (Naturelle)Standard (Arkhe)
Data-Lastmap(fn)(items) Souvent complexeNon utilisé
Pipingitems.map(fn) ExcellenteZygos (API fluide)

Mais avec support du piping

Pour la composition fonctionnelle, Pithos supporte aussi le pattern pipe :

import { pipe } from "pithos/arkhe/function/pipe";
import { map, filter, take } from "pithos/arkhe/array";

// Composition élégante
const result = pipe(
users,
(users) => filter(users, (u) => u.active),
(users) => map(users, (u) => u.name),
(names) => take(names, 5)
);
Décision de conception

Pithos est data-first uniquement. Contrairement à l'approche dual-mode de Remeda, nous avons délibérément choisi de ne pas supporter les variantes data-last. Cela garde l'API simple, prévisible et assure une inférence TypeScript optimale.

Pour la composition, utilisez pipe() avec des appels data-first explicites : c'est légèrement plus verbeux mais parfaitement clair.


Related