use std::{any::Any,collections::HashMap,time::{self, SystemTime},hash::Hash};
pub use self::CSCForLoop::*;
pub use self::CSCDefaultFunc::*;
pub use self::CSCCacheFunc::*;
pub mod CSCDefaultFunc
{
use super::*;
#[derive(Debug)]
pub struct CSCDARG<'a,FT>
{
func:FT,
argn:Vec<&'a str>,
argh:HashMap<&'a str,Box<dyn Any>>,
}
impl<'a,FT> CSCDARG<'a,FT>
{
pub fn new(func:FT)->CSCDARG<'a,FT>
{
CSCDARG
{
func:func,
argn:vec![],
argh:HashMap::new(),
}
}
pub fn set<G>(mut self,arg:(&'a str,G))->Self
where
G:'static
{
if !self.argn.contains(&arg.0)
{
self.argn.push(arg.0);
}
self.argh.insert(arg.0,Box::new(arg.1));
self
}
pub fn call<VT>(mut self)->VT
where
FT:Fn(Vec<Box<dyn Any>>)->VT,
{
let mut vs:Vec<Box<dyn Any>>;
vs=vec![];
for ky in self.argn
{
let dt=self.argh.remove(ky);
match dt
{
Some(vl) =>
{
vs.push(vl);
},
None => {},
}
}
(self.func)(vs)
}
}
}
pub mod CSCCacheFunc
{
use super::*;
#[derive(Debug)]
pub struct CSCFCACHE<FT,KT,VT>
where
FT:Fn(KT)->VT,
{
func:FT,
cachetimeout:f64,
cachetime:HashMap<time::SystemTime,KT>,
argtime:HashMap<KT,time::SystemTime>,
value:HashMap<KT,VT>,
}
impl<FT,KT,VT> CSCFCACHE<FT,KT,VT>
where
FT:Fn(KT)->VT,
{
pub fn new(func:FT)->CSCFCACHE<FT,KT,VT>
{
CSCFCACHE
{
func: func,
cachetimeout:f64::default(),
cachetime:HashMap::new(),
argtime:HashMap::new(),
value: HashMap::new(),
}
}
pub fn cachetimeout (mut self, cachetimeout:f64)->Self
{
self.cachetimeout=cachetimeout;
self
}
pub fn call(&mut self,args:KT)->VT
where
KT:Eq+Hash+Copy,
VT:Copy,
{
if self.cachetimeout!=0.0
{
{
let mut rv:Vec<(time::SystemTime,KT)>;
rv=vec![];
for (syt,arg) in self.cachetime.iter()
{
match syt.elapsed()
{
Ok(elapsed) =>
{
if elapsed.as_secs_f64()>self.cachetimeout
{
rv.push((*syt,*arg));
}
},
Err(err) =>
{
println!("Error: {:#?}",err);
},
}
}
for ele in rv
{
self.cachetime.remove(&ele.0);
self.argtime.remove(&ele.1);
self.value.remove(&ele.1);
}
}
{
let rs;
if self.value.contains_key(&args)
{
rs=self.value[&args];
}else{
rs=(self.func)(args);
};
{
let now;
let snowc;
now=SystemTime::now();
snowc=self.argtime.insert(args,now);
match snowc
{
Some(nowc)=>
{
self.cachetime.remove(&nowc);
},
None=>
{
self.value.insert(args, rs);
},
}
self.cachetime.insert(now,args);
}
rs
}
}else{
let chk;
chk=self.value.get(&args);
let rs;
match chk
{
Some(v) =>
{
rs=*v
},
None =>
{
rs=(self.func)(args);
self.value.insert(args, rs);
},
}
rs
}
}
}
}
pub mod CSCForLoop
{
use std::ops::AddAssign;
#[derive(Debug,Clone,Copy)]
pub struct CSCFor<T>
{
count : T,
ptr : T,
start : T,
step : T,
end : T,
}
impl<T> CSCFor<T>
where
T : Default + Copy + Clone + ?Sized,
{
pub fn new() -> CSCFor<T>
{
CSCFor
{
count : T::default(),
ptr : T::default(),
start : T::default(),
step : T::default(),
end : T::default(),
}
}
pub fn start(mut self, start:T) -> Self
{
self.start=start;
self.ptr=start;
self.count=start;
self
}
pub fn end(mut self, end:T) -> Self
{
self.end=end;
self
}
pub fn step(mut self, step:T) -> Self
{
self.step=step;
self
}
}
impl<T> Iterator for CSCFor<T>
where
T:PartialOrd+AddAssign+Copy+Clone,
{
type Item=T;
fn next(&mut self) -> Option<Self::Item>
{
self.ptr=self.count;
if self.count<self.end
{
self.count+=self.step;
Some(self.ptr)
} else {
None
}
}
}
}