Skip to content

Commit c8d59fc

Browse files
committed
Rename methods
1 parent 31df05e commit c8d59fc

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

src/Set.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public function values(): array
142142
* @param Set $set The set to append
143143
* @return Set A new set containing the merged items
144144
*/
145-
public function merge(Set $set): Set
145+
public function unison(Set $set): Set
146146
{
147147
$merged = new Set();
148148
$merged->exchangeArray($this->values());
@@ -163,14 +163,14 @@ public function merge(Set $set): Set
163163
* @return Set
164164
*
165165
*/
166-
public function diff(Set $set): Set
166+
public function difference(Set $set): Set
167167
{
168168
if ($this->size === 0) {
169169
return new Set();
170170
}
171171

172172
if ($set->size === 0) {
173-
return (new Set())->merge($this);
173+
return (new Set())->unison($this);
174174
}
175175

176176
$intersect = new Set;
@@ -184,6 +184,21 @@ public function diff(Set $set): Set
184184
return $intersect;
185185
}
186186

187+
public function symmetricDifference(Set $set): Set
188+
{
189+
$diff = clone $this;
190+
191+
foreach ($set->values() as $value) {
192+
if ($diff->has($value)) {
193+
$diff->delete($value);
194+
} else {
195+
$diff->add($value);
196+
}
197+
}
198+
199+
return $diff;
200+
}
201+
187202
/**
188203
* Checks if a given $set is a subset of the current instance
189204
* All values should be present, but ordinality does not matter

tests/SetTest.php

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ public function testAdd()
2727
$this->assertSame(['a'], $set->values());
2828
}
2929

30+
public function testAddViaArrayAccess()
31+
{
32+
$set = new Set();
33+
$set[] = 'a';
34+
$this->assertSame(['a'], $set->values());
35+
36+
$set[] ='a';
37+
$this->assertSame(['a'], $set->values());
38+
}
39+
3040
public function testDelete()
3141
{
3242
$set = new Set();
@@ -70,7 +80,7 @@ public function testDiffOnSameValues()
7080
$set2->add(2);
7181

7282
$expected = 0;
73-
$result = $set->diff($set2)->size;
83+
$result = $set->difference($set2)->size;
7484

7585
$this->assertSame($expected, $result);
7686
}
@@ -80,7 +90,7 @@ public function testDiffOnDifferentValues()
8090
$set = new Set(1, 2);
8191
$set2 = new Set(3, 4);
8292

83-
$result = $set->diff($set2);
93+
$result = $set->difference($set2);
8494

8595
$this->assertSame(2, $result->size);
8696
$this->assertSame([1,2], $result->values());
@@ -91,7 +101,7 @@ public function testDiffOnEmptySet()
91101
$set = new Set();
92102
$set2 = new Set(3, 4);
93103

94-
$result = $set->diff($set2);
104+
$result = $set->difference($set2);
95105
$this->assertSame(0, $result->size);
96106
}
97107

@@ -100,7 +110,7 @@ public function testDiffOnEmptyTargetSet()
100110
$set = new Set(1,2);
101111
$set2 = new Set();
102112

103-
$result = $set->diff($set2);
113+
$result = $set->difference($set2);
104114
$this->assertSame(2, $result->size);
105115
}
106116

@@ -153,7 +163,7 @@ public function testMerge()
153163
$set2->add(null);
154164

155165
$expected = [1, 2, null];
156-
$result = $set->merge($set2)->values();
166+
$result = $set->unison($set2)->values();
157167

158168
$this->assertSame($expected, $result);
159169
}
@@ -213,4 +223,20 @@ public function testSubsetShouldReturnFalse()
213223

214224
$this->assertFalse($set->subset($subset));
215225
}
226+
227+
public function testSymmetricDifference()
228+
{
229+
$set1 = new Set(1, 2, 'three');
230+
$set2 = new Set(2, 3, 4);
231+
232+
$this->assertEquals([1, 'three', 3, 4], $set1->symmetricDifference($set2)->values());
233+
$this->assertEqualsArray([1, 'three', 3, 4], $set2->symmetricDifference($set1)->values());
234+
}
235+
236+
protected function assertEqualsArray($expected, $actual, $message = '')
237+
{
238+
sort($expected);
239+
sort($actual);
240+
$this->assertEquals($expected, $actual, $message);
241+
}
216242
}

0 commit comments

Comments
 (0)