# Union --- ```text Union[TAG | TRANSIENT] Collection[VAR_TREE_LIST; TYPE.SYMBOL]] ``` ## Type Body Object Definitions ```c typedef struct { kpl_ptr var_tree, var_list; } kpl_type_body_union; ``` # Alias ```text Tag[Collection[VAR_TREE_LIST; TYPE.SYMBOL]] `alias Union[[TAG] Collection[VAR_TREE_LIST; TYPE.SYMBOL]] Transient[Collection[VAR_TREE_LIST; TYPE.SYMBOL]] `alias Union[[TRANSIENT] Collection[VAR_TREE_LIST; TYPE.SYMBOL]] ``` ## Tag Example ```text u : Tag[I64.a; I64.b; I64.c] $ (.c : 5) # u { .c {[c] c ... } { ... } // default } ``` # Operators ## ``take` # Transient Unions Return multiple types from a function Can only be retuned from functions and operations. The inner value must be moved out ## Alias ```text Result[Generic.T] `alias Transient[Generic.T.value; Void.null; Error.error] Iteration[Generic.T] `alias Transient[Generic.T.value; Void.null; Void.done; Error.error] ``` ## Default Operation When a transient union is assigned the first type specified is moved out. If no match is used and if the type is not the first specified a result with an error is returned ```text z : x / y // Result[...] z // is value if y is not zero ``` ## Operators ### \`value ### \`error ### \`null