Skip to content

Commit 772244e

Browse files
author
Six
committed
Added two factory methods.
1 parent 0040789 commit 772244e

File tree

3 files changed

+104
-1
lines changed

3 files changed

+104
-1
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,17 @@ use Blibio\Combinatorics\Combinatorics;
2323

2424
$elements = ['A', 'B', 'C', 'D'];
2525
$k = 3;
26-
$it = Combinatorics::combinationsWithoutRepetition($elements, $k);
26+
27+
// Using the boolean parameter:
28+
$it = Combinatorics::combinations($elements, $k, withRepetition: false);
2729

2830
// or:
31+
// $it = Combinatorics::combinations($elements, $k, withRepetition: true);
32+
// $it = Combinatorics::permutations($elements, $k, withRepetition: false);
33+
// $it = Combinatorics::permutations($elements, $k, withRepetition: true);
34+
35+
// Using the explicit method names:
36+
// $it = Combinatorics::combinationsWithoutRepetition($elements, $k);
2937
// $it = Combinatorics::combinationsWithRepetition($elements, $k);
3038
// $it = Combinatorics::permutationsWithoutRepetition($elements, $k);
3139
// $it = Combinatorics::permutationsWithRepetition($elements, $k);

src/Combinatorics.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@
66

77
final readonly class Combinatorics
88
{
9+
/**
10+
* @template U
11+
*
12+
* @param array<array-key, U> $elements
13+
* @param int<1, max> $k
14+
*
15+
* @return ($withRepetition is true ? Combination\WithRepetition<U> : Combination\WithoutRepetition<U>)
16+
*
17+
* @throws \InvalidArgumentException
18+
*/
19+
public static function combinations(array $elements, int $k, bool $withRepetition): Combination\WithRepetition|Combination\WithoutRepetition
20+
{
21+
return $withRepetition
22+
? new Combination\WithRepetition($elements, $k)
23+
: new Combination\WithoutRepetition($elements, $k);
24+
}
25+
926
/**
1027
* @template U
1128
*
@@ -36,6 +53,23 @@ public static function combinationsWithoutRepetition(array $elements, int $k): C
3653
return new Combination\WithoutRepetition($elements, $k);
3754
}
3855

56+
/**
57+
* @template U
58+
*
59+
* @param array<array-key, U> $elements
60+
* @param int<1, max> $k
61+
*
62+
* @return ($withRepetition is true ? Permutation\WithRepetition<U> : Permutation\WithoutRepetition<U>)
63+
*
64+
* @throws \InvalidArgumentException
65+
*/
66+
public static function permutations(array $elements, int $k, bool $withRepetition): Permutation\WithRepetition|Permutation\WithoutRepetition
67+
{
68+
return $withRepetition
69+
? new Permutation\WithRepetition($elements, $k)
70+
: new Permutation\WithoutRepetition($elements, $k);
71+
}
72+
3973
/**
4074
* @template U
4175
*

tests/CombinatoricsTest.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Blibio\Combinatorics\Test;
6+
7+
use Blibio\Combinatorics\Combination;
8+
use Blibio\Combinatorics\Combinatorics;
9+
use Blibio\Combinatorics\Permutation;
10+
use PHPUnit\Framework\TestCase;
11+
12+
final class CombinatoricsTest extends TestCase
13+
{
14+
public function testCombinationsWithRepetitionFromFlag(): void
15+
{
16+
$elements = ['A', 'B'];
17+
$k = 2;
18+
19+
$result = Combinatorics::combinations($elements, $k, withRepetition: true);
20+
$expected = Combinatorics::combinationsWithRepetition($elements, $k);
21+
22+
self::assertEquals(iterator_to_array($expected), iterator_to_array($result));
23+
self::assertInstanceOf(Combination\WithRepetition::class, $result);
24+
}
25+
26+
public function testCombinationsWithoutRepetitionFromFlag(): void
27+
{
28+
$elements = ['A', 'B', 'C'];
29+
$k = 2;
30+
31+
$result = Combinatorics::combinations($elements, $k, withRepetition: false);
32+
$expected = Combinatorics::combinationsWithoutRepetition($elements, $k);
33+
34+
self::assertEquals(iterator_to_array($expected), iterator_to_array($result));
35+
self::assertInstanceOf(Combination\WithoutRepetition::class, $result);
36+
}
37+
38+
public function testPermutationsWithRepetitionFromFlag(): void
39+
{
40+
$elements = ['A', 'B'];
41+
$k = 2;
42+
43+
$result = Combinatorics::permutations($elements, $k, withRepetition: true);
44+
$expected = Combinatorics::permutationsWithRepetition($elements, $k);
45+
46+
self::assertEquals(iterator_to_array($expected), iterator_to_array($result));
47+
self::assertInstanceOf(Permutation\WithRepetition::class, $result);
48+
}
49+
50+
public function testPermutationsWithoutRepetitionFromFlag(): void
51+
{
52+
$elements = ['A', 'B', 'C'];
53+
$k = 2;
54+
55+
$result = Combinatorics::permutations($elements, $k, withRepetition: false);
56+
$expected = Combinatorics::permutationsWithoutRepetition($elements, $k);
57+
58+
self::assertEquals(iterator_to_array($expected), iterator_to_array($result));
59+
self::assertInstanceOf(Permutation\WithoutRepetition::class, $result);
60+
}
61+
}

0 commit comments

Comments
 (0)