TDD Kata 08 – Functions Pipeline

Dies ist mein wöchentlicher Kata Post. Lies den ersten um zu erfahren, worum es hier geht.

Letzte Woche: Münzwechsler

Zur Kata-Beschreibung

Diese Woche hat es bei mir nicht hingehauen, ich habe die Kata nur einmal in PHP gemacht und das war nicht ausreichend für irgendwelche Einsichten. Ich werde sie demnächst noch mal wiederholen müssen. Aber jetzt erst mal zur nächsten:

Achte Kata: Functions Pipeline

Schreibe eine Funktion pipe(), die eine beliebige Zahl von Funktionen (callables) als Argumente akzeptiert und eine neue Funktion zurückgibt.
Die zurückgegebene Funktion übergibt alle Argumente an die erste Funktion, das Ergebnis an die zweite, und so weiter, und gibt das letzte Ergebnis zurück.

Die Funktionen werden also von links nach rechts verarbeitet.

Beispiel:

// erst strtolower() anwenden, dann ucwords
$f = pipe('strtolower', 'ucwords');
$f('FOO BAR') === ucwords(strtolower('FOO BAR'));

Optionale Zusatz-Aufgabe:

Implementiere eine Funktion compose(), die genau wie pipe() funktioniert, außer dass die Funktionen von rechts nach links verarbeitet werden. Implementiere sie auf andere Weise als pipe() (also ohne die Eingabe umzukehren) und ohne pipe() aufzurufen.

In PHP können die Argumente Funktionsnamen als String sein (wie "strtolower"), Methoden in der Form [$instance, "doFoo"], Objekte die ___invoke() implementieren, oder \Closure Instanzen (also alles, das den callable Type Hint erfüllt. In JavaScript wären es Referenzen auf anonyme Funktionen. In anderen Sprachen, suche einfach die passenden Typen aus.