git.fiddlerwoaroof.com
Browse code

chore(transducers): reshuffle

fiddlerwoaroof authored on 19/12/2020 07:09:55
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))