From 4e43bddd60752cfe509c6be08967c85c26639474 Mon Sep 17 00:00:00 2001 From: Joseph Silber Date: Wed, 22 Apr 2020 10:23:15 -0400 Subject: [PATCH 1/3] Add failing test for LazyCollection@until --- .../Support/SupportLazyCollectionIsLazyTest.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/Support/SupportLazyCollectionIsLazyTest.php b/tests/Support/SupportLazyCollectionIsLazyTest.php index b7216b1e6b5d..62a48ef05d8d 100644 --- a/tests/Support/SupportLazyCollectionIsLazyTest.php +++ b/tests/Support/SupportLazyCollectionIsLazyTest.php @@ -1100,6 +1100,23 @@ public function testUnlessNotEmptyIsLazy() }); } + public function testUntilIsLazy() + { + $this->assertDoesNotEnumerate(function ($collection) { + $collection->until(INF); + }); + + $this->assertEnumerates(10, function ($collection) { + $collection->until(10)->all(); + }); + + $this->assertEnumerates(10, function ($collection) { + $collection->until(function ($item) { + return $item === 10; + })->all(); + }); + } + public function testUnwrapEnumeratesOne() { $this->assertEnumeratesOnce(function ($collection) { From 0808c65350cc0cf3b09404729b5554abcf4dd4bd Mon Sep 17 00:00:00 2001 From: Joseph Silber Date: Wed, 22 Apr 2020 10:31:36 -0400 Subject: [PATCH 2/3] Add an "equality" function factory --- src/Illuminate/Support/Traits/EnumeratesValues.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Illuminate/Support/Traits/EnumeratesValues.php b/src/Illuminate/Support/Traits/EnumeratesValues.php index 4e08a14a35e0..20ff17b5965f 100644 --- a/src/Illuminate/Support/Traits/EnumeratesValues.php +++ b/src/Illuminate/Support/Traits/EnumeratesValues.php @@ -969,4 +969,17 @@ protected function valueRetriever($value) return data_get($item, $value); }; } + + /** + * Make a function to check an item's equality. + * + * @param \Closure|mixed $value + * @return \Closure + */ + protected function equality($value) + { + return function ($item) use ($value) { + return $item === $value; + }; + } } From 45656571c86c850dca5d78c2bd4acd59ba1ce86f Mon Sep 17 00:00:00 2001 From: Joseph Silber Date: Wed, 22 Apr 2020 10:31:53 -0400 Subject: [PATCH 3/3] Make LazyCollection@until actually be lazy --- src/Illuminate/Support/Collection.php | 11 ++++++++ src/Illuminate/Support/LazyCollection.php | 21 ++++++++++++++++ .../Support/Traits/EnumeratesValues.php | 25 ------------------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/Illuminate/Support/Collection.php b/src/Illuminate/Support/Collection.php index 3bf5978f2b8a..fd534fa52194 100644 --- a/src/Illuminate/Support/Collection.php +++ b/src/Illuminate/Support/Collection.php @@ -736,6 +736,17 @@ public function union($items) return new static($this->items + $this->getArrayableItems($items)); } + /** + * Take items in the collection until the given condition is met. + * + * @param mixed $key + * @return static + */ + public function until($value) + { + return new static($this->lazy()->until($value)->all()); + } + /** * Create a new collection consisting of every n-th element. * diff --git a/src/Illuminate/Support/LazyCollection.php b/src/Illuminate/Support/LazyCollection.php index 22830e7d1f38..2aa527732d9b 100644 --- a/src/Illuminate/Support/LazyCollection.php +++ b/src/Illuminate/Support/LazyCollection.php @@ -737,6 +737,27 @@ public function union($items) return $this->passthru('union', func_get_args()); } + /** + * Take items in the collection until the given condition is met. + * + * @param mixed $key + * @return static + */ + public function until($value) + { + $callback = $this->useAsCallable($value) ? $value : $this->equality($value); + + return new static(function () use ($callback) { + foreach ($this as $key => $item) { + if ($callback($item, $key)) { + break; + } + + yield $key => $item; + } + }); + } + /** * Create a new collection consisting of every n-th element. * diff --git a/src/Illuminate/Support/Traits/EnumeratesValues.php b/src/Illuminate/Support/Traits/EnumeratesValues.php index 20ff17b5965f..a8db94e9a17d 100644 --- a/src/Illuminate/Support/Traits/EnumeratesValues.php +++ b/src/Illuminate/Support/Traits/EnumeratesValues.php @@ -722,31 +722,6 @@ public function uniqueStrict($key = null) return $this->unique($key, true); } - /** - * Take items in the collection until condition is met. - * - * @param mixed $key - * @return static - */ - public function until($value) - { - $passed = []; - - $callback = $this->useAsCallable($value) ? $value : function ($item) use ($value) { - return $item === $value; - }; - - foreach ($this as $key => $item) { - if ($callback($item, $key)) { - break; - } - - $passed[$key] = $item; - } - - return new static($passed); - } - /** * Collect the values into a collection. *