# Record is a feature similar to object (literal notation) in JS
# `.` means the field is public
john = {
    .name = "John Smith";
    .age = !27
}

print! john.name
print! john.age
assert john.name == "John Smith"
assert john.age == 27
# john.age.update! old -> old + 1
# assert john.age == 28
# Record is not Dict, so `john["name"]` is invalid

# A record whose values are all types will also behave as a type
Person! = {
    .name = Str;
    .age = Nat!
}

print! Person!.name
assert Person!.name == Str
# assert john in Person!

for! {.x = 1; .y = 2}.as_dict().items(), ((k, v),) =>
    # k: Str, v: Int
    print! k, v

# {=} means the empty record (type), which is the subtype of all records
iterate_rec! r: {=} =
    for! r.as_dict().items(), ((k, v),) =>
        print! k, v
iterate_rec! {a = 1; b = 2}
iterate_rec! {a = 1; b = 1.2; c = "a"}
