Created
March 28, 2015 07:20
-
-
Save lexi-lambda/535b7985d4570d1e0222 to your computer and use it in GitHub Desktop.
This file contains 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
#lang racket | |
(require racket/generic) | |
;; --------------------------------------------------------------------------------------------------- | |
;; An iterator is a structure that actually implements iteration over some iterable sequence. The | |
;; iterator method of gen:iterable fetches an iterator to be used in iteration. | |
(define-generics iterator | |
(iterator-empty? iterator) | |
(iterator-value iterator) | |
(iterator-next iterator)) | |
(define-generics iterable | |
(iterator iterable) | |
#:defaults | |
([iterator? ; calling iterator on an iterator just returns itself | |
(define iterator values)] | |
[sequence? | |
(define (iterator seq) | |
(sequence-iterator seq))])) | |
;; --------------------------------------------------------------------------------------------------- | |
;; This is a simplified version of gen:sequence that only supports constructed sequences (sequences | |
;; which use cons, first, and rest, such as lists and streams). | |
(define-generics sequence | |
(cons value sequence) | |
(first sequence) | |
(rest sequence) | |
(empty? sequence)) | |
;; For constructed sequences, implementing an iterator is trivial, since the basic operations are | |
;; already supported by the sequence type. | |
(struct sequence-iterator (seq) | |
#:methods gen:iterator | |
[(define (iterator-empty? s-i) | |
(empty? (sequence-iterator-seq s-i))) | |
(define (iterator-value s-i) | |
(first (sequence-iterator-seq s-i))) | |
(define (iterator-next s-i) | |
(rest (sequence-iterator-seq s-i)))]) |
This file contains 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
#lang racket | |
(require racket/generic) | |
;; --------------------------------------------------------------------------------------------------- | |
;; An iterator is a structure that actually implements iteration over some iterable sequence. The | |
;; iterator method of gen:iterable fetches an iterator to be used in iteration. | |
(define-generics iterator | |
(iterator-empty? iterator) | |
(iterator-value iterator) | |
(iterator-next iterator)) | |
(define-generics iterable | |
(iterator iterable) | |
#:defaults | |
([iterator? ; calling iterator on an iterator just returns itself | |
(define iterator values)])) | |
;; --------------------------------------------------------------------------------------------------- | |
;; This is a simplified version of gen:sequence that only supports constructed sequences (sequences | |
;; which use cons, first, and rest, such as lists and streams). | |
(define-generics sequence | |
(cons value sequence) | |
(first sequence) | |
(rest sequence) | |
(empty? sequence) | |
; all constructed sequences are iterable | |
#:implements gen:iterable | |
[(define (iterator seq) | |
(sequence-iterator seq))]) | |
;; For constructed sequences, implementing an iterator is trivial, since the basic operations are | |
;; already supported by the sequence type. | |
(struct sequence-iterator (seq) | |
#:methods gen:iterator | |
[(define (iterator-empty? s-i) | |
(empty? (sequence-iterator-seq s-i))) | |
(define (iterator-value s-i) | |
(first (sequence-iterator-seq s-i))) | |
(define (iterator-next s-i) | |
(rest (sequence-iterator-seq s-i)))]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment