diff --git a/collects/tests/unstable/sequence.rkt b/collects/tests/unstable/sequence.rkt new file mode 100644 index 0000000000..16158151d8 --- /dev/null +++ b/collects/tests/unstable/sequence.rkt @@ -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))))) diff --git a/collects/unstable/scribblings/sequence.scrbl b/collects/unstable/scribblings/sequence.scrbl index 15cf58852c..ab044ee7da 100644 --- a/collects/unstable/scribblings/sequence.scrbl +++ b/collects/unstable/scribblings/sequence.scrbl @@ -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] diff --git a/collects/unstable/sequence.rkt b/collects/unstable/sequence.rkt index 1d3ecf88a4..8f44640fcc 100644 --- a/collects/unstable/sequence.rkt +++ b/collects/unstable/sequence.rkt @@ -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))))