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); }
public function testFnNotEqual() { $fn = FnGen::fnIsNotEqual(0); $this->assertFalse($fn(0)); $this->assertFalse($fn('0')); $this->assertFalse($fn(false)); $this->assertFalse($fn(null)); $this->assertFalse($fn('hello')); // <-- sad truth about PHP. $this->assertFalse($fn(0.0)); $this->assertTrue($fn(1)); $this->assertTrue($fn(true)); $this->assertTrue($fn('100')); $fn = FnGen::fnIsNotEqual('hello'); $this->assertFalse($fn('hello')); $this->assertFalse($fn(true)); // <-- also true. $this->assertFalse($fn(0)); // <-- sad truth about PHP. $this->assertFalse($fn(0.0)); // <-- again, sadly this is true $this->assertTrue($fn('Hello')); $this->assertTrue($fn('0')); $this->assertTrue($fn(null)); $this->assertTrue($fn(false)); $fn1 = FnGen::fnIsNotEqual(0); $fn2 = FnGen::fnIsEqual(1); $this->assertEquals($fn1, $fn2); // <-- closure function == closure function --- should not be relied on. }