[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/dash d948086 315/426: Add -iteratefn
From: |
Phillip Lord |
Subject: |
[elpa] externals/dash d948086 315/426: Add -iteratefn |
Date: |
Tue, 04 Aug 2015 19:38:32 +0000 |
branch: externals/dash
commit d94808670f673a7d2861a0ceb6caa6a045e3e67e
Author: Matus Goljer <address@hidden>
Commit: Matus Goljer <address@hidden>
Add -iteratefn
---
README.md | 22 ++++++++++++++++++++++
dash-functional.el | 17 ++++++++++++++++-
dev/examples.el | 13 +++++++++++++
3 files changed, 51 insertions(+), 1 deletions(-)
diff --git a/README.md b/README.md
index ac54f94..1af9122 100644
--- a/README.md
+++ b/README.md
@@ -198,6 +198,7 @@ These combinators require Emacs 24 for its lexical scope.
So they are offered in
* [-not](#-not-pred) `(pred)`
* [-orfn](#-orfn-rest-preds) `(&rest preds)`
* [-andfn](#-andfn-rest-preds) `(&rest preds)`
+* [-iteratefn](#-iteratefn-fn-n) `(fn n)`
## Anaphoric functions
@@ -1665,6 +1666,27 @@ In types: [a -> Bool] -> a -> Bool
(-filter (-andfn (-not 'even?) (-cut >= 5 <>)) '(1 2 3 4 5 6 7 8 9 10)) ;; =>
'(1 3 5)
```
+#### -iteratefn `(fn n)`
+
+Return a function `fn` composed `n` times with itself.
+
+`fn` is a unary function. If you need to use a function of higher
+arity, use `-applify` first to turn it into an unary function.
+
+With n = 0, this acts as identity function.
+
+In types: (a -> a) -> Int -> a -> a.
+
+This function satisfies the following law:
+
+ (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init (1+ n))).
+
+```cl
+(funcall (-iteratefn (lambda (x) (* x x)) 3) 2) ;; => 256
+(funcall (-iteratefn '1+ 3) 1) ;; => 4
+(funcall (-iteratefn 'cdr 3) '(1 2 3 4 5)) ;; => '(4 5)
+```
+
## Contribute
diff --git a/dash-functional.el b/dash-functional.el
index 4a00720..bd77519 100644
--- a/dash-functional.el
+++ b/dash-functional.el
@@ -60,7 +60,7 @@ each fn to the result of applying the previous fn to
the arguments (right-to-left)."
(lambda (&rest args)
(car (-reduce-r-from (lambda (fn xs) (list (apply fn xs)))
- args fns))))
+ args fns))))
(defun -applify (fn)
"Changes an n-arity function FN to a 1-arity function that
@@ -120,6 +120,21 @@ PREDS returns non-nil on x.
In types: [a -> Bool] -> a -> Bool"
(lambda (x) (-all? (-cut funcall <> x) preds)))
+(defun -iteratefn (fn n)
+ "Return a function FN composed N times with itself.
+
+FN is a unary function. If you need to use a function of higher
+arity, use `-applify' first to turn it into an unary function.
+
+With n = 0, this acts as identity function.
+
+In types: (a -> a) -> Int -> a -> a.
+
+This function satisfies the following law:
+
+ (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init (1+ n)))."
+ (lambda (x) (--dotimes n (setq x (funcall fn x))) x))
+
(provide 'dash-functional)
;;; dash-functional.el ends here
diff --git a/dev/examples.el b/dev/examples.el
index aabd343..220e846 100644
--- a/dev/examples.el
+++ b/dev/examples.el
@@ -712,4 +712,17 @@
(funcall (-andfn (-cut < <> 10) 'even?) 6) => t
(funcall (-andfn (-cut < <> 10) 'even?) 12) => nil
(-filter (-andfn (-not 'even?) (-cut >= 5 <>)) '(1 2 3 4 5 6 7 8 9 10))
=> '(1 3 5))
+
+ (defexamples -iteratefn
+ (funcall (-iteratefn (lambda (x) (* x x)) 3) 2) => 256
+ (funcall (-iteratefn '1+ 3) 1) => 4
+ (funcall (-iteratefn 'cdr 3) '(1 2 3 4 5)) => '(4 5)
+ (let ((init '(1 2 3 4 5))
+ (fn 'cdr))
+ (and (equal (funcall (-iteratefn fn 0) init)
+ (-last-item (-iterate fn init (1+ 0))))
+ (equal (funcall (-iteratefn fn 3) init)
+ (-last-item (-iterate fn init (1+ 3))))
+ (equal (funcall (-iteratefn fn 5) init)
+ (-last-item (-iterate fn init (1+ 5)))))))
))
- [elpa] externals/dash f86d235 268/426: Fix -cons*, (continued)
- [elpa] externals/dash f86d235 268/426: Fix -cons*, Phillip Lord, 2015/08/04
- [elpa] externals/dash 3eb91fe 280/426: Add `-find-last-index`, Phillip Lord, 2015/08/04
- [elpa] externals/dash ec9afcb 255/426: Merge pull request #54 from Fuco1/index/modify, Phillip Lord, 2015/08/04
- [elpa] externals/dash 930b390 278/426: Add -list function., Phillip Lord, 2015/08/04
- [elpa] externals/dash adaeff7 274/426: Merge pull request #65 from rejeep/same-items-predicate, Phillip Lord, 2015/08/04
- [elpa] externals/dash e6cae0b 279/426: Merge pull request #68 from rejeep/list-function, Phillip Lord, 2015/08/04
- [elpa] externals/dash f18a520 326/426: Release 2.7.0, Phillip Lord, 2015/08/04
- [elpa] externals/dash 7eb8307 283/426: Merge pull request #71 from Fuco1/find-last-index, Phillip Lord, 2015/08/04
- [elpa] externals/dash 7f0fadc 317/426: Add -prodfn, Phillip Lord, 2015/08/04
- [elpa] externals/dash 960b05f 276/426: Set -each, -each-while and -dotimes indent levels to 1., Phillip Lord, 2015/08/04
- [elpa] externals/dash d948086 315/426: Add -iteratefn,
Phillip Lord <=
- [elpa] externals/dash a09a4b2 318/426: Add code markup for docstrings and fix erroneous whitespace in docstring, Phillip Lord, 2015/08/04
- [elpa] externals/dash 38307e3 223/426: Partition docs, Phillip Lord, 2015/08/04
- [elpa] externals/dash f3b0a55 321/426: Change -predicate-p examples to -predicate? to maintain consistency, Phillip Lord, 2015/08/04
- [elpa] externals/dash 7e4adb5 319/426: Add missing keywords to highlight list, Phillip Lord, 2015/08/04
- [elpa] externals/dash 2ecc073 316/426: Reorder the partition examples to follow more logical order, add tests, Phillip Lord, 2015/08/04
- [elpa] externals/dash eea928a 320/426: Add -replace, Phillip Lord, 2015/08/04
- [elpa] externals/dash d9879e9 329/426: Release 2.8.0, Phillip Lord, 2015/08/04
- [elpa] externals/dash f8873a0 327/426: Update readme-template with changes from last release, Phillip Lord, 2015/08/04
- [elpa] externals/dash 25c114c 330/426: Implementing a shallow copy counterpart to -clone., Phillip Lord, 2015/08/04
- [elpa] externals/dash f257fb9 328/426: Add -butlast, Phillip Lord, 2015/08/04