Compare commits

...

14 Commits

Author SHA1 Message Date
Ed Langley cf6e27440c fix: quickload systems 2023-07-15 14:25:53 -07:00
Ed Langley 3f4b9bddda fix: Update test.yml 2023-07-15 14:23:47 -07:00
Ed Langley 6795459b0e experiment: Update test.yml 2023-07-15 14:22:37 -07:00
Ed L eb928fce45 fix: make sure we're testing the right data-lens 2023-07-15 14:20:23 -07:00
Ed L 0728cb22fa fix: reorder definitions 2023-07-15 14:14:55 -07:00
Edward Langley e833e39e87 feat: calling and calling* 2023-07-15 10:27:36 -07:00
Edward Langley 40db934151 fix: export of-type 2023-07-15 10:23:23 -07:00
Edward Langley 2705341bb0 feat: add transform 2023-07-15 10:22:38 -07:00
Edward Langley 902adc1fe0 feat: add default return value to applicable-when 2023-07-15 10:18:21 -07:00
Edward Langley b7f020d352 feat: generalize transform-elt to sequences 2023-07-15 10:17:02 -07:00
Edward Langley ea7e56385c feat: add of-type to generate semipredicates 2023-07-15 10:11:11 -07:00
Edward Langley 98492358e3 chore: further shorten Github action workflow 2023-07-15 10:10:07 -07:00
Edward Langley 74bf33ca21 experiment: adjust workflow to test the system, not the test system 2023-07-15 10:08:14 -07:00
Edward Langley 893b10f81e feat(transducers): transducers are no longer in beta 2023-07-15 10:05:12 -07:00
5 changed files with 85 additions and 14 deletions
+6 -4
View File
@@ -58,11 +58,13 @@ jobs:
run: |
export PATH="$HOME/.nix-profile/bin:$PATH"
cd "$GITHUB_WORKSPACE"
ln -s "$GITHUB_WORKSPACE" "$HOME/quicklisp/local-projects"
sbcl --disable-debugger --no-userinit \
--load "$HOME/quicklisp/setup.lisp" \
--eval "(mapcar 'asdf:load-asd (directory \"*.asd\"))" \
--eval "(ql:quickload :data-lens/test)" \
--eval "(handler-case (asdf:test-system :data-lens/test) (error () (uiop:quit 42)))" \
--eval "(ql:quickload :data-lens/transducers/test)" \
--eval "(handler-case (asdf:test-system :data-lens/transducers/test) (error () (uiop:quit 43)))" \
--eval '(format *error-output* "~{~A~%~}" (asdf:registered-systems))' \
--eval "(handler-case (ql:quickload :data-lens) (error (c) (format t \"~a\" c) (uiop:quit 41)))" \
--eval "(handler-case (asdf:test-system :data-lens) (error (c) (format t \"~a\" c) (uiop:quit 42)))" \
--eval "(handler-case (ql:quickload :data-lens/transducers) (error (c) (format t \"~a\" c) (uiop:quit 43)))" \
--eval "(handler-case (asdf:test-system :data-lens/transducers) (error (c) (format t \"~a\" c) (uiop:quit 44)))" \
--quit
+9 -1
View File
@@ -32,7 +32,7 @@
:components ((:module "t"
:components ((:file "lens")))))
(asdf:defsystem #:data-lens/beta/transducers
(asdf:defsystem #:data-lens/transducers
:description #.(format nil "~@{~a~^ ~}"
"A collection of transducers to reduce stream-manipulation overhead")
:author "Edward Langley <el-cl@elangley.org>"
@@ -47,6 +47,14 @@
(:file "transducers")
(:file "lazy-sequence")))
(asdf:defsystem #:data-lens/beta/transducers
:description #.(format nil "~@{~a~^ ~}"
"A collection of transducers to reduce stream-manipulation overhead")
:author "Edward Langley <el-cl@elangley.org>"
:license "Apache v2"
:depends-on (:data-lens/transducers)
:in-order-to ((test-op (test-op :data-lens/transducers))))
(asdf:defsystem #:data-lens/transducers/test
:description "tests for the transducers"
:author "Edward Langley <el-cl@elangley.org>"
+31 -8
View File
@@ -115,11 +115,16 @@
(<= (length it)
len)))
(defun applicable-when (fun test)
(lambda (it)
(if (funcall test it)
(funcall fun it)
it)))
(defun applicable-when (fun test &optional (default nil default-p))
(if default-p
(lambda (it)
(if (funcall test it)
(funcall fun it)
default))
(lambda (it)
(if (funcall test it)
(funcall fun it)
it))))
(defmacro conj (&rest fns)
(let ((dat (gensym "dat")))
@@ -193,6 +198,11 @@
(alexandria:ends-with-subseq suffix
it))))
(defun of-type (type)
(lambda (it)
(when (typep it type)
it)))
(defun transform-head (fun)
(lambda (it)
(typecase it
@@ -220,9 +230,10 @@
(defun transform-elt (elt fun)
(lambda (it)
(append (subseq it 0 elt)
(list (funcall fun (nth elt it)))
(subseq it (1+ elt)))))
(concatenate (type-of it)
(subseq it 0 elt)
(list (funcall fun (elt it elt)))
(subseq it (1+ elt)))))
(defun key-transform (fun key-get key-set)
(lambda (it)
@@ -321,11 +332,23 @@
(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)
(funcall (functionalize ,fun) ,first-arg ,@args))))
(defmacro calling* (fun &rest args)
(alexandria:with-gensyms (last-arg)
`(lambda (,last-arg)
(funcall (functionalize ,fun) ,@args ,last-arg))))
(defmacro applying (fun &rest args)
(alexandria:with-gensyms (seq fsym)
`(let ((,fsym (functionalize ,fun)))
+2 -1
View File
@@ -20,7 +20,8 @@
#:maximizing #:zipping #:applying #:splice-elt
#:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #:
#: #:suffixp #:functionalize #:inc #:group-by #:keys
#:conj #:disj #:delay #:calling))
#:conj #:disj #:delay #:of-type #:transform #:calling*
#:calling))
(defpackage :data-lens.transducers.internals
(:use :cl)
+37
View File
@@ -84,6 +84,9 @@
(5am:is (equal 1
(funcall (data-lens:applicable-when '1+ (constantly nil))
1)))
(5am:is (equal "hi"
(funcall (data-lens:applicable-when '1+ (constantly nil) "hi")
1)))
(5am:is (equal 2
(funcall (data-lens:applicable-when '1+ (constantly t))
1))))
@@ -259,3 +262,37 @@
(5am:is (equalp #(1 2 3)
(funcall (data-lens:over '1+ :result-type 'vector)
#(0 1 2)))))
(5am:def-test transform-elt (:suite :data-lens.lens :depends-on (and functionalize))
(5am:is (equal '(1 1 2)
(funcall (data-lens:transform-elt 0 '1+)
'(0 1 2))))
(5am:is (equal '(0 2 2)
(funcall (data-lens:transform-elt 1 '1+)
'(0 1 2))))
(5am:is (equalp #(0 1 3)
(funcall (data-lens:transform-elt 2 '1+)
(vector 0 1 2))))
(5am:is (equal "Abc"
(funcall (data-lens:transform-elt 0 'char-upcase)
"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))))
(5am:def-test calling (:suite :data-lens.lens :depends-on (and functionalize))
(5am:is (equal (funcall (data-lens:calling #'- 1) 3)
2))
(5am:is (equal (funcall (data-lens:calling #'- 2 1) 3)
0)))
(5am:def-test calling* (:suite :data-lens.lens :depends-on (and functionalize))
(5am:is (equal (funcall (data-lens:calling* #'- 3) 1)
2))
(5am:is (equal (funcall (data-lens:calling* #'- 3 2) 1)
0)))