(use-modules
 ;; SRFI 60: procedures for treating integers as bits
 (srfi srfi-60)
 (ice-9 hash-table))


(define SQUARES
  ;; vector, constant time access
  #('A1 'B1 'C1 'D1 'E1 'F1 'G1 'H1
    'A2 'B2 'C2 'D2 'E2 'F2 'G2 'H2
    'A3 'B3 'C3 'D3 'E3 'F3 'G3 'H3
    'A4 'B4 'C4 'D4 'E4 'F4 'G4 'H4
    'A5 'B5 'C5 'D5 'E5 'F5 'G5 'H5
    'A6 'B6 'C6 'D6 'E6 'F6 'G6 'H6
    'A7 'B7 'C7 'D7 'E7 'F7 'G7 'H7
    'A8 'B8 'C8 'D8 'E8 'F8 'G8 'H8))


(define square-pos->bit-integer
  (lambda (pos)
    (expt 2 pos)))


(define make-squares-to-integer-mapping
  (lambda (squares)
    (let* ([num-squares (vector-length squares)]
           [lookup-table (make-hash-table num-squares)])
      (let loop ([square-pos 0])
        (cond
         [(< square-pos num-squares)
          #;(display
           (simple-format
            #f "setting at key: ~a\n" (vector-ref squares square-pos)))
          (hash-set! lookup-table
                     (vector-ref squares square-pos)
                     (square-pos->bit-integer square-pos))
          (loop (+ square-pos 1))]
         [else lookup-table])))))


(define SQUARES-TO-INTEGERS
  (make-squares-to-integer-mapping SQUARES))


(hash-ref SQUARES-TO-INTEGERS 'A2)

(hash-map->list cons SQUARES-TO-INTEGERS)
