Add in-slice sequences.

Patch from David Vanderson.
This commit is contained in:
Vincent St-Amour 2011-12-16 13:49:42 -05:00
parent a122ea725d
commit 664245ae69
3 changed files with 55 additions and 2 deletions

View File

@ -0,0 +1,15 @@
#lang racket/base
(require rackunit rackunit/text-ui unstable/sequence)
(run-tests
(test-suite "sequence.rkt"
(check-true (sequence? (in-slice 1 '())))
(check-equal? '() (for/list ([v (in-slice 1 '())]) v))
(check-equal? '((0 1)) (for/list ([v (in-slice 3 (in-range 2))]) v))
(check-equal? '((0 1 2) (3 4 5))
(for/list ([v (in-slice 3 (in-range 6))]) v))
(check-equal? '((0 1 2) (3 4 5) (6 7))
(for/list ([v (in-slice 3 (in-range 8))]) v))
(check-exn exn:fail:contract?
(lambda () (for/list ([x (in-slice 0 (in-range 8))]) x)))))

View File

@ -43,4 +43,18 @@ Produces the sequence of @racket[f] applied to each element of @racket[seq].
x)]
}
@addition{David Vanderson}
@defproc[(in-slice [length exact-positive-integer?] [seq sequence?])
sequence?]{
Returns a sequence where each element is a list with @racket[length]
elements from the given sequence.
@examples[#:eval the-eval
(for/list ([e (in-slice 3 (in-range 8))]) e)
]
}
@close-eval[the-eval]

View File

@ -1,10 +1,12 @@
#lang racket/base
(require (for-syntax racket/base))
(require (for-syntax racket/base) racket/contract/base)
;; Added by samth:
(provide in-syntax in-pairs in-sequence-forever sequence-lift)
(define-sequence-syntax in-syntax
(define-sequence-syntax in-syntax
(lambda () #'(lambda (e) (in-list (syntax->list e))))
(lambda (stx)
(syntax-case stx ()
@ -43,3 +45,25 @@
(lambda (_) (more?))
(lambda _ #t)
(lambda _ #t))))))
;; Added by stamourv (from David Vanderson (david.vanderson at gmail.com)):
(provide/contract
[in-slice (exact-positive-integer? any/c . -> . any)])
(define (in-slice k seq)
(unless (sequence? seq) (raise-type-error 'in-slice "sequence" seq))
(make-do-sequence
(lambda ()
(define-values (more? get) (sequence-generate seq))
(values
(lambda (_)
(for/list ((i k)
#:when (more?))
(get)))
values
#f
#f
(lambda (val) (0 . < . (length val)))
#f))))