///|
struct DilithiumContext {
  mut params_set : ParameterSet
  mut random : @random.Rand
}

///| 
fn DilithiumContext::new(
  level : SecurityLevel,
  random : @random.Rand
) -> DilithiumContext {
  let params_set = level.gen_paramset()
  { params_set, random }
}

///| default random is very dangerous, please use your own random source
pub let dilithium_context : DilithiumContext = DilithiumContext::new(
  Dilithium3,
  @random.Rand::new(),
) // default level

///|
pub fn DilithiumContext::set_level(
  self : DilithiumContext,
  level : SecurityLevel
) -> Unit {
  self.params_set = level.gen_paramset()
}

///|
pub fn DilithiumContext::get_params_set(
  self : DilithiumContext
) -> ParameterSet {
  self.params_set
}

///|
pub fn DilithiumContext::set_random(
  self : DilithiumContext,
  random : @random.Rand
) -> Unit {
  self.random = random
}

///|
pub fn DilithiumContext::get_random(self : DilithiumContext) -> @random.Rand {
  self.random
}