The goal is to represent all data types within types: * [x] Non-divisible types (integer, floats, pids, etc) * [x] Binaries * [x] Unit tracking * [x] bit_size vs byte_size in guards * [x] Dynamic * [x] Atoms * [x] Maps * [x] Domain key-types * [x] map_fetch * [x] map_put * [x] map_delete * [x] map_to_list * [x] map update syntax * [x] Tuples * [x] tuple_fetch * [x] tuple_insert * [x] tuple_delete * [x] tuple_values * [x] Lists * [x] list_hd * [x] list_tl * [x] Functions * [x] Alternative representation * [x] Validate `static_arrows == []` * [ ] `fun_apply(dynamic(fun([integer()], integer())), [none()])` * [x] `apply/2` and `fun.(args...)` * [x] `fn ... -> ... end` (expr) * [x] Strong capture (expr) * [x] Inferred capture (expr) * [x] Unions of closures / empty applications * [x] Pretty printing See #14558 and #13881.