mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-15 16:25:05 +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,
|
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)
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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 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!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue