From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.devel Subject: Re: Stream implementation of seq-mapn Date: Tue, 26 Dec 2017 23:09:04 +0100 Message-ID: <87wp19qgzj.fsf@web.de> References: <87lgi0fdt3.fsf@web.de> <87po7crzce.fsf@petton.fr> <87h8sofbd5.fsf@web.de> <87mv2grvqq.fsf@petton.fr> <87o9musw9p.fsf@web.de> <87o9mulsi3.fsf@petton.fr> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: blaine.gmane.org 1514326055 7064 195.159.176.226 (26 Dec 2017 22:07:35 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 26 Dec 2017 22:07:35 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) Cc: Stefan Monnier , Emacs Development To: Nicolas Petton Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Dec 26 23:07:30 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eTxNh-0001E0-0Y for ged-emacs-devel@m.gmane.org; Tue, 26 Dec 2017 23:07:29 +0100 Original-Received: from localhost ([::1]:59363 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eTxPc-0007kC-Lr for ged-emacs-devel@m.gmane.org; Tue, 26 Dec 2017 17:09:28 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:60632) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eTxPV-0007jg-3i for emacs-devel@gnu.org; Tue, 26 Dec 2017 17:09:22 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eTxPQ-0002UC-17 for emacs-devel@gnu.org; Tue, 26 Dec 2017 17:09:21 -0500 Original-Received: from mout.web.de ([212.227.15.3]:59307) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eTxPP-0002TG-Lk for emacs-devel@gnu.org; Tue, 26 Dec 2017 17:09:15 -0500 Original-Received: from drachen.dragon ([88.74.120.211]) by smtp.web.de (mrweb004 [213.165.67.108]) with ESMTPSA (Nemesis) id 0Mh7qL-1eGyzz1D8r-00MMmn; Tue, 26 Dec 2017 23:09:06 +0100 In-Reply-To: <87o9mulsi3.fsf@petton.fr> (Nicolas Petton's message of "Tue, 19 Dec 2017 15:08:52 +0100") X-Provags-ID: V03:K0:x+XeM9INMADkwtZOkI7wxkdA3yi8H8SGiQW3Hj8Wvz/IoNTVbgZ 2rekxLkVl6qPX4iv5JiOI/eZnsUAhpMu9kNsBzlEuYvuUEPVQPG6DB9HuRVdlemNlOBWnEb TROPmDXZZvUUxRLlSrgEa4qX3RbJJs3lcK3NGHXPyTC2yiQw2y4KOELi5yjciEXGucHXEdl xNZiebxG5yy1QWD+w1+8A== X-UI-Out-Filterresults: notjunk:1;V01:K0:1e4eadxPAhc=:TuDFQCs/X+03Fxlv43cQby E4sZrGRI1EcyHUcl0ZDSQVDDcQJwcR3Rjp9Blr5fomwVyiQdo2UuM8kHRwvJ3jbv4M9d1nzBQ A7iPB9tws3I58m4nSusdsIfHLXJESMArQdXFMKTG9CQbeUNjIAjLXzTUeqACrZiqT0eBUtupt aUh5q5NOQqxFW1ZC5YCU4z328m30q9vBtLXgGXWNwtWfukulow6PTfqHUnVOprCp+w0wRYNWw 9UuR2d0qvRqBBE55MSkOMuJwmmtcyTpz+69MaHurJDPpVZbvmT9XLcOV1cGwmvWS66YKk/2Yk PIeRshrhRh9J+jb3JKWUWqq0/q+ISO2MVpv2jzqoqpYyXzdZDs3o920kOejv69Vb/oSPN0Dkl yHTbXL8baPNZ1lO4UhRZ2x/kj+xHAtHXFnJlJQclIyBHc4H7qayiG28VBv/ZdWSScJ7yv2lKa JXXyoUrj8SmiGXOLicb225cNxsZC0c7sA3GBcED+Ea6VJOf66vY/dkTa+G1S5nPqaHZkM6+Ls ACvY7DshaDRfTO3rc+bAArX77xVYatjDukYmZDonhZtZ1By9KyCHjNBChddH7O2hKMhL7ugmF aChs0Om6W7ivjKqsUSkTT6OiqePCXvBIw52cC2evwmVct/Ydncke8tFF2FdcRDg7v7NzS0Gwu MhrQ1kHt6sIswkuy+Cuv+bqWlLbf80e3NP3DjHNkBEbAbS0rHsN8/M/Km6HYnwBUHmzz/YZHO nGJnoJdb4x09UOJFd/X/ElpI4vF0gJd2CSJ+y/vAAfzbDgbVEauMVoVxf/nZ681P/jEhpjxe X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.15.3 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:221431 Archived-At: --=-=-= Content-Type: text/plain Hello, I uploaded a slightly tweaked version and added regression tests (but didn't bump the package version). I also reported the method signature problem as "bug#29786: 27.0.50; About the argument list of methods". Unanswered until now, so the generated help for the method still looks weird. For completeness, here is what I committed: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Implement-seq-mapn-method-for-streams.patch >From 93e9009c827bc5b0f67c683a4e1748c90c6e4686 Mon Sep 17 00:00:00 2001 From: Michael Heerdegen Date: Mon, 18 Dec 2017 12:49:38 +0100 Subject: [PATCH] Implement `seq-mapn' method for streams * stream/stream.el (seq-mapn): New method. * stream/tests/stream-tests.el (stream-seq-mapn-test): New test. And add a `deftest-for-delayed-evaluation'. --- packages/stream/stream.el | 22 ++++++++++++++++++++++ packages/stream/tests/stream-tests.el | 15 +++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/stream/stream.el b/packages/stream/stream.el index b412807e2..3f6bc4b5b 100644 --- a/packages/stream/stream.el +++ b/packages/stream/stream.el @@ -321,6 +321,28 @@ applications of FUNCTION on each element of STREAM in succession." (cons (funcall function (stream-first stream)) (seq-map function (stream-rest stream)))))) +(cl-defmethod seq-mapn (function (stream stream) &rest streams) + "Map FUNCTION over the STREAMS. + +Example: this prints the first ten Fibonacci numbers: + + (letrec ((fibs (stream-cons + 1 + (stream-cons + 1 + (seq-mapn #'+ fibs (stream-rest fibs)))))) + (seq-do #'print (seq-take fibs 10))) + +\(fn FUNCTION STREAMS...)" + (if (not (seq-every-p #'streamp streams)) + (cl-call-next-method) + (cl-labels ((do-mapn (f streams) + (stream-make + (unless (seq-some #'stream-empty-p streams) + (cons (apply f (mapcar #'stream-first streams)) + (do-mapn f (mapcar #'stream-rest streams))))))) + (do-mapn function (cons stream streams))))) + (cl-defmethod seq-do (function (stream stream)) "Evaluate FUNCTION for each element of STREAM eagerly, and return nil. diff --git a/packages/stream/tests/stream-tests.el b/packages/stream/tests/stream-tests.el index decf3ad47..896c72993 100644 --- a/packages/stream/tests/stream-tests.el +++ b/packages/stream/tests/stream-tests.el @@ -166,6 +166,18 @@ (should (= -1 (stream-first (seq-map #'- (stream-range 1))))) (should (= -2 (stream-first (stream-rest (seq-map #'- (stream-range 1))))))) +(ert-deftest stream-seq-mapn-test () + (should (streamp (seq-mapn #'+ (stream (list 1 2 3)) (stream (list 4 5 6))))) + (should (not (streamp (seq-mapn #'+ (stream (list 1 2 3)) (stream (list 4 5 6)) (list 7 8 9))))) + (should (= 2 (seq-length (seq-mapn #'+ (stream (list 1 2 3)) (stream (list 4 5)))))) + (should (equal (letrec ((fibs (stream-cons + 1 + (stream-cons + 1 + (seq-mapn #'+ fibs (stream-rest fibs)))))) + (seq-into (seq-take fibs 10) 'list)) + '(1 1 2 3 5 8 13 21 34 55)))) + (ert-deftest stream-seq-do-test () (let ((result '())) (seq-do @@ -292,6 +304,9 @@ (deftest-for-delayed-evaluation (seq-drop (make-delayed-test-stream) 2)) (deftest-for-delayed-evaluation (seq-take-while #'numberp (make-delayed-test-stream))) (deftest-for-delayed-evaluation (seq-map #'identity (make-delayed-test-stream))) +(deftest-for-delayed-evaluation (seq-mapn #'cons + (make-delayed-test-stream) + (make-delayed-test-stream))) (deftest-for-delayed-evaluation (seq-filter #'cl-evenp (make-delayed-test-stream))) (deftest-for-delayed-evaluation (stream-delay (make-delayed-test-stream))) (deftest-for-delayed-evaluation (seq-copy (make-delayed-test-stream))) -- 2.15.1 --=-=-= Content-Type: text/plain Thanks, Michael. --=-=-=--