exec cue eval coalesce.cue
cmp stdout expect-stdout-cue

-- frontmatter.toml --
title = "Null Coalescing"
description = ""

-- text.md --
<!-- jba: the terms here are confusing. "Null coalescing" is actually not
  that, but then there is something called "actual null coalescing."
  
  Just say that because _|_ | X evaluates to X, you can use disjunction
  to represent fallback values.
  
  And then you can use that to effectively type-check with a default value.
-->

With null coalescing we really mean error, or bottom, coalescing.
The defaults mechanism for disjunctions can also be
used to provide fallback values in case an expression evaluates to bottom.

In the example the fallback values are specified
for `a` and `b` in case the list index is out of bounds.

To do actual null coalescing one can unify a result with the desired type
to force an error.
In that case the default will be used if either the lookup fails or
the result is not of the desired type.

-- coalesce.cue --
list: [ "Cat", "Mouse", "Dog" ]

a: *list[0] | "None"
b: *list[5] | "None"

n: [null]
v: *(n[0]&string) | "default"

-- expect-stdout-cue --
list: ["Cat", "Mouse", "Dog"]
a: "Cat"
b: "None"
n: [null]
v: "default"
