Skip to content

Commit

Permalink
Adding product fn
Browse files Browse the repository at this point in the history
Signed-off-by: RJ Garcia <rj@bighead.net>
  • Loading branch information
ragboyjr committed Aug 5, 2019
1 parent 0def445 commit 9350d01
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 5 deletions.
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ The constants and curried functions are generated with `make code`.
Tests are run via `make test` and are stored in the `test` directory. We use peridot for testing.

## API
<table><tr><td><a href="#api-krak-fun-all">all</a></td><td><a href="#api-krak-fun-any">any</a></td><td><a href="#api-krak-fun-arraycompact">arrayCompact</a></td><td><a href="#api-krak-fun-arrayfilter">arrayFilter</a></td><td><a href="#api-krak-fun-arraymap">arrayMap</a></td><td><a href="#api-krak-fun-arrayreindex">arrayReindex</a></td><td><a href="#api-krak-fun-assign">assign</a></td><td><a href="#api-krak-fun-chain">chain</a></td></tr><tr><td><a href="#api-krak-fun-chunk">chunk</a></td><td><a href="#api-krak-fun-chunkby">chunkBy</a></td><td><a href="#api-krak-fun-compact">compact</a></td><td><a href="#api-krak-fun-compose">compose</a></td><td><a href="#api-krak-fun-construct">construct</a></td><td><a href="#api-krak-fun-curry">curry</a></td><td><a href="#api-krak-fun-differencewith">differenceWith</a></td><td><a href="#api-krak-fun-dd">dd</a></td></tr><tr><td><a href="#api-krak-fun-drop">drop</a></td><td><a href="#api-krak-fun-dropwhile">dropWhile</a></td><td><a href="#api-krak-fun-each">each</a></td><td><a href="#api-krak-fun-filter">filter</a></td><td><a href="#api-krak-fun-filterkeys">filterKeys</a></td><td><a href="#api-krak-fun-flatmap">flatMap</a></td><td><a href="#api-krak-fun-flatten">flatten</a></td><td><a href="#api-krak-fun-flip">flip</a></td></tr><tr><td><a href="#api-krak-fun-frompairs">fromPairs</a></td><td><a href="#api-krak-fun-groupby">groupBy</a></td><td><a href="#api-krak-fun-hasindexin">hasIndexIn</a></td><td><a href="#api-krak-fun-head">head</a></td><td><a href="#api-krak-fun-inarray">inArray</a></td><td><a href="#api-krak-fun-index">index</a></td><td><a href="#api-krak-fun-indexin">indexIn</a></td><td><a href="#api-krak-fun-indexof">indexOf</a></td></tr><tr><td><a href="#api-krak-fun-isnull">isNull</a></td><td><a href="#api-krak-fun-iter">iter</a></td><td><a href="#api-krak-fun-join">join</a></td><td><a href="#api-krak-fun-keys">keys</a></td><td><a href="#api-krak-fun-map">map</a></td><td><a href="#api-krak-fun-mapaccum">mapAccum</a></td><td><a href="#api-krak-fun-mapkeys">mapKeys</a></td><td><a href="#api-krak-fun-mapkeyvalue">mapKeyValue</a></td></tr><tr><td><a href="#api-krak-fun-mapon">mapOn</a></td><td><a href="#api-krak-fun-nullable">nullable</a></td><td><a href="#api-krak-fun-oneach">onEach</a></td><td><a href="#api-krak-fun-op">op</a></td><td><a href="#api-krak-fun-pad">pad</a></td><td><a href="#api-krak-fun-partial">partial</a></td><td><a href="#api-krak-fun-partition">partition</a></td><td><a href="#api-krak-fun-pipe">pipe</a></td></tr><tr><td><a href="#api-krak-fun-prop">prop</a></td><td><a href="#api-krak-fun-propin">propIn</a></td><td><a href="#api-krak-fun-range">range</a></td><td><a href="#api-krak-fun-reduce">reduce</a></td><td><a href="#api-krak-fun-reducekeyvalue">reduceKeyValue</a></td><td><a href="#api-krak-fun-reindex">reindex</a></td><td><a href="#api-krak-fun-retry">retry</a></td><td><a href="#api-krak-fun-search">search</a></td></tr><tr><td><a href="#api-krak-fun-setindex">setIndex</a></td><td><a href="#api-krak-fun-setindexin">setIndexIn</a></td><td><a href="#api-krak-fun-setprop">setProp</a></td><td><a href="#api-krak-fun-slice">slice</a></td><td><a href="#api-krak-fun-sortfromarray">sortFromArray</a></td><td><a href="#api-krak-fun-spread">spread</a></td><td><a href="#api-krak-fun-take">take</a></td><td><a href="#api-krak-fun-takewhile">takeWhile</a></td></tr><tr><td><a href="#api-krak-fun-toarray">toArray</a></td><td><a href="#api-krak-fun-toarraywithkeys">toArrayWithKeys</a></td><td><a href="#api-krak-fun-topairs">toPairs</a></td><td><a href="#api-krak-fun-updateindexin">updateIndexIn</a></td><td><a href="#api-krak-fun-values">values</a></td><td><a href="#api-krak-fun-when">when</a></td><td><a href="#api-krak-fun-withstate">withState</a></td><td><a href="#api-krak-fun-within">within</a></td></tr><tr><td><a href="#api-krak-fun-without">without</a></td><td><a href="#api-krak-fun-zip">zip</a></td></tr></table>
<table><tr><td><a href="#api-krak-fun-all">all</a></td><td><a href="#api-krak-fun-any">any</a></td><td><a href="#api-krak-fun-arraycompact">arrayCompact</a></td><td><a href="#api-krak-fun-arrayfilter">arrayFilter</a></td><td><a href="#api-krak-fun-arraymap">arrayMap</a></td><td><a href="#api-krak-fun-arrayreindex">arrayReindex</a></td><td><a href="#api-krak-fun-assign">assign</a></td><td><a href="#api-krak-fun-chain">chain</a></td></tr><tr><td><a href="#api-krak-fun-chunk">chunk</a></td><td><a href="#api-krak-fun-chunkby">chunkBy</a></td><td><a href="#api-krak-fun-compact">compact</a></td><td><a href="#api-krak-fun-compose">compose</a></td><td><a href="#api-krak-fun-construct">construct</a></td><td><a href="#api-krak-fun-curry">curry</a></td><td><a href="#api-krak-fun-differencewith">differenceWith</a></td><td><a href="#api-krak-fun-dd">dd</a></td></tr><tr><td><a href="#api-krak-fun-drop">drop</a></td><td><a href="#api-krak-fun-dropwhile">dropWhile</a></td><td><a href="#api-krak-fun-each">each</a></td><td><a href="#api-krak-fun-filter">filter</a></td><td><a href="#api-krak-fun-filterkeys">filterKeys</a></td><td><a href="#api-krak-fun-flatmap">flatMap</a></td><td><a href="#api-krak-fun-flatten">flatten</a></td><td><a href="#api-krak-fun-flip">flip</a></td></tr><tr><td><a href="#api-krak-fun-frompairs">fromPairs</a></td><td><a href="#api-krak-fun-groupby">groupBy</a></td><td><a href="#api-krak-fun-hasindexin">hasIndexIn</a></td><td><a href="#api-krak-fun-head">head</a></td><td><a href="#api-krak-fun-inarray">inArray</a></td><td><a href="#api-krak-fun-index">index</a></td><td><a href="#api-krak-fun-indexin">indexIn</a></td><td><a href="#api-krak-fun-indexof">indexOf</a></td></tr><tr><td><a href="#api-krak-fun-isnull">isNull</a></td><td><a href="#api-krak-fun-iter">iter</a></td><td><a href="#api-krak-fun-join">join</a></td><td><a href="#api-krak-fun-keys">keys</a></td><td><a href="#api-krak-fun-map">map</a></td><td><a href="#api-krak-fun-mapaccum">mapAccum</a></td><td><a href="#api-krak-fun-mapkeys">mapKeys</a></td><td><a href="#api-krak-fun-mapkeyvalue">mapKeyValue</a></td></tr><tr><td><a href="#api-krak-fun-mapon">mapOn</a></td><td><a href="#api-krak-fun-nullable">nullable</a></td><td><a href="#api-krak-fun-oneach">onEach</a></td><td><a href="#api-krak-fun-op">op</a></td><td><a href="#api-krak-fun-pad">pad</a></td><td><a href="#api-krak-fun-partial">partial</a></td><td><a href="#api-krak-fun-partition">partition</a></td><td><a href="#api-krak-fun-pipe">pipe</a></td></tr><tr><td><a href="#api-krak-fun-product">product</a></td><td><a href="#api-krak-fun-prop">prop</a></td><td><a href="#api-krak-fun-propin">propIn</a></td><td><a href="#api-krak-fun-range">range</a></td><td><a href="#api-krak-fun-reduce">reduce</a></td><td><a href="#api-krak-fun-reducekeyvalue">reduceKeyValue</a></td><td><a href="#api-krak-fun-reindex">reindex</a></td><td><a href="#api-krak-fun-retry">retry</a></td></tr><tr><td><a href="#api-krak-fun-search">search</a></td><td><a href="#api-krak-fun-setindex">setIndex</a></td><td><a href="#api-krak-fun-setindexin">setIndexIn</a></td><td><a href="#api-krak-fun-setprop">setProp</a></td><td><a href="#api-krak-fun-slice">slice</a></td><td><a href="#api-krak-fun-sortfromarray">sortFromArray</a></td><td><a href="#api-krak-fun-spread">spread</a></td><td><a href="#api-krak-fun-take">take</a></td></tr><tr><td><a href="#api-krak-fun-takewhile">takeWhile</a></td><td><a href="#api-krak-fun-toarray">toArray</a></td><td><a href="#api-krak-fun-toarraywithkeys">toArrayWithKeys</a></td><td><a href="#api-krak-fun-topairs">toPairs</a></td><td><a href="#api-krak-fun-updateindexin">updateIndexIn</a></td><td><a href="#api-krak-fun-values">values</a></td><td><a href="#api-krak-fun-when">when</a></td><td><a href="#api-krak-fun-withstate">withState</a></td></tr><tr><td><a href="#api-krak-fun-within">within</a></td><td><a href="#api-krak-fun-without">without</a></td><td><a href="#api-krak-fun-zip">zip</a></td></tr></table>

