/** * @param callable $callable * @param string[] $paramMap * @return \Closure */ public static function fnBindFieldsToParams($callable, $paramMap) { return function ($record) use($callable, $paramMap) { $params = Sequence::make($paramMap)->map(FnGen::fnPluckFrom($record))->to_a(); return call_user_func_array($callable, $params); }; }
public function testFnRevComp() { $range = range(1, 100); $rangeReverse = array_reverse($range); // Check the values are sorted. $result = $range; usort($result, FnSort::fnRevComp(FnGen::fnIdentity())); $this->assertEquals($rangeReverse, $result); }
public function __construct($fnPrev = null) { if (!$fnPrev) { $fnPrev = FnGen::fnIdentity(); } $this->fnToApply = function ($values) use($fnPrev) { return Sequence::make($fnPrev($values)); }; }
/** * @param Iterator $iterator * @param callable|null $fnMapValueFunction($value, $key) * @param callable|null $fnMapKeyFunction($key, $value) */ public function __construct(Iterator $iterator, $fnMapValueFunction, $fnMapKeyFunction) { parent::__construct($iterator); if (!$fnMapKeyFunction) { $fnMapKeyFunction = FnGen::fnIdentity(); } if (!$fnMapValueFunction) { $fnMapValueFunction = FnGen::fnIdentity(); } $this->fnMapValueFunction = $fnMapValueFunction; $this->fnMapKeyFunction = $fnMapKeyFunction; }
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); }
/** * @param Iterator $iterator * @return MappedSequence */ public static function sequenceNumericKeys(Iterator $iterator) { return new MappedSequence($iterator, FnGen::fnIdentity(), FnGen::fnIfMap(FnGen::fnIsNumeric(), FnGen::fnCounter(), FnGen::fnIdentity())); }
/** * Returns the key of the first element where $fnTest returns true. * * @param callable|null $fnTest($value, $key) * @return mixed */ public function firstKey($fnTest = null) { $fnTest = $fnTest ?: fn\fnTrue(); return $this->filter($fnTest)->limit(1)->keys()->reduce(null, FnGen::fnSwapParamsPassThrough(FnGen::fnIdentity())); }
public function testFnNestedUKeyBy() { $data = array(array('name' => 'Bob'), array('name' => 'Alex'), array('name' => 'Bill'), array('name' => 'Ben'), array('name' => 'Ann'), array('name' => 'Tim'), array('name' => 'Jerry'), array('name' => 'Phil'), array('name' => 'Ken')); $fn = FnGen::fnNestedUkeyBy(FnGen::fnPluck('name')); $expected = Sequence::make($data)->keyBy(FnGen::fnPluck('name'))->to_a(); $this->assertEquals($expected, $fn($data)); }