12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- (library (lib segment)
- (export make-segment
- segment-start
- segment-end
- segment)
- (import (except (rnrs base)
- let-values
- map)
- (only (guile)
- lambda* λ))
- (define make-segment
- (λ (start end)
- (cons start end)))
- (define segment-start
- (λ (seg)
- (car seg)))
- (define segment-end
- (λ (seg)
- (cdr seg)))
- (define segment
- (lambda* (start
- end
- segment-count
- #:key
- (next (λ (num) (+ num 1))))
- "Make segments of mostly equal length/size. A
- segment's starting point is based on the previous segment's
- ending point. Segments do not necessarily connect with no
- gap in between. The NEXT argument is a function, which is
- used to calculate the start of the starting point of the
- following segment from the ending point of the previous
- segment."
- (let ([segment-size
- (ceiling
- (/ (- end start)
- segment-count))])
- (let loop ([pos start])
- (cond
- [(>= (+ pos segment-size) end)
- (list (make-segment pos end))]
- [else
- (cons (make-segment pos (+ pos segment-size))
- (loop (next (+ pos segment-size))))]))))))
|