public function testConverge() { $add = function ($a, $b) { return $a + $b; }; $multiply = function ($a, $b) { return $a * $b; }; $subtract = function ($a, $b) { return $a - $b; }; $conv1 = P::converge($multiply, [$add, $subtract]); $this->assertEquals(-3, $conv1(1, 2)); $add3 = function ($a, $b, $c) { return $a + $b + $c; }; $conv2 = P::converge($add3, [$multiply, $add, $subtract]); $this->assertEquals(4, $conv2(1, 2)); $a = function () use($add, $subtract) { (yield $add); (yield $subtract); }; $conv1 = P::converge($multiply, $a()); $this->assertEquals(-3, $conv1(1, 2)); }