From 86fc10993a4f2be9f13a229f7f6a27f2192cfff9 Mon Sep 17 00:00:00 2001 From: Nicolas Petton Date: Sun, 14 Feb 2016 14:50:15 +0100 Subject: [PATCH] update stream.el to the latest version * packages/stream/stream.el: * packages/stream/tests/stream-tests.el: Add latest changes from the github repository. --- packages/stream/stream.el | 30 +++++++++++++++++++++- packages/stream/tests/stream-tests.el | 37 +++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/packages/stream/stream.el b/packages/stream/stream.el index b03aa8afb..567a9e354 100644 --- a/packages/stream/stream.el +++ b/packages/stream/stream.el @@ -113,6 +113,17 @@ The sequence starts at POS if non-nil, 1 otherwise." (char-after (point))))) (stream buffer (1+ pos))))) +(declare-function iter-next "generator") + +(defun stream-from-iterator (iterator) + "Return a stream generating new elements through ITERATOR. +ITERATOR is an iterator object in terms of the \"generator\" +package." + (stream-make + (condition-case nil + (cons (iter-next iterator) (stream-from-iterator iterator)) + (iter-end-of-sequence nil)))) + (defun stream-regexp (buffer regexp) (stream-make (let (match) @@ -137,7 +148,8 @@ range is infinite." (defun streamp (stream) "Return non-nil if STREAM is a stream, nil otherwise." - (eq (car-safe stream) stream--identifier)) + (and (consp stream) + (eq (car stream) stream--identifier))) (defun stream-empty () "Return an empty stream." @@ -156,6 +168,22 @@ range is infinite." (or (cdr (thunk-force (cadr stream))) (stream-empty))) +(defun stream-append (&rest streams) + "Concatenate the STREAMS. +Requesting elements from the resulting stream will request the +elements in the STREAMS in order." + (if (null streams) + (stream-empty) + (stream-make + (let ((first (pop streams))) + (while (and (stream-empty-p first) streams) + (setq first (pop streams))) + (if (stream-empty-p first) + nil + (cons (stream-first first) + (if streams (apply #'stream-append (stream-rest first) streams) + (stream-rest first)))))))) + (defmacro stream-pop (stream) "Return the first element of STREAM and set the value of STREAM to its rest." (unless (symbolp stream) diff --git a/packages/stream/tests/stream-tests.el b/packages/stream/tests/stream-tests.el index 199720209..88edf918c 100644 --- a/packages/stream/tests/stream-tests.el +++ b/packages/stream/tests/stream-tests.el @@ -52,6 +52,35 @@ (should (= 4 (stream-first (stream-rest (stream-range 3))))) (should (= 5 (stream-first (stream-rest (stream-rest (stream-range 3))))))) +(ert-deftest stream-from-iterator-test () + (skip-unless (require 'generator nil t)) + (should (equal '(1 2) + (seq-into-sequence + (stream-from-iterator + (funcall (iter-lambda () + (iter-yield 1) + (iter-yield 2)))))))) + +(ert-deftest stream-append-test () + (should (stream-empty-p (stream-append))) + (should (let ((list '(1 2))) + (equal list (seq-into-sequence (stream-append (stream list)))))) + (should (= (seq-elt (stream-append + (stream (list 0 1)) + (stream-range 2)) + 4) + 4)) + (should (let ((stream (stream (list 0)))) + (and (= (seq-elt (stream-append stream (stream-range 1)) 10) + 10) + (stream-empty-p (stream-rest stream))))) + (should (equal (seq-into-sequence + (stream-append + (stream '(1)) + (stream '()) + (stream '(2 3)))) + '(1 2 3)))) + (ert-deftest stream-seqp-test () (should (seqp (stream-range)))) @@ -175,5 +204,13 @@ (seq-map #'identity stream) (should-not consumed))) +(ert-deftest stream-pop-test () + (let* ((str (stream '(1 2 3))) + (first (stream-pop str)) + (stream-empty (stream-empty))) + (should (= 1 first)) + (should (= 2 (stream-first str))) + (should (null (stream-pop stream-empty))))) + (provide 'stream-tests) ;;; stream-tests.el ends here -- 2.39.2