Created
July 27, 2012 04:14
-
-
Save yamasushi/3186143 to your computer and use it in GitHub Desktop.
イテレータ反転
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; イテレータ反転 | |
(define-module inverter | |
(use gauche.generator) | |
(use util.stream) | |
; | |
(use util.queue) | |
(use gauche.threads) | |
; | |
(export | |
generator-inverter | |
stream-inverter | |
mtgenerator-inverter | |
mtstream-inverter | |
) | |
) | |
(select-module inverter) | |
;イテレータを反転してgeneratorにする手続きを返す | |
; produce ..... yield手続きを引数にもつ手続き | |
; consume ..... ジェネレータを引数にもつ手続き | |
(define (generator-inverter) | |
(^[produce consume] (consume (generate produce) ) ) ) | |
;イテレータを反転してstreamににする手続きを返す | |
; produce ..... yield手続きを引数にもつ手続き | |
; consume ..... ジェネレータを引数にもつ手続き | |
(define (stream-inverter) | |
(^[produce consume] | |
(consume (iterator->stream | |
(^[next end] | |
(produce (^x (if (eof-object? x) (end) (next x) ) ) ) ) | |
) ) ) ) | |
(define (mtqueue->generator mtq) | |
(generate (^[yield] | |
(let loop [(xc (dequeue/wait! mtq))] | |
(if (eof-object? xc) | |
(yield (eof-object)) | |
(begin | |
(yield xc) | |
(loop (dequeue/wait! mtq) ) ) ) ) ) ) | |
) | |
(define (mtqueue->stream mtq) | |
(iterator->stream (^[next end] | |
(let loop [(xc (dequeue/wait! mtq))] | |
(if (eof-object? xc) | |
(end) | |
(begin | |
(next xc) | |
(loop (dequeue/wait! mtq) ) ) ) ) ) ) | |
) | |
;イテレータを反転してgeneratorなどににする手続き(スレッドを使用) | |
; mtquere->x ..... mtqueureからgeneratorなどにする手続き | |
; produce ..... yield手続きを引数にもつ手続き | |
; consume ..... ジェネレータを引数にもつ手続き | |
(define (mt-inverter mtqueue->x produce consume :key (queue-size 100)) | |
(define (make-producer mtq) | |
(^ [] | |
(guard (e [else | |
(print (standard-error-port) (ref e 'message) ) | |
(enqueue/wait! mtq (eof-object)) ] ) | |
(produce (cut enqueue/wait! mtq <>)) | |
(enqueue/wait! mtq (eof-object)) | |
) ) ) | |
(define (make-consumer mtq) | |
(^ [] | |
(guard (e [else (print (standard-error-port) (ref e 'message) ) ]) | |
(consume (mtqueue->x mtq) ) ) ) ) | |
(and-let* [ ( mtq (make-mtqueue :max-length queue-size)) | |
( c (make-thread (make-consumer mtq ) ) ) | |
( p (make-thread (make-producer mtq )))] | |
(let [(tc (thread-start! c)) | |
(tp (thread-start! p)) ] | |
(thread-join! tp) | |
(thread-join! tc) ; <----consumerの値を返す | |
) ) ) | |
;イテレータを反転してgeneratorにする手続きを返す(スレッドを使用) | |
; produce ..... yield手続きを引数にもつ手続き | |
; consume ..... ジェネレータを引数にもつ手続き | |
(define (mtgenerator-inverter :key (queue-size 100)) | |
(^[produce consume] | |
(mt-inverter mtqueue->generator produce consume :queue-size queue-size) ) ) | |
;イテレータを反転してstreamににする手続きを返す(スレッドを使用) | |
; produce ..... yield手続きを引数にもつ手続き | |
; consume ..... ジェネレータを引数にもつ手続き | |
(define (mtstream-inverter :key (queue-size 100)) | |
(^[produce consume] | |
(mt-inverter mtqueue->stream produce consume :queue-size queue-size) ) ) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment