segment.scm 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. (library (lib segment)
  2. (export make-segment
  3. segment-start
  4. segment-end
  5. segment)
  6. (import (except (rnrs base)
  7. let-values
  8. map)
  9. (only (guile)
  10. lambda* λ))
  11. (define make-segment
  12. (λ (start end)
  13. (cons start end)))
  14. (define segment-start
  15. (λ (seg)
  16. (car seg)))
  17. (define segment-end
  18. (λ (seg)
  19. (cdr seg)))
  20. (define segment
  21. (lambda* (start
  22. end
  23. segment-count
  24. #:key
  25. (next (λ (num) (+ num 1))))
  26. "Make segments of mostly equal length/size. A
  27. segment's starting point is based on the previous segment's
  28. ending point. Segments do not necessarily connect with no
  29. gap in between. The NEXT argument is a function, which is
  30. used to calculate the start of the starting point of the
  31. following segment from the ending point of the previous
  32. segment."
  33. (let ([segment-size
  34. (ceiling
  35. (/ (- end start)
  36. segment-count))])
  37. (let loop ([pos start])
  38. (cond
  39. [(>= (+ pos segment-size) end)
  40. (list (make-segment pos end))]
  41. [else
  42. (cons (make-segment pos (+ pos segment-size))
  43. (loop (next (+ pos segment-size))))]))))))