Skip to content

Commit 60bb1fe

Browse files
committed
Make NonEmptyLazyList properly lazy
Make `NonEmptyLazyList` properly lazy and remove unnecessary laziness.
1 parent ba032a4 commit 60bb1fe

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

core/src/main/scala-2.13+/cats/data/NonEmptyLazyList.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ object NonEmptyLazyList extends NonEmptyLazyListInstances {
4747
s.asInstanceOf[LazyList[A]]
4848

4949
def fromLazyList[A](as: LazyList[A]): Option[NonEmptyLazyList[A]] =
50-
if (as.nonEmpty) Option(create(as)) else None
50+
if (as.nonEmpty) Some(create(as)) else None
5151

5252
def fromLazyListUnsafe[A](ll: LazyList[A]): NonEmptyLazyList[A] =
5353
if (ll.nonEmpty) create(ll)
@@ -69,7 +69,7 @@ object NonEmptyLazyList extends NonEmptyLazyListInstances {
6969
create(ca :+ a)
7070

7171
def apply[A](a: => A, as: A*): NonEmptyLazyList[A] =
72-
create(LazyList.concat(LazyList(a), LazyList.from(as)))
72+
create(a #:: LazyList.from(as))
7373

7474
implicit def catsNonEmptyLazyListOps[A](value: NonEmptyLazyList[A]): NonEmptyLazyListOps[A] =
7575
new NonEmptyLazyListOps(value)
@@ -110,7 +110,7 @@ class NonEmptyLazyListOps[A](private val value: NonEmptyLazyList[A])
110110
* Returns a new NonEmptyLazyList consisting of `a` followed by this
111111
*/
112112
final def prepend[AA >: A](a: AA): NonEmptyLazyList[AA] =
113-
create(a #:: toLazyList)
113+
create(toLazyList.prepended(a))
114114

115115
/**
116116
* Alias for [[prepend]].
@@ -121,6 +121,8 @@ class NonEmptyLazyListOps[A](private val value: NonEmptyLazyList[A])
121121
/**
122122
* Alias for [[prepend]].
123123
*/
124+
// TODO: `a` should be by-name and this method should not be listed as an
125+
// alias for `prepend`, but it's too late to change that in this version
124126
final def #::[AA >: A](a: AA): NonEmptyLazyList[AA] =
125127
prepend(a)
126128

@@ -158,8 +160,7 @@ class NonEmptyLazyListOps[A](private val value: NonEmptyLazyList[A])
158160
* Appends the given LazyList
159161
*/
160162
final def appendLazyList[AA >: A](nell: LazyList[AA]): NonEmptyLazyList[AA] =
161-
if (nell.isEmpty) value
162-
else create(toLazyList ++ nell)
163+
create(toLazyList ++ nell)
163164

164165
/**
165166
* Alias for `appendLazyList`
@@ -171,8 +172,7 @@ class NonEmptyLazyListOps[A](private val value: NonEmptyLazyList[A])
171172
* Prepends the given LazyList
172173
*/
173174
final def prependLazyList[AA >: A](c: LazyList[AA]): NonEmptyLazyList[AA] =
174-
if (c.isEmpty) value
175-
else create(c ++ toLazyList)
175+
create(c ++ toLazyList)
176176

177177
/**
178178
* Prepends the given NonEmptyLazyList

tests/shared/src/test/scala-2.13+/cats/tests/NonEmptyLazyListSuite.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,26 @@ class NonEmptyLazyListSuite extends NonEmptyCollectionSuite[LazyList, NonEmptyLa
199199

200200
(1 to 100).sum === sum
201201
}
202+
203+
test("NonEmptyLazyList#appendLazyList is properly lazy") {
204+
var evaluated = false
205+
val ll = { evaluated = true; 1 } #:: LazyList.empty
206+
val _ = NonEmptyLazyList(0).appendLazyList(ll)
207+
assert(!evaluated)
208+
}
209+
210+
test("NonEmptyLazyList#prependLazyList is properly lazy") {
211+
var evaluated = false
212+
val ll = { evaluated = true; 0 } #:: LazyList.empty
213+
val _ = NonEmptyLazyList(1).prependLazyList(ll)
214+
assert(!evaluated)
215+
}
216+
217+
test("NonEmptyLazyList.apply is properly lazy") {
218+
var evaluated = false
219+
val _ = NonEmptyLazyList({ evaluated = true; 0 }, Nil: _*)
220+
assert(!evaluated)
221+
}
202222
}
203223

204224
class ReducibleNonEmptyLazyListSuite extends ReducibleSuite[NonEmptyLazyList]("NonEmptyLazyList") {

0 commit comments

Comments
 (0)