adds Num.subChecked

This commit is contained in:
Celso Bonutti Filho 2020-12-22 23:27:16 -03:00
parent 5d2abc2bd2
commit fe588c120c
8 changed files with 210 additions and 15 deletions

View file

@ -148,17 +148,19 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
});
// addChecked : Num a, Num a -> Result (Num a) [ IntOverflow ]*
let overflow = SolvedType::TagUnion(
vec![(TagName::Global("Overflow".into()), vec![])],
Box::new(SolvedType::Wildcard),
);
fn overflow() -> SolvedType {
SolvedType::TagUnion(
vec![(TagName::Global("Overflow".into()), vec![])],
Box::new(SolvedType::Wildcard),
)
}
// addChecked : Num a, Num a -> Result (Num a) [ Overflow ]*
add_type(Symbol::NUM_ADD_CHECKED, {
let_tvars! { u, v, w, num, result, star };
unique_function(
vec![num_type(u, num), num_type(v, num)],
result_type(result, num_type(w, num), lift(star, overflow)),
result_type(result, num_type(w, num), lift(star, overflow())),
)
});
@ -180,6 +182,15 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
});
// subChecked : Num a, Num a -> Result (Num a) [ Overflow ]*
add_type(Symbol::NUM_SUB_CHECKED, {
let_tvars! { u, v, w, num, result, star };
unique_function(
vec![num_type(u, num), num_type(v, num)],
result_type(result, num_type(w, num), lift(star, overflow())),
)
});
// mul or (*) : Num a, Num a -> Num a
add_type(Symbol::NUM_MUL, {
let_tvars! { u, v, w, num };