Пример #1
0
 /**
  * @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);
     };
 }
Пример #2
0
 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());
 }
Пример #3
0
 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());
 }
Пример #4
0
 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);
 }
Пример #6
0
 /**
  * @return RecursiveSequence
  */
 public function getChildren()
 {
     $x = $this->current();
     if ($this->canGoDeeper()) {
         return RecursiveSequence::make($x)->setMaxDepth($this->depth - 1);
     } else {
         return Sequence::make($x);
     }
 }
Пример #7
0
 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);
 }
Пример #8
0
 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);
 }
Пример #9
0
 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);
 }
Пример #10
0
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);
}
Пример #11
0
/**
 * @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, "]");
}
Пример #12
0
 /**
  * A Closure for Sequence::canBeSequence
  *
  * @return \Closure
  */
 public static function fnCanBeSequence()
 {
     return function ($thing) {
         return Sequence::canBeSequence($thing);
     };
 }
Пример #13
0
 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()));
 }
Пример #14
0
 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());
 }
Пример #15
0
 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;
     }));
 }
Пример #16
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);
 }
Пример #17
0
/**
 * 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();
    };
}
Пример #18
0
 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));
 }
Пример #19
0
 /**
  * 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());
     });
 }
Пример #20
0
 /**
  * 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);
         });
     });
 }
Пример #21
0
/**
 * @param array|\iterator $employees
 * @return array
 */
function exampleIdentity($employees)
{
    $values = Sequence::make($employees)->map(fn\fnIdentity())->to_a();
    return $values;
}
Пример #22
0
/**
 * 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);
    };
}