Skip to content

Commit 2c06bca

Browse files
authored
Scala-519: flattening (#512)
* Create unit tests for a full flattener * Write a "library pimper" for full flattening * Inline the pointless value flattenedList * Add a test that mixes several types of collection * Rename fullFlat to fullFlatten
1 parent 8ebc1c6 commit 2c06bca

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.baeldung.scala.flattening
2+
3+
import scala.language.implicitConversions
4+
5+
object Flattener {
6+
7+
/** This wrapper "pimps" the Seq type, adding the `fullFlat` method.
8+
*
9+
* @param seq
10+
* sequence whose functionality will be expanded
11+
* @return
12+
* a wrapper object that implements the `fullFlat` method
13+
*/
14+
implicit def sequenceFlattener(seq: Seq[Any]): FullFlat =
15+
new FullFlat(seq)
16+
17+
class FullFlat(seq: Seq[Any]) {
18+
def fullFlatten: Seq[Any] = seq flatten {
19+
case seq: Seq[Any] => seq.fullFlatten
20+
case nonSeq => Seq(nonSeq)
21+
}
22+
}
23+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baedung.scala.flattening
2+
3+
import org.scalatest.wordspec.AnyWordSpec
4+
5+
import scala.collection.immutable.Queue
6+
7+
class FlattenerSpec extends AnyWordSpec {
8+
9+
import com.baeldung.scala.flattening.Flattener.sequenceFlattener
10+
11+
"A full flattener" should {
12+
"respect the contents of an already flat sequence" in {
13+
val flatList = List(3, 7, 2, 7, 1, 3, 4)
14+
assertResult(flatList)(flatList.fullFlatten)
15+
}
16+
"flatten a nested empty list to an empty list" in {
17+
val list = List(List(List()))
18+
assertResult(List.empty)(list.fullFlatten)
19+
}
20+
"flatten several lists of the same type, one level deep" in {
21+
val list = List(
22+
List(1, 2, 3),
23+
List(4, 5),
24+
List(6)
25+
)
26+
assertResult(List(1, 2, 3, 4, 5, 6))(list.fullFlatten)
27+
}
28+
"flatten several lists of the same type, diverse levels deep" in {
29+
val list = List(
30+
List(1, List(2, 3)),
31+
List(4, List(List(5))),
32+
List(6)
33+
)
34+
assertResult(List(1, 2, 3, 4, 5, 6))(list.fullFlatten)
35+
}
36+
"flatten diverse types of collections" in {
37+
val list = List(
38+
Vector(1, Queue(2, 3))
39+
)
40+
assertResult(List(1, 2, 3))(list.fullFlatten)
41+
}
42+
"flatten several lists of the diverse types, diverse levels deep" in {
43+
val list = List(
44+
List(1, List("b", 'c')),
45+
List(4.4, List(List(5)))
46+
)
47+
assertResult(List(1, "b", 'c', 4.4, 5))(list.fullFlatten)
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)