mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-15 00:05:02 +00:00
Merge pull request #5222 from roc-lang/hash-bool
Implement Hash for Bool
This commit is contained in:
commit
37d4ff9fdc
5 changed files with 55 additions and 12 deletions
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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!(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue