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,
addU64,
addU128,
hashBool,
hashI8,
hashI16,
hashI32,
@ -20,7 +21,7 @@ interface Hash
hashList,
hashUnordered,
] imports [
Bool.{ isEq },
Bool.{ Bool, isEq },
List,
Str,
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 ->
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.
hashI8 : a, I8 -> a | a has Hasher
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> {
use FlatHash::*;
match symbol {
Symbol::BOOL_BOOL => Some(SingleLambdaSetImmediate(Symbol::HASH_HASH_BOOL)),
Symbol::NUM_U8 | Symbol::NUM_UNSIGNED8 => {
Some(SingleLambdaSetImmediate(Symbol::HASH_ADD_U8))
}

View file

@ -1548,16 +1548,17 @@ define_builtins! {
6 HASH_ADD_U32: "addU32"
7 HASH_ADD_U64: "addU64"
8 HASH_ADD_U128: "addU128"
9 HASH_HASH_I8: "hashI8"
10 HASH_HASH_I16: "hashI16"
11 HASH_HASH_I32: "hashI32"
12 HASH_HASH_I64: "hashI64"
13 HASH_HASH_I128: "hashI128"
14 HASH_HASH_NAT: "hashNat"
15 HASH_COMPLETE: "complete"
16 HASH_HASH_STR_BYTES: "hashStrBytes"
17 HASH_HASH_LIST: "hashList"
18 HASH_HASH_UNORDERED: "hashUnordered"
9 HASH_HASH_BOOL: "hashBool"
10 HASH_HASH_I8: "hashI8"
11 HASH_HASH_I16: "hashI16"
12 HASH_HASH_I32: "hashI32"
13 HASH_HASH_I64: "hashI64"
14 HASH_HASH_I128: "hashI128"
15 HASH_HASH_NAT: "hashNat"
16 HASH_COMPLETE: "complete"
17 HASH_HASH_STR_BYTES: "hashStrBytes"
18 HASH_HASH_LIST: "hashList"
19 HASH_HASH_UNORDERED: "hashUnordered"
}
14 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 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]
fn i8() {
assert_evals_to!(