diff --git a/package.lisp b/package.lisp index 78045fa..560205a 100644 --- a/package.lisp +++ b/package.lisp @@ -22,12 +22,14 @@ (defpackage :data-lens.transducers.internals (:use :cl) - (:export #:unwrap #:init #:reduce-generic #:stepper)) + (:export #:unwrap #:init #:reduce-generic #:stepper #:transduce + #:exit-early)) (defpackage :data-lens.transducers (:use :cl) (: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 #:exit-early :taking :dropping :transduce #:hash-table-builder :vector-builder :list-builder diff --git a/transducer-protocol.lisp b/transducer-protocol.lisp index 20353c6..b9872bd 100644 --- a/transducer-protocol.lisp +++ b/transducer-protocol.lisp @@ -1,10 +1,5 @@ (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) (:method ((seq sequence) (func function) init) (reduce func seq :initial-value init)) @@ -20,3 +15,34 @@ (setf acc (funcall func acc (list k v)))) seq) 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) + )) diff --git a/transducers.lisp b/transducers.lisp index eee9581..3efd537 100644 --- a/transducers.lisp +++ b/transducers.lisp @@ -116,9 +116,6 @@ (let ((splitter (apply #'data-lens:juxt functions))) (mapping splitter))) -(defun exit-early (acc) - (throw 'done acc)) - (defun taking (n) (lambda (rf) (let ((taken 0)) @@ -141,17 +138,6 @@ (funcall rf acc next))) ((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) (lambda (build) (unwrap