Skip to content

Commit df771f5

Browse files
committed
Allow constructing recursive MapDiffer that uses itself
1 parent 9917d17 commit df771f5

File tree

4 files changed

+26
-16
lines changed

4 files changed

+26
-16
lines changed

RELEASE-NOTES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Latest release:
66

77
## Version 3.2 (dev)
88

9+
* Added ability to construct a recursive `MapDiffer` that uses itself to diff elements (via `MapDiffer::newRecursiveDiffer`)
10+
* You can now pass non-list-differs as the second constructor argument in `MapDiffer`
911
* Deprecated constant `Diff_VERSION`
1012

1113
## Version 3.1 (2018-04-17)

src/Differ/Differ.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
/**
1111
* Interface for objects that can diff two arrays to an array of DiffOp.
1212
*
13+
* If the diff is done associatively, the differ should implement MapDifferInterface.
14+
*
1315
* @since 0.4
1416
*
1517
* @license GPL-2.0+

src/Differ/MapDiffer.php

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
* @license GPL-2.0+
2424
* @author Jeroen De Dauw < [email protected] >
2525
*/
26-
class MapDiffer implements Differ, MapDifferInterface {
26+
class MapDiffer implements MapDifferInterface {
2727

2828
/**
2929
* @var bool
@@ -33,30 +33,32 @@ class MapDiffer implements Differ, MapDifferInterface {
3333
/**
3434
* @var Differ
3535
*/
36-
private $listDiffer;
36+
private $elementDiffer;
3737

3838
/**
3939
* @var ValueComparer
4040
*/
4141
private $valueComparer;
4242

4343
/**
44-
* Create differ for recursive diffs
44+
* The third argument ($comparer) was added in 3.0
4545
*/
46-
public static function createRecursive( ValueComparer $comparer = null, Differ $listDiffer = null ) {
47-
$differ = new self( true, null, $comparer );
48-
$differ->listDiffer = $listDiffer ?? $differ;
49-
50-
return $differ;
46+
public function __construct( bool $recursively = false, Differ $elementDiffer = null, ValueComparer $comparer = null ) {
47+
$this->recursively = $recursively;
48+
$this->elementDiffer = $elementDiffer ?? new ListDiffer();
49+
$this->valueComparer = $comparer ?? new StrictComparer();
5150
}
5251

5352
/**
54-
* The third argument ($comparer) was added in 3.0
53+
* Creates a recursive MapDiffer that by default uses itself to diff elements recursively
54+
*
55+
* @since 3.2
5556
*/
56-
public function __construct( bool $recursively = false, Differ $listDiffer = null, ValueComparer $comparer = null ) {
57-
$this->recursively = $recursively;
58-
$this->listDiffer = $listDiffer ?? new ListDiffer();
59-
$this->valueComparer = $comparer ?? new StrictComparer();
57+
public static function newRecursiveDiffer( ValueComparer $comparer = null, Differ $elementDiffer = null ) {
58+
$differ = new self( true, null, $comparer );
59+
$differ->elementDiffer = $elementDiffer ?? $differ;
60+
61+
return $differ;
6062
}
6163

6264
/**
@@ -144,7 +146,10 @@ private function getDiffForArrays( array $old, array $new ): Diff {
144146
return new Diff( $this->doDiff( $old, $new ), true );
145147
}
146148

147-
return new Diff( $this->listDiffer->doDiff( $old, $new ), $this->listDiffer instanceof MapDifferInterface );
149+
return new Diff(
150+
$this->elementDiffer->doDiff( $old, $new ),
151+
$this->elementDiffer instanceof MapDifferInterface
152+
);
148153
}
149154

150155
/**

src/Differ/MapDifferInterface.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
namespace Diff\Differ;
55

66
/**
7-
* Interface for differ that can diff two maps.
7+
* Differ that diffs associatively (holding the array keys into account).
8+
* These differs can produce associative diff operations (changes and diffs).
89
*
910
* @since 3.2
1011
*
1112
* @license GPL-2.0+
1213
* @author Alexander Borisov < [email protected] >
1314
*/
14-
interface MapDifferInterface {
15+
interface MapDifferInterface extends Differ {
1516

1617
}

0 commit comments

Comments
 (0)