emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/stream 5762f78 21/36: Pinpoint semantics of `seq-subseq


From: Stefan Monnier
Subject: [elpa] externals/stream 5762f78 21/36: Pinpoint semantics of `seq-subseq's implementation for streams
Date: Tue, 1 Dec 2020 17:22:51 -0500 (EST)

branch: externals/stream
commit 5762f78988471c41a82bdbc2b30f54fb1f9e601e
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>

    Pinpoint semantics of `seq-subseq's implementation for streams
    
    - Make argument END optional.
    
    - Forbid negative index arguments.
    
    - Add tests.
---
 stream.el             | 15 +++++++++++++--
 tests/stream-tests.el | 10 ++++++++--
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/stream.el b/stream.el
index 8c156f1..9954fc8 100644
--- a/stream.el
+++ b/stream.el
@@ -229,8 +229,19 @@ This function will eagerly consume the entire stream."
       (setq stream (stream-rest stream)))
     len))
 
-(cl-defmethod seq-subseq ((stream stream) start end)
-  (seq-take (seq-drop stream start) (- end start)))
+(cl-defmethod seq-subseq ((stream stream) start &optional end)
+  "Return a stream of elements of STREAM from START to END.
+
+END is exclusive.  If END is omitted, include all elements from
+START on.  Both START and END must be non-negative.  Since
+streams are a delayed type of sequences, don't signal an error if
+START or END are larger than the number of elements (the returned
+stream will simply be accordingly shorter, or even empty)."
+  (when (or (< start 0) (and end (< end 0)))
+    (error "seq-subseq: only non-negative indexes allowed for streams"))
+  (let ((stream-from-start (seq-drop stream start)))
+    (if end (seq-take stream-from-start (- end start))
+      stream-from-start)))
 
 (cl-defmethod seq-into-sequence ((stream stream))
   "Convert STREAM into a sequence."
diff --git a/tests/stream-tests.el b/tests/stream-tests.el
index 16b5756..31c3530 100644
--- a/tests/stream-tests.el
+++ b/tests/stream-tests.el
@@ -112,8 +112,14 @@
     (should (stream-empty-p (stream-rest (stream-rest rest))))))
 
 (ert-deftest stream-seq-subseq-test ()
-  ;; TODO
-  )
+  (should (equal (seq-into (seq-subseq (stream (list 0 1 2 3 4)) 1 3) 'list)
+                           (seq-subseq         (list 0 1 2 3 4)  1 3)))
+  (should (= (stream-first (seq-subseq (stream-range 0) 5))
+             5))
+  (should (= (stream-first (seq-subseq (seq-subseq (stream-range 0) 5) 5))
+             10))
+
+  (should-error (seq-subseq (stream-range 0) -1)))
 
 (ert-deftest stream-seq-into-test ()
   (should (streamp (seq-into (stream-empty) 'stream)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]