use crate::prelude::*;
use crate::{
casper_types::{
bytesrepr::{FromBytes, ToBytes},
CLTyped
},
module::{ModuleComponent, ModulePrimitive},
ContractEnv
};
use num_traits::{Num, One, Zero};
use crate::Var;
pub struct Sequence<T>
where
T: Num + One + ToBytes + FromBytes + CLTyped
{
env: Rc<ContractEnv>,
index: u8,
value: Var<T>
}
impl<T> Sequence<T>
where
T: Num + One + Zero + Default + Copy + ToBytes + FromBytes + CLTyped
{
pub fn get_current_value(&self) -> T {
self.value.get().unwrap_or_default()
}
pub fn next_value(&mut self) -> T {
match self.value.get() {
None => {
self.value.set(T::zero());
T::zero()
}
Some(value) => {
let next = value + T::one();
self.value.set(next);
next
}
}
}
}
impl<T: Num + One + Zero + Default + Copy + ToBytes + FromBytes + CLTyped> Sequence<T> {
pub fn env(&self) -> ContractEnv {
self.env.child(self.index)
}
}
impl<T: Num + One + Zero + Default + Copy + ToBytes + FromBytes + CLTyped> ModuleComponent
for Sequence<T>
{
fn instance(env: Rc<ContractEnv>, index: u8) -> Self {
Self {
env: env.clone(),
index,
value: Var::instance(env.child(index).into(), 0)
}
}
}
impl<T: Num + One + Zero + Default + Copy + ToBytes + FromBytes + CLTyped> ModulePrimitive
for Sequence<T>
{
}