Function: hanoi-move-ring
hanoi-move-ring is a byte-compiled function defined in hanoi.el.gz.
Signature
(hanoi-move-ring RING FROM TO START-TIME)
Source Code
;; Defined in /usr/src/emacs/lisp/play/hanoi.el.gz
;; do one pole-to-pole move and update the ring and pole pairs.
(defun hanoi-move-ring (ring from to start-time)
(incf (car from) baseward-step)
(decf (car to) baseward-step)
(let* ;; We move flywards-steps steps up the pole to the fly row,
;; then fly fly-steps steps across the fly row, then go
;; baseward-steps steps down the new pole.
((flyward-steps (/ (- (car ring) (cdr from)) baseward-step))
(fly-steps (abs (/ (- (cdr to) (cdr from)) fly-step)))
(directed-fly-step (/ (- (cdr to) (cdr from)) fly-steps))
(baseward-steps (/ (- (car to) (cdr to)) baseward-step))
;; A step is a character cell. A tick is a time-unit. To
;; make horizontal and vertical motion appear roughly the
;; same speed, we allow one tick per horizontal step and two
;; ticks per vertical step.
(ticks-per-pole-step (if hanoi-horizontal-flag 1 2))
(ticks-per-fly-step (if hanoi-horizontal-flag 2 1))
(flyward-ticks (* ticks-per-pole-step flyward-steps))
(fly-ticks (* ticks-per-fly-step fly-steps))
(baseward-ticks (* ticks-per-pole-step baseward-steps))
(total-ticks (+ flyward-ticks fly-ticks baseward-ticks))
(tick-to-pos
;; Return the buffer position of the ring after TICK ticks.
(lambda (tick)
(cond
((<= tick flyward-ticks)
(+ (cdr from)
(* baseward-step
(- flyward-steps (/ tick ticks-per-pole-step)))))
((<= tick (+ flyward-ticks fly-ticks))
(+ (cdr from)
(* directed-fly-step
(/ (- tick flyward-ticks) ticks-per-fly-step))))
(t
(+ (cdr to)
(* baseward-step
(/ (- tick flyward-ticks fly-ticks)
ticks-per-pole-step))))))))
(if hanoi-move-period
(cl-loop for elapsed = (float-time (time-subtract nil start-time))
while (time-less-p elapsed hanoi-move-period)
with tick-period = (/ (float-time hanoi-move-period)
total-ticks)
for tick = (ceiling elapsed tick-period) do
(hanoi-ring-to-pos ring (funcall tick-to-pos tick))
(hanoi-sit-for (- (* tick tick-period) elapsed)))
(cl-loop for tick from 1 to total-ticks by 2 do
(hanoi-ring-to-pos ring (funcall tick-to-pos tick))
(hanoi-sit-for 0)))
;; Always make last move to keep pole and ring data consistent
(hanoi-ring-to-pos ring (car to))
(if hanoi-move-period (time-add start-time hanoi-move-period))))