<h3 id="api-krak-fun-all">all(callable $predicate, iterable $iter): bool</h3>

Expand Down Expand Up @@ -623,6 +623,13 @@ $res = flatten([1, [2, [3]]], 1);
expect(toArray($res))->equal([1, 2, [3]]);
```

Flattening zero levels does nothing:

```php
$res = flatten([1, [2]], 0);
expect(toArray($res))->equal([1, [2]]);
```



<h3 id="api-krak-fun-flip">flip(iterable $iter): iterable</h3>
Expand Down Expand Up @@ -1167,6 +1174,19 @@ expect($res)->equal(6);

`pipe` and `compose` are sister functions and do the same thing except the functions are composed in reverse order. pipe(f, g)(x) = g(f(x))

<h3 id="api-krak-fun-product">product(iterable ...$iters): iterable</h3>

**Name:** `Krak\Fun\product`

Creates a cartesian product of multiple sets:

```php
$res = product([1, 2], [3, 4], [5, 6]);
expect(toArray($res))->equal([[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]);
```



<h3 id="api-krak-fun-prop">prop(string $key, $data, $else = null)</h3>

**Name:** `Krak\Fun\prop`
Expand Down
3 changes: 2 additions & 1 deletion src/c.generated.php
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ function flatten($levels = INF)
{
return function (iterable $iter) use($levels) {
if ($levels == 0) {
return $iter;
yield from $iter;
} else {
if ($levels == 1) {
foreach ($iter as $k => $v) {
Expand Down Expand Up @@ -741,6 +741,7 @@ function onEach(callable $handle)
const zip = 'Krak\\Fun\\zip';
const flatMap = 'Krak\\Fun\\flatMap';
const flatten = 'Krak\\Fun\\flatten';
const product = 'Krak\\Fun\\product';
const when = 'Krak\\Fun\\when';
const toPairs = 'Krak\\Fun\\toPairs';
const fromPairs = 'Krak\\Fun\\fromPairs';
Expand Down
1 change: 1 addition & 0 deletions src/consts.generated.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
const zip = 'Krak\\Fun\\zip';
const flatMap = 'Krak\\Fun\\flatMap';
const flatten = 'Krak\\Fun\\flatten';
const product = 'Krak\\Fun\\product';
const when = 'Krak\\Fun\\when';
const toPairs = 'Krak\\Fun\\toPairs';
const fromPairs = 'Krak\\Fun\\fromPairs';
Expand Down
1 change: 1 addition & 0 deletions src/consts.ns.generated.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
const zip = 'Krak\\Fun\\zip';
const flatMap = 'Krak\\Fun\\flatMap';
const flatten = 'Krak\\Fun\\flatten';
const product = 'Krak\\Fun\\product';
const when = 'Krak\\Fun\\when';
const toPairs = 'Krak\\Fun\\toPairs';
const fromPairs = 'Krak\\Fun\\fromPairs';
Expand Down
2 changes: 1 addition & 1 deletion src/curried.generated.php
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ function flatten($levels = INF)
{
return function (iterable $iter) use($levels) {
if ($levels == 0) {
return $iter;
yield from $iter;
} else {
if ($levels == 1) {
foreach ($iter as $k => $v) {
Expand Down
21 changes: 20 additions & 1 deletion src/f.generated.php
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ function flatMap(callable $map, iterable $iter) : iterable
function flatten(iterable $iter, $levels = INF) : iterable
{
if ($levels == 0) {
return $iter;
yield from $iter;
} else {
if ($levels == 1) {
foreach ($iter as $k => $v) {
Expand All @@ -350,6 +350,25 @@ function flatten(iterable $iter, $levels = INF) : iterable
}
}
}
function product(iterable ...$iters) : iterable
{
if (count($iters) === 0) {
yield from [];
return;
}
if (count($iters) === 1) {
yield from \Krak\Fun\map(function ($v) {
return [$v];
}, $iters[0]);
return;
}
foreach ($iters[0] as $value) {
yield from \Krak\Fun\map(function (array $tup) use($value) {
array_unshift($tup, $value);
return $tup;
}, \Krak\Fun\product(...\array_slice($iters, 1)));
}
}
function when(callable $if, callable $then, $value)
{
return $if($value) ? $then($value) : $value;
Expand Down
21 changes: 20 additions & 1 deletion src/fn.php
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ function flatMap(callable $map, iterable $iter): iterable {

function flatten(iterable $iter, $levels = INF): iterable {
if ($levels == 0) {
return $iter;
yield from $iter;
} else if ($levels == 1) {
foreach ($iter as $k => $v) {
if (\is_iterable($v)) {
Expand All @@ -363,6 +363,25 @@ function flatten(iterable $iter, $levels = INF): iterable {
}


function product(iterable ...$iters): iterable {
if (count($iters) === 0) {
yield from [];
return;
}
if (count($iters) === 1) {
yield from \Krak\Fun\map(function($v) { return [$v]; }, $iters[0]);
return;
}

foreach ($iters[0] as $value) {
yield from \Krak\Fun\map(function(array $tup) use ($value) {
array_unshift($tup, $value);
return $tup;
}, \Krak\Fun\product(...\array_slice($iters, 1)));
}
}


function when(callable $if, callable $then, $value) {
return $if($value) ? $then($value) : $value;
}
Expand Down
21 changes: 21 additions & 0 deletions test/fn.spec.php
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,10 @@ function() { yield from [1,2,3]; }
$res = flatten([1,[2, [3]]], 1);
expect(toArray($res))->equal([1, 2, [3]]);
});
test('Flattening zero levels does nothing', function() {
$res = flatten([1, [2]], 0);
expect(toArray($res))->equal([1,[2]]);
});
});
describe('flip', function() {
docFn(flip::class);
Expand Down Expand Up @@ -680,6 +684,23 @@ function() { yield from [1,2,3]; },

docOutro('`pipe` and `compose` are sister functions and do the same thing except the functions are composed in reverse order. pipe(f, g)(x) = g(f(x))');
});
describe('product', function() {
docFn(product::class);

test('Creates a cartesian product of multiple sets', function() {
$res = product([1,2], [3,4], [5, 6]);
expect(toArray($res))->equal([
[1,3,5],
[1,3,6],
[1,4,5],
[1,4,6],
[2,3,5],
[2,3,6],
[2,4,5],
[2,4,6],
]);
});
});
describe('prop', function() {
docFn(prop::class);

Expand Down

0 comments on commit 9350d01

Please sign in to comment.