$ L | before a def or an fn: its type, an intersection of arrows |
$interface T | before a spawn: the interface of the spawned process |
$self_interface T | the interface of the main process (default term()) |
$type name = T | a type definition, possibly recursive (if contractive) |
(s, … -> t)@[o, i] | an arrow typed at the bracket [o, i]: in its body self() has type pid(o) and receive reads at i; without @[…], the decorations are inferred |
(s, … -> t) @ u | the arrow (s, … -> t)@[u, u]; write @ (u₁ or u₂) for a union |
pid(T), pid(), fun() | pid types, the top process type, the top function type |
:a, {T, …}, integer(), … | as in Elixir, with or, and, not |
x when is_integer(x) | guards are type tests on variables |
fn -> … end | unannotated: its decorations are inferred |
| removing decorations | may make checking much slower, or keep it from finishing: see the comments of the dispatcher example |
| Ctrl/⌘ + Enter | check now; checks also run as you type |