(use goo)

(dc <matrix> (<any>))

(dp matrix-rows (<matrix> => <int>))
(dp matrix-cols (<matrix> => <int>))
(dp matrix-elts (<matrix> => <col>))

;; Hard-coded for 3x3's.  Go laziness.
(dm fab-matrix (rows|<int> cols|<int> => <matrix>)
  (def matrix (new <matrix>))
  (set (matrix-rows matrix) rows)
  (set (matrix-cols matrix) cols)
  (set (matrix-elts matrix) (vec 1 0 0 0 1 0 0 0 1))
  matrix
  )

(dm matrix-elt (matrix|<matrix> index|<int> => <num>)
  (elt (matrix-elts matrix) index)
  )

(dm matrix-rot-y (matrix|<matrix> deg|<int>)
  (when (< deg 0)
    (set deg (+ deg 360))
    )
  (def idx (div deg 90))
  (def rvals (tup (tup 1 0) (tup 0 1) (tup -1 0) (tup 0 -1)))
  (def my-vals (elt rvals idx))
  (set (matrix-elts matrix) (vec (1st my-vals) 0 (- 0 (2nd my-vals))
                                 0 1 0
                                 (2nd my-vals) 0 (1st my-vals)))
  )

(export
  <matrix>
  fab-matrix
  matrix-elt
  matrix-rot-y
  )