
(defun animation-revert-direction ()
  (interactive)
  (let ((forward (gethash 'forward **animation-state**)))
    (puthash 'forward (not forward) **animation-state**)))

(defun animation-start ()
  (interactive)
  (make-thread
   (lambda () 
     (let ()
       (setq **animation-state** (make-hash-table))
       (puthash 'offset 0 **animation-state**)
       (puthash 'sleep-cnt 5 **animation-state**)
       (puthash 'len 20 **animation-state**)
       (puthash 'buffer (make-string (gethash 'len **animation-state**) ? )
		**animation-state**)
       (puthash 'text "Hello World!" **animation-state**)
       (puthash 'forward 't **animation-state**)
       
       (switch-to-buffer-other-window "**animation**")
       (erase-buffer)
       (insert "\n")
       (insert-button
	"Revert Direction"
	'action (lambda (x)
		  (let ((forward (gethash 'forward **animation-state**)))
		    (puthash 'forward (not forward) **animation-state**)))
	'follow-link 't)
       
       (while 't
	 (let ((offset (gethash 'offset **animation-state**))
	       (len (gethash 'len **animation-state**))
	       (txt (gethash 'text **animation-state**))
	       (buff (gethash 'buffer **animation-state**))
	       (is-forward (gethash 'forward **animation-state**)))
	   
	   (fillarray buff ? )
	   (seq-map-indexed (lambda (ch idx)
			      (aset buff (% (+ offset idx) len) ch))
			    txt)
	   (puthash 'buffer buff **animation-state**)
	   (if is-forward
	       (puthash 'offset (1+ offset) **animation-state**)
	     (puthash 'offset (% (+ len (1- offset)) len) **animation-state**))
	   
	   ;;(erase-buffer)
	   (beginning-of-buffer)
	   (delete-region (line-beginning-position) (line-end-position))
	   (insert buff)
	   ;;(message buff)
	   )
	 (sleep-for 0 500)
	 )  
       )
     )
   "animation thread")
  )
