From bd1882ec7d7950f33adc6608fb5f1df8410f3607 Mon Sep 17 00:00:00 2001 From: Ed Langley Date: Mon, 31 Dec 2018 04:27:07 -0800 Subject: [PATCH] Add functions for transforming arbitrary elements and applying functions --- .gitignore | 2 ++ lens.lisp | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index be303db..85fda65 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ *.fasl +*.*x*fsl +*~ diff --git a/lens.lisp b/lens.lisp index 9aa5d47..c65829d 100644 --- a/lens.lisp +++ b/lens.lisp @@ -20,7 +20,9 @@ #:of-max-length #:transform-head #:maximizing - #:zipping)) + #:zipping + #:applying + #:transform-elt)) (in-package :data-lens) (declaim @@ -163,6 +165,12 @@ (list* (car it) (funcall fun (cdr it))))) +(defun-ct transform-elt (elt fun) + (lambda (it) + (append (subseq it 0 elt) + (funcall fun (nth elt it)) + (subseq it (1+ elt))))) + (defun-ct key-transform (fun key-get key-set) (lambda (it) (let ((key-val (funcall key-get it))) @@ -214,6 +222,11 @@ (lambda (seq) (map result-type fun seq))) +(defmacro applying (fun &rest args) + (alexandria:with-gensyms (seq) + `(lambda (,seq) + (apply ,fun ,@args ,seq)))) + (defun-ct on (fun key) (lambda (it) (funcall fun (funcall key it))))