;; Some examples of programs using the from-to (or for) loop abstraction
(load-from-lib "from-to.ss")

;; compare - Program 9.5, pg. 272 -
(define vector-stretch-from-to
  ; TYPE: (-> (vector integer) vector)
  (lambda (vec new-size)
    ; ENSURES: result is a new copy of vec
    ; but having size new-size,
    ; result filled with () if bigger
    (let ((size (vector-length vec))
	  (res (make-vector new-size)))
      ((from-to 0 (sub1 (vector-length res)))
       (lambda (i)
	 (if (< i size) 
	     (vector-set! res i (vector-ref vec i))
	     (vector-set! res i '()))))
      res)))

;; compare - Program 9.7, pg. 272 -
(define vector-update-from-to
  ; TYPE: (-> (vector integer datum) vector)
  (lambda (vec k val)
    ; ENSURES: result is a new vector that
    ; has the same elements as vec, but
    ; with the the kth element replaced by
    ; val
    (let ((size (vector-length vec)))
      (let ((res (make-vector size)))
	((from-to 0 (sub1 size))
	 (lambda (i)
	   (if (= i k)
	       (vector-set! res i val)
	       (vector-set! res i (vector-ref vec i)))
	   (set! i (add1 i))))
	res))))

;; Basic question: do you see how these were derived from the original
;; programs?  Do you see how they relate to the while versions?

;; How does this compare with vector-generator?
;; Can you write vector-genearator using from-to?

;; More examples can be had by writing from-to versions of:
; - Program 9.9, pg. 273 -
; - Program 9.11, pg. 274 -
; - Program 9.13, pg. 275 -

;; What use can you get from the following?
;; How does it compare with vector-generator?
;; Are there things you can do with it that you can't do with vector-generator?
(define vector-for-each
  ; TYPE: (-> ((vector T) (-> (number) void))
  ;           void)
  (lambda (vec what-to-do-for-i)
    ((from-to 0 (sub1 (vector-length vec)))
     what-to-do-for-i)))
