80 lines
2.4 KiB
Racket
80 lines
2.4 KiB
Racket
#lang racket/base
|
|
|
|
(require (for-syntax racket/base) racket/contract/base)
|
|
|
|
;; Added by samth:
|
|
|
|
(provide in-syntax in-pairs in-sequence-forever sequence-lift)
|
|
|
|
;; ELI: I don't see a point in this over using `syntax->list' directly.
|
|
;; (Eg, the latter is something that can be used when the programmer
|
|
;; knows that it's a list, in contrast to this code which will just
|
|
;; throw an error.)
|
|
(define-sequence-syntax in-syntax
|
|
(λ () #'(λ (e) (in-list (syntax->list e))))
|
|
(λ (stx)
|
|
(syntax-case stx ()
|
|
[[ids (_ arg)]
|
|
#'[ids (in-list (syntax->list arg))]])))
|
|
|
|
;; ELI: This is very specific, and indeed there are no uses of it
|
|
;; anywhere in the tree other than in TR where it came from.
|
|
(define (in-pairs seq)
|
|
(make-do-sequence
|
|
(λ ()
|
|
(let-values ([(more? gen) (sequence-generate seq)])
|
|
(values (λ (e) (let ([e (gen)]) (values (car e) (cdr e))))
|
|
(λ (_) #t)
|
|
#t
|
|
(λ (_) (more?))
|
|
(λ _ #t)
|
|
(λ _ #t))))))
|
|
|
|
;; ELI: Besides the awful name, this is the same as
|
|
;; (in-sequences seq (in-cycle (in-value val)))
|
|
(define (in-sequence-forever seq val)
|
|
(make-do-sequence
|
|
(λ ()
|
|
(let-values ([(more? gen) (sequence-generate seq)])
|
|
(values (λ (e) (if (more?) (gen) val))
|
|
(λ (_) #t)
|
|
#t
|
|
(λ (_) #t)
|
|
(λ _ #t)
|
|
(λ _ #t))))))
|
|
|
|
;; ELI: How is this different from `sequence-map'?
|
|
(define (sequence-lift f seq)
|
|
(make-do-sequence
|
|
(λ ()
|
|
(let-values ([(more? gen) (sequence-generate seq)])
|
|
(values (λ (e) (call-with-values gen f))
|
|
(λ (_) #t)
|
|
#t
|
|
(λ (_) (more?))
|
|
(λ _ #t)
|
|
(λ _ #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)
|
|
;; ELI: what's the point of using `any/c' above and then checking it here?
|
|
(unless (sequence? seq) (raise-type-error 'in-slice "sequence" seq))
|
|
(make-do-sequence
|
|
(λ ()
|
|
(define-values (more? get) (sequence-generate seq))
|
|
(values
|
|
(λ (_)
|
|
;; ELI: Add an `in-range'
|
|
(for/list ([i k] #:when (more?))
|
|
(get)))
|
|
values
|
|
#f
|
|
#f
|
|
;; ELI: Use `pair?'
|
|
(λ (val) (0 . < . (length val)))
|
|
#f))))
|