///|
pub struct StateKey {
  priv value : String
}

///|
pub fn StateKey::StateKey(scope : String, name : String) -> StateKey {
  { value: scope + ":" + name }
}

///|
priv struct ParseState {
  strings : @hashmap.HashMap[String, @hashmap.HashMap[String, String]]
}

///|
fn ParseState::ParseState() -> ParseState {
  { strings: @hashmap.HashMap([]) }
}

///|
fn ParseState::string_get(
  self : ParseState,
  key : StateKey,
  item : String,
) -> String? {
  match self.strings.get(key.value) {
    Some(items) => items.get(item)
    None => None
  }
}

///|
fn ParseState::string_set(
  self : ParseState,
  key : StateKey,
  item : String,
  value : String,
) -> Unit {
  let items = match self.strings.get(key.value) {
    Some(items) => items
    None => {
      let items = @hashmap.HashMap([])
      self.strings.set(key.value, items)
      items
    }
  }
  items.set(item, value)
}