/** * @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 testFnCallGetterFunction() { $src = array(new MappersTest_sampleObject(1), new MappersTest_sampleObject(3), new MappersTest_sampleObject(5)); $this->assertEquals(array(1, 3, 5), Sequence::make($src)->map(fn\fnCallGetter('getValue'))->to_a()); $this->assertEquals(array(12, 14, 16), Sequence::make($src)->map(fn\fnCallGetter('getValuePlusSomething', null, 11))->to_a()); $this->assertEquals(array(22, 22, 22), Sequence::make($src)->map(fn\fnCallGetter('getterThatDoesNotExist', 22))->to_a()); }
public function testMapFromField() { $values = TestData::$people; $fn2X = function ($x) { return 2 * $x; }; $this->assertEquals(Sequence::make($values)->pluck('age')->map($fn2X)->toArray(), Sequence::make($values)->map(fn\fnMapFromField('age', $fn2X))->toArray()); }
public function __construct($fnPrev = null) { if (!$fnPrev) { $fnPrev = FnGen::fnIdentity(); } $this->fnToApply = function ($values) use($fnPrev) { return Sequence::make($fnPrev($values)); }; }
public function testStreamReaderIterator() { $handle = SampleDataLoader::getEmployeesCsvStream(); $expected = SampleDataLoader::getEmployeesCsv(); $fromIterator = Sequence::make(new StreamReaderIterator($handle))->reduce('', function ($content, $line) { return $content . $line; }); $this->assertEquals($expected, $fromIterator); }
/** * @return RecursiveSequence */ public function getChildren() { $x = $this->current(); if ($this->canGoDeeper()) { return RecursiveSequence::make($x)->setMaxDepth($this->depth - 1); } else { return Sequence::make($x); } }
public function testExampleExtractKey() { $people = SampleDataLoader::getPeople(true); $peopleSeq = Sequence::make($people)->keyBy(fn\fnPluck('_id')); $keys1 = exampleExtractKeys1($peopleSeq); $keys2 = exampleExtractKeys2($peopleSeq); $keys3 = exampleExtractKeys3($peopleSeq); $this->assertEquals($keys1, $keys2); $this->assertEquals($keys2, $keys3); }
public function testCompareMulti() { $values = TestData::$fruit; usort($values, fn\fnCompareMulti(array(fn\fnCompareField('name')))); $this->assertNotEquals(TestData::$fruit, $values); $this->assertEquals(Sequence::make(TestData::$fruit)->pluck('name')->sort()->toValues(), array_map(fn\fnPluck('name'), $values)); $values = array(array('name' => 'Terry', 'age' => 22), array('name' => 'Bob', 'age' => 30), array('name' => 'Ann', 'age' => 30), array('name' => 'Sam', 'age' => 19), array('name' => 'Rob', 'age' => 30), array('name' => 'Robert', 'age' => 55)); $expected = array(array('name' => 'Robert', 'age' => 55), array('name' => 'Ann', 'age' => 30), array('name' => 'Bob', 'age' => 30), array('name' => 'Rob', 'age' => 30), array('name' => 'Terry', 'age' => 22), array('name' => 'Sam', 'age' => 19)); usort($values, fn\fnCompareMulti(array(fn\fnCompareFieldRev('age'), fn\fnCompareField('name')))); $this->assertEquals($expected, $values); }
public function testFileToIterator() { if (phpversion() < '5.5') { $this->assertTrue(true); return; } $handle = SampleDataLoader::getEmployeesCsvStream(); $expected = SampleDataLoader::getEmployeesCsv(); $fromIterator = Sequence::make(fileToIterator($handle))->reduce('', function ($content, $line) { return $content . $line; }); $this->assertEquals($expected, $fromIterator); }
function employeeExample1() { $employees = SampleDataLoader::getEmployees(true); // Assignment -- get a list of employees names // Get a list of employees foreach $names = array(); foreach ($employees as $employee) { $names[] = $employee['firstName']; } print_r($names); // Using a sequence $names2 = Sequence::make($employees)->pluck('firstName')->to_a(); print_r($names2); }
/** * @param resource $handleInput * @param resource $handleOutputForJson */ function exampleCsvToJson($handleInput, $handleOutputForJson) { $streamIterator = convertFileStreamToIterator($handleInput); fwrite($handleOutputForJson, "[\n"); Sequence::make($streamIterator)->map(function ($line) { return str_getcsv($line); })->map(fnCallMapWithLastResult(function ($row, $key, $lastRow) { if ($lastRow) { $keys = array_keys($lastRow); // Use the keys from the last row } else { $keys = $row; // This is the first row, use it as the keys. } return array_combine($keys, $row); // Put them together and return. }))->map(fn\fnIdentity())->offset(1)->map(function ($row) { return json_encode($row); })->walk(fnJsonWriter($handleOutputForJson)); fwrite($handleOutputForJson, "]"); }
/** * A Closure for Sequence::canBeSequence * * @return \Closure */ public static function fnCanBeSequence() { return function ($thing) { return Sequence::canBeSequence($thing); }; }
public function testReduceRight() { $values = array('one', 'two', 'three'); $this->assertEquals(implode('', array_reverse($values)), Sequence::make($values)->reduceRight(fn\fnStringConcat())); // test on an empty list. $this->assertNull(Sequence::make(null)->reduceRight(fn\fnSum())); }
public function testFnByFieldRev() { $this->assertEquals(array_reverse(Sequence::make(TestData::$fruit)->pluck('name')->sort()->to_a()), Sequence::make(TestData::$fruit)->sort(FnSort::fnByFieldRev('name'))->pluck('name')->to_a()); }
public function testLast() { $values = array(1, -2, 3, -4, 5, -6); $this->assertEquals(-6, Sequence::make($values)->last()); $this->assertEquals(5, Sequence::make($values)->last(function ($v) { return $v >= 0; })); }
/** * @inheritDoc */ public static function make($iterator) { // Force it to be a Sequence because the constructor for MappedSequence isn't identical return Sequence::make($iterator); }
/** * Returns a function that applies a function to a nested array and returns the results. * * @param $fn * @return Closure */ function fnNestedUKeyBy($fn) { return function ($array) use($fn) { return Sequence::make($array)->keyBy($fn)->to_a(); }; }
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)); }
/** * Returns an iterator that will return the items in reverse order. * Note: the original iterator fill be fully traversed when the first item of the returned iterator is requested * * @param Iterator $iterator * @return Sequence */ public static function reverse(Iterator $iterator) { return self::wrapFunctionIntoSequenceOnDemand(function () use($iterator) { // So we do not lose values due to duplicate keys, we need to store the keys along with the values. $array = Sequence::make($iterator)->map(fn\fnMapToKeyValuePair())->toValues(); // separate the key/value pair and return the resulting sequence. return Sequence::make(array_reverse($array))->keyBy(fn\fnPairKey())->map(fn\fnPairValue()); }); }
/** * Reassembles a traversed sequence into its original shape * * @param Iterator $iterator * @param string $pathSeparator * @return Sequence */ public static function reassemble(Iterator $iterator, $pathSeparator = '.') { return self::wrapFunctionIntoSequenceOnDemand(function () use($iterator, $pathSeparator) { return Sequence::make($iterator)->reduceToSequence(array(), function ($collection, $value, $path) use($pathSeparator) { return gs\set($collection, $path, $value, $pathSeparator); }); }); }
/** * @param array|\iterator $employees * @return array */ function exampleIdentity($employees) { $values = Sequence::make($employees)->map(fn\fnIdentity())->to_a(); return $values; }
/** * Generate a function that will: * Reduce the current value. * This allows for sum of sums * * @param callable $fnReduce (mixed, $value) * @return callable */ function fnReduce($fnReduce) { return function ($current, $values) use($fnReduce) { return Sequence::make($values)->reduce($current, $fnReduce); }; }