Compare commits

..

4 Commits

Author SHA1 Message Date
274af53a09 Merge remote-tracking branch 'origin/master' 2023-10-22 11:19:08 -07:00
11c6fbe12d feat: add x-group 2023-10-22 11:16:36 -07:00
989454fc28 feat: add hash-join 2023-10-22 11:15:22 -07:00
2207631122 feat: add tap 2023-10-22 11:15:02 -07:00
2 changed files with 31 additions and 1 deletions

View File

@ -179,6 +179,11 @@
(lambda (seq) (lambda (seq)
(map 'list selector seq))) (map 'list selector seq)))
(defun tap (cb)
(lambda (it)
(prog1 it
(funcall cb it))))
(defun slice (start &optional end) (defun slice (start &optional end)
(lambda (it) (lambda (it)
(subseq it start end))) (subseq it start end)))
@ -418,6 +423,31 @@
(reverse (cdr it)))) (reverse (cdr it))))
(alexandria:hash-table-alist groups))))) (alexandria:hash-table-alist groups)))))
(defun x-group (fn)
(lambda (groups)
(loop for (key . group) in groups
collect (funcall fn key group))))
(defun hash-join (probe join-fn &key (test 'eql) (key 'car))
(let* ((lookup (make-hash-table :test test :size (length probe)))
(lookup-fn (functionalize lookup)))
(map nil
(lambda (it)
(setf (gethash (funcall key it)
lookup)
it))
probe)
(lambda (collection)
(map (etypecase collection
(list 'list)
(vector 'vector)
(sequence 'list))
(lambda (it)
(let* ((key-value (funcall key it))
(matching-probe (funcall lookup-fn key-value)))
(funcall join-fn it matching-probe)))
collection))))
#+nil #+nil
(defmacro <> (arity &rest funs) (defmacro <> (arity &rest funs)
(let ((arg-syms (loop repeat arity collect (gensym)))) (let ((arg-syms (loop repeat arity collect (gensym))))

View File

@ -21,7 +21,7 @@
#:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #: #:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #:
#: #:suffixp #:functionalize #:inc #:group-by #:keys #: #:suffixp #:functionalize #:inc #:group-by #:keys
#:conj #:disj #:delay #:of-type #:transform #:calling* #:conj #:disj #:delay #:of-type #:transform #:calling*
#:calling)) #:calling #:hash-join #:tap #:x-group))
(defpackage :data-lens.transducers.internals (defpackage :data-lens.transducers.internals
(:use :cl) (:use :cl)