public function testFnCallChain() { $fn = function ($v) { return $v + 1; }; $fnChain = FnGen::fnCallChain($fn, $fn, $fn, $fn); $this->assertTrue($fnChain(5) == 9); // More useful example: $values = array(array('name' => 'Terry', 'age' => 22), array('name' => 'Bob', 'age' => 30), array('name' => 'Sam', 'age' => 19), array('name' => 'Robert', 'age' => 55), array('group' => 'student')); $fnLen = function ($v) { return strlen($v); }; // Extract only the elements with with name length of 3 $results = Sequence::make($values)->filter(FnGen::fnCallChain(FnGen::fnPluck('name'), $fnLen, FnGen::fnIsEqual(3)))->to_a(); $this->assertTrue(count($results) == 2); // Same thing, but without the chain. $resultsNonChain = Sequence::make($values)->filter(function ($v) { if (isset($v['name'])) { $x = $v['name']; } else { $x = ''; } $len = strlen($x); return $len == 3; })->to_a(); $this->assertTrue($results == $resultsNonChain); // The first function in the chain is allowed multiple params $results = Sequence::make($values)->filterKeys(FnGen::fnCallChain(function ($k, $v) { return $v; }, FnGen::fnPluck('name'), $fnLen, FnGen::fnIsEqual(3)))->to_a(); $this->assertTrue(count($results) == 2); }
public function testGroupBy() { $fruitOrders = TestData::$fruit; $fnExtractFruitCountsForName = function ($fruit, $name) { return Sequence::make($fruit)->filter(FnGen::fnCallChain(FnGen::fnPluck('name'), FnGen::fnIsEqual($name)))->values()->to_a(); }; $fruitByName = Sequence::make($fruitOrders)->groupBy(FnGen::fnPluck('name'))->to_a(); foreach ($fruitByName as $name => $orders) { $filteredOrders = $fnExtractFruitCountsForName($fruitOrders, $name); $this->assertEquals($filteredOrders, $orders); } $peopleByAge = Sequence::make(TestData::$people)->groupBy(fn\fnPluck('age'), array_fill(0, 100, array()))->toArray(); $this->assertEquals(array(), $peopleByAge[0]); $peopleAge55 = Sequence::make(TestData::$people)->filter(fn\fnCallChain(fn\fnPluck('age'), fn\fnIsEqual(55)))->toValues(); $this->assertEquals($peopleAge55, $peopleByAge[55]); // Test late binding of $init $peopleByAgeFnInit = Sequence::make(TestData::$people)->groupBy(fn\fnPluck('age'), function () { return array_fill(0, 100, array()); })->toArray(); $this->assertEquals($peopleByAge, $peopleByAgeFnInit); }