llibra avatar llibra committed cd1b279

Comments (0)

Files changed (3)

               `(progn ,form (sequentially-apply ,next ,@body)))))
       form))
 
+(defmacro -> (x &rest rest)
+  (if rest
+      (destructuring-bind (first . rest) rest
+        (if rest
+            `(-> (-> ,x ,first) ,@rest)
+            (if (consp first)
+                `(,(car first) ,x ,@(cdr first))
+                `(,first ,x))))
+      x))
+
+(defmacro ->> (x &rest rest)
+  (if rest
+      (destructuring-bind (first . rest) rest
+        (if rest
+            `(->> (->> ,x ,first) ,@rest)
+            (if (consp first)
+                `(,(car first) ,@(cdr first) ,x)
+                `(,first ,x))))
+      x))
+
 (in-package :cl-fn.flip)
 
 (defun flip (fn x y)
 
 (defpackage :cl-fn.sapply
   (:use :cl)
-  (:export :sequentially-apply))
+  (:export :sequentially-apply :-> :->>))
 
 (defpackage :cl-fn.flip
   (:use :cl)
   (:use :cl :cl-fn.fn :cl-fn.alias :cl-fn.comp :cl-fn.pa :cl-fn.sapply
         :cl-fn.flip)
   (:export :fn :defalias :compose :conjoin :disjoin :curry :rcurry
-           :sequentially-apply :flip))
+           :sequentially-apply :-> :->> :flip))
   (5am:is (equal '(0 1)
                  (sequentially-apply (values 0 1)
                    (list _ _)))))
+
+(5am:test sapply/->
+  (5am:is (eq t (-> t)))
+  (5am:is (= 0 (-> 0)))
+  (5am:is (eq t (-> (values t))))
+  (5am:is (eq t (-> t (identity))))
+  (5am:is (= 0 (-> 0 (identity))))
+  (5am:is (= 2 (-> 0 (1+) (1+))))
+  (5am:is (= -8 (-> 1 (- 5) (* 2))))
+  (5am:is (= 2 (-> '(1 2 3) (elt 1)))))
+
+(5am:test sapply/->>
+  (5am:is (eq t (->> t)))
+  (5am:is (= 0 (->> 0)))
+  (5am:is (eq t (->> (values t))))
+  (5am:is (eq t (->> t (identity))))
+  (5am:is (= 0 (->> 0 (identity))))
+  (5am:is (= 2 (->> 0 (1+) (1+))))
+  (5am:is (= 8 (->> 1 (- 5) (* 2))))
+  (5am:is (= 6 (->> '(1 2 3) (reduce #'+)))))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.