diff --git a/README.md b/README.md index 0370383..335ea17 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Or you can just dump `bang.el` in your load path somewhere. * [!mapcat](#mapcat-fn-list) `(fn list)` * [!take-while](#take-while-fn-list) `(fn list)` * [!drop-while](#drop-while-fn-list) `(fn list)` +* [!split-with](#split-with-fn-list) `(fn list)` * [!interpose](#interpose-sep-list) `(sep list)` * [!replace-where](#replace-where-pred-rep-list) `(pred rep list)` * [!first](#first-fn-list) `(fn list)` @@ -184,6 +185,16 @@ Returns the tail of `list` starting from the first item for which (`fn` item) re (!!drop-while (< it 4) '(1 2 3 4 3 2 1)) ;; => '(4 3 2 1) ``` +### !split-with `(fn list)` + +Returns a list of ((!take-while `fn` `list`) (!drop-while `fn` `list`)) + +```cl +(!split-with 'even? '(1 2 3 4)) ;; => '(nil (1 2 3 4)) +(!split-with 'even? '(2 4 5 6)) ;; => '((2 4) (5 6)) +(!!split-with (< it 4) '(1 2 3 4 3 2 1)) ;; => '((1 2 3) (4 3 2 1)) +``` + ### !interpose `(sep list)` Returns a new list of all elements in `list` separated by `sep`. diff --git a/bang.el b/bang.el index 0cd4c0f..2b96b29 100644 --- a/bang.el +++ b/bang.el @@ -171,6 +171,15 @@ Thus function FN should return a collection." "Returns the tail of LIST starting from the first item for which (FN item) returns nil." (!!drop-while (funcall fn it) list)) +(defmacro !!split-with (form list) + "Anaphoric form of `!split-with'." + `(list (!!take-while ,form ,list) + (!!drop-while ,form ,list))) + +(defun !split-with (fn list) + "Returns a list of ((!take-while FN LIST) (!drop-while FN LIST))" + (!!split-with (funcall fn it) list)) + (defun !interpose (sep list) "Returns a new list of all elements in LIST separated by SEP." (let (result) diff --git a/examples.el b/examples.el index c2578b3..8d4283d 100644 --- a/examples.el +++ b/examples.el @@ -68,6 +68,11 @@ (!drop-while 'even? '(2 4 5 6)) => '(5 6) (!!drop-while (< it 4) '(1 2 3 4 3 2 1)) => '(4 3 2 1)) +(defexamples !split-with + (!split-with 'even? '(1 2 3 4)) => '(() (1 2 3 4)) + (!split-with 'even? '(2 4 5 6)) => '((2 4) (5 6)) + (!!split-with (< it 4) '(1 2 3 4 3 2 1)) => '((1 2 3) (4 3 2 1))) + (defexamples !interpose (!interpose "-" '()) => '() (!interpose "-" '("a")) => '("a")