///|
/// Immutable symbol. Exported matrices are defensive copies.
pub struct Symbol {
  priv w : Int
  priv h : Int
  priv cells : Array[Bool]
}

///|
pub fn Symbol::width(self : Symbol) -> Int {
  self.w
}

///|
pub fn Symbol::height(self : Symbol) -> Int {
  self.h
}

///|
pub fn Symbol::module_at(self : Symbol, x : Int, y : Int) -> Bool? {
  if x < 0 || y < 0 || x >= self.w || y >= self.h {
    None
  } else {
    Some(self.cells[y * self.w + x])
  }
}

///|
pub fn Symbol::matrix(self : Symbol) -> Array[Array[Bool]] {
  Array::makei(self.h, fn(y) {
    Array::makei(self.w, fn(x) { self.cells[y * self.w + x] })
  })
}