48 lines
1.3 KiB
Racket
48 lines
1.3 KiB
Racket
#lang racket
|
|
|
|
(require racket/generic racket/stream)
|
|
|
|
(define-struct list-stream (v)
|
|
#:methods gen:stream
|
|
[(define (stream-empty? generic-stream)
|
|
(empty? (list-stream-v generic-stream)))
|
|
(define (stream-first generic-stream)
|
|
(first (list-stream-v generic-stream)))
|
|
(define (stream-rest generic-stream)
|
|
(rest (list-stream-v generic-stream)))])
|
|
|
|
(struct vector-stream (i v)
|
|
#:methods gen:stream
|
|
[(define (stream-first x) (vector-ref (vector-stream-v x)
|
|
(vector-stream-i x)))
|
|
(define (stream-rest x) (vector-stream (add1 (vector-stream-i x))
|
|
(vector-stream-v x)))
|
|
(define (stream-empty? x) (>= (vector-stream-i x)
|
|
(vector-length
|
|
(vector-stream-v x))))])
|
|
|
|
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
|
|
(define l1 (list-stream '(1 2)))
|
|
|
|
(check-true (stream? l1))
|
|
(check-false (stream-empty? l1))
|
|
(check-equal? (stream-first l1) 1)
|
|
|
|
(define l2 (stream-rest l1))
|
|
(check-true (stream? l2))
|
|
(check-false (stream-empty? l2))
|
|
(check-equal? (stream-first l2) 2)
|
|
|
|
(define l3 (stream-rest l2))
|
|
(check-true (stream? l3))
|
|
(check-true (stream-empty? l3))
|
|
|
|
|
|
(define s2 (vector-stream 0 '#(1 2 3)))
|
|
(check-equal? (sequence-fold + 0 s2) 6)
|
|
)
|