Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
 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);
 }