Merge pull request #5222 from roc-lang/hash-bool

Implement Hash for Bool
This commit is contained in:
Ayaz 2023-03-28 16:43:44 -05:00 committed by GitHub
commit 37d4ff9fdc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 12 deletions

View file

@ -9,6 +9,7 @@ interface Hash
addU32, addU32,
addU64, addU64,
addU128, addU128,
hashBool,
hashI8, hashI8,
hashI16, hashI16,
hashI32, hashI32,
@ -20,7 +21,7 @@ interface Hash
hashList, hashList,
hashUnordered, hashUnordered,
] imports [ ] imports [
Bool.{ isEq }, Bool.{ Bool, isEq },
List, List,
Str, Str,
Num.{ U8, U16, U32, U64, U128, I8, I16, I32, I64, I128, Nat }, Num.{ U8, U16, U32, U64, U128, I8, I16, I32, I64, I128, Nat },
@ -70,6 +71,12 @@ hashList = \hasher, lst ->
List.walk lst hasher \accumHasher, elem -> List.walk lst hasher \accumHasher, elem ->
hash accumHasher elem hash accumHasher elem
## Adds a single [Bool] to a hasher.
hashBool : a, Bool -> a | a has Hasher
hashBool = \hasher, b ->
asU8 = if b then 1 else 0
addU8 hasher asU8
## Adds a single I8 to a hasher. ## Adds a single I8 to a hasher.
hashI8 : a, I8 -> a | a has Hasher hashI8 : a, I8 -> a | a has Hasher
hashI8 = \hasher, n -> addU8 hasher (Num.toU8 n) hashI8 = \hasher, n -> addU8 hasher (Num.toU8 n)

View file

@ -160,6 +160,7 @@ impl FlatHash {
const fn builtin_symbol_to_hash_lambda(symbol: Symbol) -> Option<FlatHash> { const fn builtin_symbol_to_hash_lambda(symbol: Symbol) -> Option<FlatHash> {
use FlatHash::*; use FlatHash::*;
match symbol { match symbol {
Symbol::BOOL_BOOL => Some(SingleLambdaSetImmediate(Symbol::HASH_HASH_BOOL)),
Symbol::NUM_U8 | Symbol::NUM_UNSIGNED8 => { Symbol::NUM_U8 | Symbol::NUM_UNSIGNED8 => {
Some(SingleLambdaSetImmediate(Symbol::HASH_ADD_U8)) Some(SingleLambdaSetImmediate(Symbol::HASH_ADD_U8))
} }

View file

@ -1548,16 +1548,17 @@ define_builtins! {
6 HASH_ADD_U32: "addU32" 6 HASH_ADD_U32: "addU32"
7 HASH_ADD_U64: "addU64" 7 HASH_ADD_U64: "addU64"
8 HASH_ADD_U128: "addU128" 8 HASH_ADD_U128: "addU128"
9 HASH_HASH_I8: "hashI8" 9 HASH_HASH_BOOL: "hashBool"
10 HASH_HASH_I16: "hashI16" 10 HASH_HASH_I8: "hashI8"
11 HASH_HASH_I32: "hashI32" 11 HASH_HASH_I16: "hashI16"
12 HASH_HASH_I64: "hashI64" 12 HASH_HASH_I32: "hashI32"
13 HASH_HASH_I128: "hashI128" 13 HASH_HASH_I64: "hashI64"
14 HASH_HASH_NAT: "hashNat" 14 HASH_HASH_I128: "hashI128"
15 HASH_COMPLETE: "complete" 15 HASH_HASH_NAT: "hashNat"
16 HASH_HASH_STR_BYTES: "hashStrBytes" 16 HASH_COMPLETE: "complete"
17 HASH_HASH_LIST: "hashList" 17 HASH_HASH_STR_BYTES: "hashStrBytes"
18 HASH_HASH_UNORDERED: "hashUnordered" 18 HASH_HASH_LIST: "hashList"
19 HASH_HASH_UNORDERED: "hashUnordered"
} }
14 JSON: "Json" => { 14 JSON: "Json" => {
0 JSON_JSON: "Json" 0 JSON_JSON: "Json"

View file

@ -8373,7 +8373,23 @@ mod solve_expr {
# ^^^^^^^^^ # ^^^^^^^^^
"# "#
), ),
@"Hash#Hash.hash(1) : a, I64 -[[Hash.hashI64(12)]]-> a | a has Hasher" @"Hash#Hash.hash(1) : a, I64 -[[Hash.hashI64(13)]]-> a | a has Hasher"
)
}
#[test]
fn choose_bool_for_hash() {
infer_queries!(
indoc!(
r#"
app "test" provides [main] to "./platform"
main =
\h -> Hash.hash h Bool.true
# ^^^^^^^^^
"#
),
@"Hash#Hash.hash(1) : a, Bool -[[Hash.hashBool(9)]]-> a | a has Hasher"
) )
} }

View file

@ -1487,6 +1487,24 @@ mod hash {
use super::{assert_evals_to, build_test}; use super::{assert_evals_to, build_test};
use roc_std::RocList; use roc_std::RocList;
#[test]
fn bool_false() {
assert_evals_to!(
&build_test("Bool.false"),
RocList::from_slice(&[0]),
RocList<u8>
)
}
#[test]
fn bool_true() {
assert_evals_to!(
&build_test("Bool.true"),
RocList::from_slice(&[1]),
RocList<u8>
)
}
#[test] #[test]
fn i8() { fn i8() {
assert_evals_to!( assert_evals_to!(