Fix some Bool.isEq stuff

This commit is contained in:
Richard Feldman 2020-06-19 20:45:14 -04:00
parent dec5c3a062
commit 16ceb895c1
2 changed files with 46 additions and 0 deletions

View file

@ -26,6 +26,8 @@ use roc_types::subs::{VarStore, Variable};
/// which works fine because it doesn't involve any open tag unions.
pub fn builtin_defs(var_store: &mut VarStore) -> MutMap<Symbol, Expr> {
mut_map! {
Symbol::BOOL_EQ => bool_eq(var_store),
Symbol::BOOL_NEQ => bool_neq(var_store),
Symbol::LIST_LEN => list_len(var_store),
Symbol::LIST_GET => list_get(var_store),
Symbol::LIST_FIRST => list_first(var_store),
@ -44,6 +46,48 @@ pub fn builtin_defs(var_store: &mut VarStore) -> MutMap<Symbol, Expr> {
}
}
/// Bool.isEq : val, val -> Bool
fn bool_eq(var_store: &mut VarStore) -> Expr {
use crate::expr::Expr::*;
let body = RunLowLevel {
op: LowLevel::Eq,
args: vec![
(var_store.fresh(), Var(Symbol::BOOL_EQ_LHS)),
(var_store.fresh(), Var(Symbol::BOOL_EQ_RHS)),
],
ret_var: var_store.fresh(),
};
defn(
Symbol::BOOL_EQ,
vec![Symbol::BOOL_EQ_LHS, Symbol::BOOL_EQ_RHS],
var_store,
body,
)
}
/// Bool.isNotEq : val, val -> Bool
fn bool_neq(var_store: &mut VarStore) -> Expr {
use crate::expr::Expr::*;
let body = RunLowLevel {
op: LowLevel::NotEq,
args: vec![
(var_store.fresh(), Var(Symbol::BOOL_EQ_LHS)),
(var_store.fresh(), Var(Symbol::BOOL_EQ_RHS)),
],
ret_var: var_store.fresh(),
};
defn(
Symbol::BOOL_NEQ,
vec![Symbol::BOOL_EQ_LHS, Symbol::BOOL_EQ_RHS],
var_store,
body,
)
}
/// Float.tan : Float -> Float
fn float_tan(var_store: &mut VarStore) -> Expr {
use crate::expr::Expr::*;