Browse code
chore(transducers): reshuffle
fiddlerwoaroof authored on 19/12/2020 07:09:55
Showing 2 changed files
Showing 2 changed files
... | ... |
@@ -21,8 +21,18 @@ |
21 | 21 |
#:op #:defalias #:<> #:<>1 #:== #:• |
22 | 22 |
)) |
23 | 23 |
|
24 |
-(defpackage :data-lens.transducers.beta |
|
24 |
+(defpackage :data-lens.transducers.internals |
|
25 | 25 |
(:use :cl) |
26 |
+ (:export |
|
27 |
+ #:unwrap |
|
28 |
+ #:init |
|
29 |
+ #:reduce-generic |
|
30 |
+ #:stepper)) |
|
31 |
+ |
|
32 |
+(defpackage :data-lens.transducers |
|
33 |
+ (:use :cl) |
|
34 |
+ (:import-from :data-lens.transducers.internals |
|
35 |
+ #:unwrap #:init #:reduce-generic #:stepper) |
|
26 | 36 |
(:export #:mapping :filtering :deduping :catting :splitting |
27 | 37 |
#:exit-early :taking :dropping :transduce |
28 | 38 |
#:hash-table-builder :vector-builder :list-builder |
... | ... |
@@ -1,4 +1,26 @@ |
1 |
-(in-package :data-lens.transducers.beta) |
|
1 |
+(in-package :data-lens.transducers.internals) |
|
2 |
+ |
|
3 |
+(defgeneric unwrap (it obj) |
|
4 |
+ (:method (it obj) obj)) |
|
5 |
+(defgeneric init (it)) |
|
6 |
+(defgeneric stepper (it)) |
|
7 |
+ |
|
8 |
+(defgeneric reduce-generic (seq func init) |
|
9 |
+ (:method ((seq sequence) (func function) init) |
|
10 |
+ (reduce func seq :initial-value init)) |
|
11 |
+ (:method ((seq sequence) (func symbol) init) |
|
12 |
+ (reduce func seq :initial-value init)) |
|
13 |
+ (:method (seq (func symbol) init) |
|
14 |
+ (reduce-generic seq (symbol-function func) init)) |
|
15 |
+ (:method ((seq hash-table) (func function) init) |
|
16 |
+ (let ((acc init)) |
|
17 |
+ (maphash (lambda (k v) |
|
18 |
+ (setf acc (funcall func acc (list k v)))) |
|
19 |
+ seq) |
|
20 |
+ acc))) |
|
21 |
+ |
|
22 |
+(in-package :data-lens.transducers) |
|
23 |
+ |
|
2 | 24 |
(declaim (inline mapping filtering deduping catting splitting |
3 | 25 |
exit-early taking dropping transduce |
4 | 26 |
hash-table-builder vector-builder list-builder)) |
... | ... |
@@ -73,69 +95,41 @@ |
73 | 95 |
acc) |
74 | 96 |
(funcall rf acc next)))))) |
75 | 97 |
|
76 |
-(defgeneric unwrap (it obj) |
|
77 |
- (:method (it obj) obj)) |
|
78 |
-(defgeneric init (it)) |
|
79 |
-(defgeneric stepper (it)) |
|
80 |
- |
|
81 |
-(defgeneric reduce-generic (seq func init) |
|
82 |
- (:method ((seq sequence) (func function) init) |
|
83 |
- (reduce func seq :initial-value init)) |
|
84 |
- (:method ((seq sequence) (func symbol) init) |
|
85 |
- (reduce func seq :initial-value init)) |
|
86 |
- (:method (seq (func symbol) init) |
|
87 |
- (foldling seq (symbol-function func) init)) |
|
88 |
- (:method ((seq hash-table) (func function) init) |
|
89 |
- (let ((acc init)) |
|
90 |
- (maphash (lambda (k v) |
|
91 |
- (setf acc (funcall func acc (list k v)))) |
|
92 |
- seq) |
|
93 |
- acc))) |
|
94 |
- |
|
95 | 98 |
(defun transduce (xf build seq) |
96 | 99 |
(unwrap build |
97 | 100 |
(catch 'done |
98 | 101 |
(reduce-generic seq |
99 | 102 |
(funcall xf (stepper build)) |
100 | 103 |
(init build))))) |
101 |
- |
|
102 |
-(defclass lazy-sequence () |
|
103 |
- ((%next :initarg :next :reader next))) |
|
104 |
-(defun lazy-sequence (next) |
|
105 |
- (make-instance 'lazy-sequence :next next)) |
|
106 |
-(defmethod reduce-generic ((seq lazy-sequence) (func function) init) |
|
107 |
- (let ((next (next seq))) |
|
108 |
- (loop for next-val = (funcall next) |
|
109 |
- for acc = init then next-acc |
|
110 |
- for next-acc = (when next-val (funcall func acc next-val)) |
|
111 |
- while next-val |
|
112 |
- finally (return acc)))) |
|
113 |
- |
|
114 |
-(defmacro comment (&body body) |
|
115 |
- (declare (ignore body)) |
|
116 |
- nil) |
|
117 |
- |
|
118 |
-(defmethod stepper ((it (eql 'hash-table-builder))) |
|
104 |
+(defun eduction (xf seq) |
|
105 |
+ (lambda (build) |
|
106 |
+ (data-lens.transducers.internals:unwrap |
|
107 |
+ build |
|
108 |
+ (catch 'done |
|
109 |
+ (data-lens.transducers.internals:reduce-generic seq |
|
110 |
+ (funcall xf (stepper build)) |
|
111 |
+ (init build)))))) |
|
112 |
+ |
|
113 |
+(defmethod data-lens.transducers.internals:init ((it (eql 'hash-table-builder))) |
|
114 |
+ (make-hash-table)) |
|
115 |
+(defmethod data-lens.transducers.internals:stepper ((it (eql 'hash-table-builder))) |
|
119 | 116 |
(lambda (acc next) |
120 | 117 |
(destructuring-bind (k v) next |
121 | 118 |
(setf (gethash k acc) v)) |
122 | 119 |
acc)) |
123 |
-(defmethod init ((it (eql 'hash-table-builder))) |
|
124 |
- (make-hash-table)) |
|
125 | 120 |
|
126 |
-(defmethod stepper ((it (eql 'vector-builder))) |
|
121 |
+(defmethod data-lens.transducers.internals:init ((it (eql 'vector-builder))) |
|
122 |
+ (make-array 0 :fill-pointer t :adjustable t)) |
|
123 |
+(defmethod data-lens.transducers.internals:stepper ((it (eql 'vector-builder))) |
|
127 | 124 |
(lambda (acc next) |
128 | 125 |
(vector-push-extend next acc) |
129 | 126 |
acc)) |
130 |
-(defmethod init ((it (eql 'vector-builder))) |
|
131 |
- (make-array 0 :fill-pointer t :adjustable t)) |
|
132 |
- |
|
133 | 127 |
|
134 |
-(defmethod init ((it (eql 'list-builder))) |
|
128 |
+(defmethod data-lens.transducers.internals:init ((it (eql 'list-builder))) |
|
135 | 129 |
(declare (optimize (speed 3))) |
136 | 130 |
(coerce (vector nil nil) |
137 | 131 |
'(simple-array list (2)))) |
138 |
-(defmethod stepper ((it (eql 'list-builder))) |
|
132 |
+(defmethod data-lens.transducers.internals:stepper ((it (eql 'list-builder))) |
|
139 | 133 |
(lambda (acc a) |
140 | 134 |
(declare (optimize (speed 3)) |
141 | 135 |
(type (simple-array list (2)) acc)) |
... | ... |
@@ -147,9 +141,25 @@ |
147 | 141 |
(setf (elt acc 0) new |
148 | 142 |
(elt acc 1) new))) |
149 | 143 |
acc)) |
150 |
-(defmethod unwrap ((it (eql 'list-builder)) obj) |
|
144 |
+(defmethod data-lens.transducers.internals:unwrap ((it (eql 'list-builder)) obj) |
|
151 | 145 |
(elt obj 0)) |
152 | 146 |
|
147 |
+(defclass lazy-sequence () |
|
148 |
+ ((%next :initarg :next :reader next))) |
|
149 |
+(defun lazy-sequence (next) |
|
150 |
+ (make-instance 'lazy-sequence :next next)) |
|
151 |
+(defmethod data-lens.transducers.internals:reduce-generic ((seq lazy-sequence) (func function) init) |
|
152 |
+ (let ((next (next seq))) |
|
153 |
+ (loop for next-val = (funcall next) |
|
154 |
+ for acc = init then next-acc |
|
155 |
+ for next-acc = (when next-val (funcall func acc next-val)) |
|
156 |
+ while next-val |
|
157 |
+ finally (return acc)))) |
|
158 |
+ |
|
159 |
+(defmacro comment (&body body) |
|
160 |
+ (declare (ignore body)) |
|
161 |
+ nil) |
|
162 |
+ |
|
153 | 163 |
(comment |
154 | 164 |
(defun 2* (it) |
155 | 165 |
(* 2 it)) |