Advertisement
Guest User

Untitled

a guest
Dec 20th, 2019
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 1.30 KB | None | 0 0
  1.  
  2. (define tbatch
  3.   (case-lambda
  4.     ((reducer)
  5.      (tbatch null-transducer reducer))
  6.     ((t r)
  7.      (lambda (reducer)
  8.        (let ((cur-reducer (t r))
  9.              (cur-state (r)))
  10.          (case-lambda
  11.            (() (reducer))
  12.            ((result)
  13.             ;; Check whether we still have accumulated state
  14.             (if (equal? cur-state (cur-reducer))
  15.                 (reducer result)
  16.                 ;; Pass the accumulated state downstream and handle
  17.                 ;; whether the downstream accepts new values.
  18.                 (let ((new-res (reducer result (cur-reducer cur-state))))
  19.                   (if (reduced? new-res)
  20.                       (reducer (unreduce new-res))
  21.                       (reducer new-res)))))
  22.            ((result value)
  23.             (let ((val (cur-reducer cur-state value)))
  24.               (cond
  25.                ;; cur-reducer is done. Push value downstream
  26.                ;; re-instantiate the state and the cur-reducer
  27.                ((reduced? val)
  28.                 (let ((unreduced-val (unreduce val)))
  29.                   (set! cur-reducer (t r))
  30.                   (set! cur-state (cur-reducer))
  31.                   (reducer result (cur-reducer unreduced-val))))
  32.                (else
  33.                 (set! cur-state val)
  34.                 result))))))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement