diff --git a/CHANGELOG.md b/CHANGELOG.md index 06c5414e..70aab4a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ - `Innmind\Immutable\Set` no longer implements `Countable` - Requires PHP `8.4` - `Innmind\Immutable\Predicate` is now a final class +- `Innmind\Immutable\Monoid\*` are now enums with a single case called `monoid` ### Removed diff --git a/docs/structures/sequence.md b/docs/structures/sequence.md index 8b583d02..bdf74f6a 100644 --- a/docs/structures/sequence.md +++ b/docs/structures/sequence.md @@ -598,7 +598,7 @@ use Innmind\Immutable\Monoid\Concat; $lines = Sequence::of("foo\n", "bar\n", 'baz') ->map(fn($line) => Str::of($line)) - ->fold(new Concat); + ->fold(Concat::monoid); $lines->equals("foo\nbar\nbaz"); // true ``` diff --git a/proofs/monoid/arrayMerge.php b/proofs/monoid/arrayMerge.php index 4f8cea1e..28a3dfb1 100644 --- a/proofs/monoid/arrayMerge.php +++ b/proofs/monoid/arrayMerge.php @@ -32,14 +32,14 @@ yield properties( 'ArrayMerge properties', Monoid::properties($set, $equals), - Set::of(new ArrayMerge), + Set::of(ArrayMerge::monoid), ); foreach (Monoid::list($set, $equals) as $property) { yield proof( 'ArrayMerge property', given($property), - static fn($assert, $property) => $property->ensureHeldBy($assert, new ArrayMerge), + static fn($assert, $property) => $property->ensureHeldBy($assert, ArrayMerge::monoid), ); } }; diff --git a/proofs/monoid/concat.php b/proofs/monoid/concat.php index a2b23ace..f50145b9 100644 --- a/proofs/monoid/concat.php +++ b/proofs/monoid/concat.php @@ -15,14 +15,14 @@ yield properties( 'Concat properties', Monoid::properties($set, $equals), - Set::of(new Concat), + Set::of(Concat::monoid), ); foreach (Monoid::list($set, $equals) as $property) { yield proof( 'Concat property', given($property), - static fn($assert, $property) => $property->ensureHeldBy($assert, new Concat), + static fn($assert, $property) => $property->ensureHeldBy($assert, Concat::monoid), ); } }; diff --git a/proofs/sequence.php b/proofs/sequence.php index 198aa448..af8c1f44 100644 --- a/proofs/sequence.php +++ b/proofs/sequence.php @@ -96,7 +96,7 @@ static function($assert, $string, $chunk) { $string, $chunks ->flatMap(static fn($chars) => $chars) - ->fold(new Concat) + ->fold(Concat::monoid) ->toString(), ); }, diff --git a/src/Monoid/Append.php b/src/Monoid/Append.php index e29848b8..df6160d1 100644 --- a/src/Monoid/Append.php +++ b/src/Monoid/Append.php @@ -13,8 +13,10 @@ * @psalm-immutable * @implements Monoid> */ -final class Append implements Monoid +enum Append implements Monoid { + case monoid; + /** * @template C of object * @@ -26,7 +28,7 @@ final class Append implements Monoid public static function of(?string $class = null): self { /** @var self */ - return new self; + return self::monoid; } #[\Override] diff --git a/src/Monoid/ArrayMerge.php b/src/Monoid/ArrayMerge.php index f37d92cb..f591df24 100644 --- a/src/Monoid/ArrayMerge.php +++ b/src/Monoid/ArrayMerge.php @@ -11,8 +11,10 @@ * @psalm-immutable * @implements Monoid> */ -final class ArrayMerge implements Monoid +enum ArrayMerge implements Monoid { + case monoid; + #[\Override] public function identity(): mixed { diff --git a/src/Monoid/Concat.php b/src/Monoid/Concat.php index 9801fdca..63f088e3 100644 --- a/src/Monoid/Concat.php +++ b/src/Monoid/Concat.php @@ -12,8 +12,10 @@ * @psalm-immutable * @implements Monoid */ -final class Concat implements Monoid +enum Concat implements Monoid { + case monoid; + #[\Override] public function identity(): Str { diff --git a/src/Monoid/MergeMap.php b/src/Monoid/MergeMap.php index 9dd212cb..fa559155 100644 --- a/src/Monoid/MergeMap.php +++ b/src/Monoid/MergeMap.php @@ -14,8 +14,10 @@ * @psalm-immutable * @implements Monoid> */ -final class MergeMap implements Monoid +enum MergeMap implements Monoid { + case monoid; + /** * @template A of object * @template B of object @@ -29,7 +31,7 @@ final class MergeMap implements Monoid public static function of(?string $key = null, ?string $value = null): self { /** @var self */ - return new self; + return self::monoid; } #[\Override] diff --git a/src/Monoid/MergeSet.php b/src/Monoid/MergeSet.php index 4aa71df4..373dacbe 100644 --- a/src/Monoid/MergeSet.php +++ b/src/Monoid/MergeSet.php @@ -13,8 +13,10 @@ * @psalm-immutable * @implements Monoid> */ -final class MergeSet implements Monoid +enum MergeSet implements Monoid { + case monoid; + /** * @template C of object * @@ -26,7 +28,7 @@ final class MergeSet implements Monoid public static function of(?string $class = null): self { /** @var self */ - return new self; + return self::monoid; } #[\Override] diff --git a/tests/Monoid/ConcatTest.php b/tests/Monoid/ConcatTest.php index 5ddbca19..bb56cd14 100644 --- a/tests/Monoid/ConcatTest.php +++ b/tests/Monoid/ConcatTest.php @@ -14,12 +14,12 @@ class ConcatTest extends TestCase { public function testInterface() { - $this->assertInstanceOf(Monoid::class, new Concat); + $this->assertInstanceOf(Monoid::class, Concat::monoid); } public function testCombine() { - $str = (new Concat)->combine(Str::of('foo'), Str::of('bar')); + $str = Concat::monoid->combine(Str::of('foo'), Str::of('bar')); $this->assertInstanceOf(Str::class, $str); $this->assertSame( diff --git a/tests/SequenceTest.php b/tests/SequenceTest.php index 2d930a0d..268baf8e 100644 --- a/tests/SequenceTest.php +++ b/tests/SequenceTest.php @@ -852,12 +852,12 @@ public function testLazyMatch() public function testFold() { - $str = Sequence::of(Str::of('foo'), Str::of('bar'), Str::of('baz'))->fold(new Concat); + $str = Sequence::of(Str::of('foo'), Str::of('bar'), Str::of('baz'))->fold(Concat::monoid); $this->assertInstanceOf(Str::class, $str); $this->assertSame('foobarbaz', $str->toString()); - $str = Sequence::of(Str::of('baz'), Str::of('foo'), Str::of('bar'))->fold(new Concat); + $str = Sequence::of(Str::of('baz'), Str::of('foo'), Str::of('bar'))->fold(Concat::monoid); $this->assertInstanceOf(Str::class, $str); $this->assertSame('bazfoobar', $str->toString());