Merge pull request #1968 from rtfeldman/builtin-result-is-err

Result.isErr : Result * * -> Bool
This commit is contained in:
Folkert de Vries 2021-11-13 13:26:47 +01:00 committed by GitHub
commit 783e425b0c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 116 additions and 0 deletions

View file

@ -1381,6 +1381,13 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
Box::new(bool_type()), Box::new(bool_type()),
); );
// isErr : Result * * -> bool
add_top_level_function_type!(
Symbol::RESULT_IS_ERR,
vec![result_type(flex(TVAR1), flex(TVAR3))],
Box::new(bool_type()),
);
types types
} }

View file

@ -193,6 +193,7 @@ pub fn builtin_defs_map(symbol: Symbol, var_store: &mut VarStore) -> Option<Def>
RESULT_AFTER => result_after, RESULT_AFTER => result_after,
RESULT_WITH_DEFAULT => result_with_default, RESULT_WITH_DEFAULT => result_with_default,
RESULT_IS_OK => result_is_ok, RESULT_IS_OK => result_is_ok,
RESULT_IS_ERR => result_is_err,
} }
} }
@ -3992,6 +3993,83 @@ fn result_with_default(symbol: Symbol, var_store: &mut VarStore) -> Def {
) )
} }
fn result_is_err(symbol: Symbol, var_store: &mut VarStore) -> Def {
let ret_var = var_store.fresh();
let result_var = var_store.fresh();
let mut branches = vec![];
{
// ok branch
let tag_name = TagName::Global("Ok".into());
let pattern = Pattern::AppliedTag {
whole_var: result_var,
ext_var: var_store.fresh(),
tag_name,
arguments: vec![(var_store.fresh(), no_region(Pattern::Underscore))],
};
let false_expr = Tag {
variant_var: var_store.fresh(),
ext_var: var_store.fresh(),
name: TagName::Global("False".into()),
arguments: vec![],
};
let branch = WhenBranch {
patterns: vec![no_region(pattern)],
value: no_region(false_expr),
guard: None,
};
branches.push(branch);
}
{
// err branch
let tag_name = TagName::Global("Err".into());
let pattern = Pattern::AppliedTag {
whole_var: result_var,
ext_var: var_store.fresh(),
tag_name,
arguments: vec![(var_store.fresh(), no_region(Pattern::Underscore))],
};
let true_expr = Tag {
variant_var: var_store.fresh(),
ext_var: var_store.fresh(),
name: TagName::Global("True".into()),
arguments: vec![],
};
let branch = WhenBranch {
patterns: vec![no_region(pattern)],
value: no_region(true_expr),
guard: None,
};
branches.push(branch);
}
let body = When {
cond_var: result_var,
expr_var: ret_var,
region: Region::zero(),
loc_cond: Box::new(no_region(Var(Symbol::ARG_1))),
branches,
};
defn(
symbol,
vec![(result_var, Symbol::ARG_1)],
var_store,
body,
ret_var,
)
}
fn result_is_ok(symbol: Symbol, var_store: &mut VarStore) -> Def { fn result_is_ok(symbol: Symbol, var_store: &mut VarStore) -> Def {
let ret_var = var_store.fresh(); let ret_var = var_store.fresh();
let result_var = var_store.fresh(); let result_var = var_store.fresh();

View file

@ -1079,6 +1079,7 @@ define_builtins! {
3 RESULT_WITH_DEFAULT: "withDefault" 3 RESULT_WITH_DEFAULT: "withDefault"
4 RESULT_AFTER: "after" 4 RESULT_AFTER: "after"
5 RESULT_IS_OK: "isOk" 5 RESULT_IS_OK: "isOk"
6 RESULT_IS_ERR: "isErr"
} }
6 DICT: "Dict" => { 6 DICT: "Dict" => {
0 DICT_DICT: "Dict" imported // the Dict.Dict type alias 0 DICT_DICT: "Dict" imported // the Dict.Dict type alias

View file

@ -189,3 +189,33 @@ fn is_ok() {
bool bool
); );
} }
#[test]
#[cfg(any(feature = "gen-llvm"))]
fn is_err() {
assert_evals_to!(
indoc!(
r#"
result : Result I64 {}
result = Ok 2
Result.isErr result
"#
),
false,
bool
);
assert_evals_to!(
indoc!(
r#"
result : Result I64 {}
result = Err {}
Result.isErr result
"#
),
true,
bool
);
}