Convert the TypeScript module in `source.ts` to idiomatic Flow in `main.js`,
preserving the runtime behavior. The exhaustiveness check must still fail to
type-check if a new variant is added to the union without a matching case.
