Skip to content

Commit 302c092

Browse files
committed
Fix reverse and add slice
1 parent 9d64215 commit 302c092

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

tests/run/lst/Lst.scala

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class Lst[+T <: AnyRef](val elems: AnyRef) extends AnyVal {
209209
val newElems = new Array[AnyRef](elems.length)
210210
var i = 0
211211
while (i < elems.length) {
212-
newElems(elems.length - i) = elem(i)
212+
newElems(elems.length - 1 - i) = elem(i)
213213
i += 1
214214
}
215215
new Lst(newElems)
@@ -229,23 +229,17 @@ class Lst[+T <: AnyRef](val elems: AnyRef) extends AnyVal {
229229

230230
def headOr[U >: T](alt: => U): U = if (length == 0) alt else head
231231

232-
def drop(n: Int): Lst[T] =
233-
if (n <= 0) this
232+
def slice(start: Int, end: Int): Lst[T] =
233+
if (start < 0) slice(0, end)
234234
else elems match {
235235
case null => this
236-
case elems: Array[AnyRef] => _fromArray(elems, n, elems.length)
237-
case elem: T @ unchecked => Empty
236+
case elems: Array[AnyRef] => _fromArray(elems, start, end `min` elems.length)
237+
case elem: T @ unchecked => if (end == 0) Empty else this
238238
}
239239

240+
def drop(n: Int): Lst[T] = slice(n, length)
240241
def tail = drop(1)
241-
242-
def take(n: Int): Lst[T] =
243-
if (n <= 0) Empty
244-
else elems match {
245-
case null => this
246-
case elems: Array[AnyRef] => _fromArray(elems, 0, n min elems.length)
247-
case elem: T @ unchecked => this
248-
}
242+
def take(n: Int): Lst[T] = slice(0, n)
249243

250244
def ++ [U >: T <: AnyRef](that: Lst[U]): Lst[U] =
251245
if (elems == null) that

tests/run/lst/LstTest.scala

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ object Test extends App {
103103
assert(!xs10.contains("f"))
104104
}
105105

106-
def foldLeftTest() = {
106+
def foldTest() = {
107107
assert(xs0.foldLeft("x")(_ ++ _) == "x")
108108
assert(xs1.foldLeft("x")(_ ++ _) == "xa")
109109
assert(xs2.foldLeft("x")(_ ++ _) == "xab")
@@ -112,6 +112,31 @@ object Test extends App {
112112
assert(("x" /: xs1)(_ ++ _) == "xa")
113113
assert(("x" /: xs2)(_ ++ _) == "xab")
114114
assert(("x" /: xs3)(_ ++ _) == "xabc")
115+
assert(xs1.reduceLeft(_ + _) == "a")
116+
assert(xs3.reduceLeft(_ + _) == "abc")
117+
}
118+
119+
def reverseTest() = {
120+
assert(xs0.reverse === xs0)
121+
assert(xs1.reverse === xs1)
122+
assert(xs3.reverse.mkString == "c, b, a", xs3.reverse.mkString)
123+
assert(xs4.reverse.reverse === xs4, xs4.reverse.reverse)
124+
}
125+
126+
def applyTest() = {
127+
assert(xs5.head == "a")
128+
assert(xs5.last == "e")
129+
assert(xs5(3) == "d")
130+
assert(xs1(0) == "a")
131+
}
132+
133+
def sliceTest() = {
134+
assert(xs5.slice(2, 4) === Lst("c", "d"))
135+
assert(xs5.drop(4) === Lst("e"))
136+
assert(xs5.take(4).mkString("") == "abcd")
137+
assert(xs5.drop(-1).elems `eq` xs5.elems)
138+
assert(xs1.take(1).elems `eq` xs1.elems)
139+
assert(xs0.take(10).length == 0)
115140
}
116141

117142
println("testing")
@@ -125,5 +150,8 @@ object Test extends App {
125150
existsTest()
126151
forallTest()
127152
containsTest()
128-
foldLeftTest()
153+
foldTest()
154+
reverseTest()
155+
applyTest()
156+
sliceTest()
129157
}

0 commit comments

Comments
 (0)