# `Croma.TypeGen`
[🔗](https://github.com/skirino/croma/blob/main/lib/croma/type_gen.ex#L5)

Module that defines macros for ad-hoc (in other words "in-line") module definitions.

# `fixed`
*macro* 

Creates a new module that simply represents a type whose sole member is the given value.

Only atoms and integers are supported.

# `list_of`
*macro* 

An ad-hoc version of `Croma.SubtypeOfList`.

Options:
- `:define_default0?` - Boolean value that indicates whether to define `default/0` (which simply returns `[]`). Defaults to `true`.

# `nilable`
*macro* 

Creates a new module that represents a nilable type, based on the given type module `module`.

Using the given type module `nilable/1` generates a new module that defines:

- `@type t :: nil | module.t`
- `@spec valid?(term) :: boolean`
- `@spec default() :: nil`
- If the given module exports `new/1`
    - `@spec new(term) :: Croma.Result.t(t)`
    - `@spec new!(term) :: t`

This is useful in defining a struct with nilable fields using `Croma.Struct`.

## Examples
    iex> use Croma
    ...> defmodule I do
    ...>   use Croma.SubtypeOfInt, min: 0
    ...> end
    ...> defmodule S do
    ...>   use Croma.Struct, fields: [not_nilable_int: I, nilable_int: Croma.TypeGen.nilable(I)]
    ...> end
    ...> S.new(%{not_nilable_int: 0, nilable_int: nil})
    %S{nilable_int: nil, not_nilable_int: 0}

# `union`
*macro* 

Creates a new module that represents a sum type of the given types.

The argument must be a list of type modules.
Note that the specified types should be mutually disjoint;
otherwise `new/1` can return unexpected results depending on the order of the type modules.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
