Skip to content

Instantly share code, notes, and snippets.

@lexi-lambda
Created March 28, 2015 07:20
Show Gist options
  • Save lexi-lambda/535b7985d4570d1e0222 to your computer and use it in GitHub Desktop.
Save lexi-lambda/535b7985d4570d1e0222 to your computer and use it in GitHub Desktop.
#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)))])
#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