From 2705341bb04693e388c79c106aa1f15a3a371eee Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Sat, 15 Jul 2023 10:22:38 -0700 Subject: [PATCH] feat: add transform --- lens.lisp | 7 +++++++ package.lisp | 2 +- t/lens.lisp | 11 +++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lens.lisp b/lens.lisp index cf8aa7f..211cff3 100644 --- a/lens.lisp +++ b/lens.lisp @@ -332,6 +332,13 @@ (apply #'concatenate result-type seq))) +(defun transform (arg &rest args) + (if args + (lambda (fn) + (apply fn arg args)) + (lambda (fn) + (funcall fn arg)))) + (defmacro calling (fun &rest args) (alexandria:with-gensyms (first-arg) `(lambda (,first-arg) diff --git a/package.lisp b/package.lisp index 429bc53..0d769aa 100644 --- a/package.lisp +++ b/package.lisp @@ -20,7 +20,7 @@ #:maximizing #:zipping #:applying #:splice-elt #:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #:• #:∘ #:suffixp #:functionalize #:inc #:group-by #:keys - #:conj #:disj #:delay #:calling)) + #:conj #:disj #:delay #:transform)) (defpackage :data-lens.transducers.internals (:use :cl) diff --git a/t/lens.lisp b/t/lens.lisp index 9109590..73e30e1 100644 --- a/t/lens.lisp +++ b/t/lens.lisp @@ -275,5 +275,12 @@ (vector 0 1 2)))) (5am:is (equal "Abc" (funcall (data-lens:transform-elt 0 'char-upcase) - "abc"))) - ) + "abc")))) + +(5am:def-test transform (:suite :data-lens.lens :depends-on (and functionalize)) + (5am:is (equal (funcall (data-lens:transform 1) #'1+) + 2)) + + (5am:is (equal (funcall (data-lens:transform 1) + (data-lens:juxt '1- 'identity '1+)) + '(0 1 2))))