mirror of
https://github.com/fiddlerwoaroof/data-lens.git
synced 2025-11-08 10:16:32 +00:00
chore(transducers): move functions around
This commit is contained in:
@ -22,12 +22,14 @@
|
|||||||
|
|
||||||
(defpackage :data-lens.transducers.internals
|
(defpackage :data-lens.transducers.internals
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:export #:unwrap #:init #:reduce-generic #:stepper))
|
(:export #:unwrap #:init #:reduce-generic #:stepper #:transduce
|
||||||
|
#:exit-early))
|
||||||
|
|
||||||
(defpackage :data-lens.transducers
|
(defpackage :data-lens.transducers
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:import-from :data-lens.transducers.internals
|
(:import-from :data-lens.transducers.internals
|
||||||
#:unwrap #:init #:reduce-generic #:stepper)
|
#:unwrap #:init #:reduce-generic #:stepper #:transduce
|
||||||
|
#:exit-early)
|
||||||
(:export #:mapping :filtering :deduping :catting :splitting
|
(:export #:mapping :filtering :deduping :catting :splitting
|
||||||
#:exit-early :taking :dropping :transduce
|
#:exit-early :taking :dropping :transduce
|
||||||
#:hash-table-builder :vector-builder :list-builder
|
#:hash-table-builder :vector-builder :list-builder
|
||||||
|
|||||||
@ -1,10 +1,5 @@
|
|||||||
(in-package :data-lens.transducers.internals)
|
(in-package :data-lens.transducers.internals)
|
||||||
|
|
||||||
(defgeneric unwrap (it obj)
|
|
||||||
(:method (it obj) obj))
|
|
||||||
(defgeneric init (it))
|
|
||||||
(defgeneric stepper (it))
|
|
||||||
|
|
||||||
(defgeneric reduce-generic (seq func init)
|
(defgeneric reduce-generic (seq func init)
|
||||||
(:method ((seq sequence) (func function) init)
|
(:method ((seq sequence) (func function) init)
|
||||||
(reduce func seq :initial-value init))
|
(reduce func seq :initial-value init))
|
||||||
@ -20,3 +15,34 @@
|
|||||||
(setf acc (funcall func acc (list k v))))
|
(setf acc (funcall func acc (list k v))))
|
||||||
seq)
|
seq)
|
||||||
acc)))
|
acc)))
|
||||||
|
|
||||||
|
(defgeneric init (client))
|
||||||
|
(defgeneric stepper (client))
|
||||||
|
(defgeneric unwrap (client obj)
|
||||||
|
(:method (client obj) obj))
|
||||||
|
|
||||||
|
(defun exit-early (acc)
|
||||||
|
(throw 'done acc))
|
||||||
|
|
||||||
|
(defun transduce (xf build seq)
|
||||||
|
(let* ((xf (etypecase xf
|
||||||
|
(list (apply 'alexandria:compose xf))
|
||||||
|
((or function symbol) xf)))
|
||||||
|
(transducer (funcall xf (stepper build))))
|
||||||
|
(unwrap build
|
||||||
|
(funcall transducer
|
||||||
|
(catch 'done
|
||||||
|
(reduce-generic seq
|
||||||
|
transducer
|
||||||
|
(init build)))))))
|
||||||
|
|
||||||
|
#+(or)
|
||||||
|
(defdocumentation transducer-protocol
|
||||||
|
(:function transduce (xf build seq)
|
||||||
|
)
|
||||||
|
(:generic-function unwrap (client obj)
|
||||||
|
)
|
||||||
|
(:generic-function unwrap (client obj)
|
||||||
|
)
|
||||||
|
(:generic-function unwrap (client obj)
|
||||||
|
))
|
||||||
|
|||||||
@ -116,9 +116,6 @@
|
|||||||
(let ((splitter (apply #'data-lens:juxt functions)))
|
(let ((splitter (apply #'data-lens:juxt functions)))
|
||||||
(mapping splitter)))
|
(mapping splitter)))
|
||||||
|
|
||||||
(defun exit-early (acc)
|
|
||||||
(throw 'done acc))
|
|
||||||
|
|
||||||
(defun taking (n)
|
(defun taking (n)
|
||||||
(lambda (rf)
|
(lambda (rf)
|
||||||
(let ((taken 0))
|
(let ((taken 0))
|
||||||
@ -141,17 +138,6 @@
|
|||||||
(funcall rf acc next)))
|
(funcall rf acc next)))
|
||||||
((it) (funcall rf it))))))
|
((it) (funcall rf it))))))
|
||||||
|
|
||||||
(defun transduce (xf build seq)
|
|
||||||
(let* ((xf (etypecase xf
|
|
||||||
(list (apply 'alexandria:compose xf))
|
|
||||||
((or function symbol) xf)))
|
|
||||||
(transducer (funcall xf (stepper build))))
|
|
||||||
(unwrap build
|
|
||||||
(funcall transducer
|
|
||||||
(catch 'done
|
|
||||||
(reduce-generic seq
|
|
||||||
transducer
|
|
||||||
(init build)))))))
|
|
||||||
(defun eduction (xf seq)
|
(defun eduction (xf seq)
|
||||||
(lambda (build)
|
(lambda (build)
|
||||||
(unwrap
|
(unwrap
|
||||||
|
|||||||
Reference in New Issue
Block a user