# ExternalState

Store state, as a properties structure, externally to a process.

## Usage
defmodule MyGenserver do
  use ExternalState, persist: false, props: [foo: true]

  def init(:ok) do
    init_ex_state() # external state is now at the defaults specified in use

  # ...

  def do_foo do
    # ... something that sets foo to true ...
    merge_ex_state(foo: true)

  def undo_foo do
    # ... something that sets foo to false ...
    merge_ex_state(foo: false)
    # or: merge_ex_state(%{foo: false})

  def foo? do


## API
The following are added to your module when you `use` ExternalState:

- `@ex_state_struct` An atom name for your external state structure
- `default_ex_state/0` Get a state structure with default values from props
- `init_ex_state/0` Initialize your external state; must call once, multiple calls are okay
- `get_ex_state/0` Get the current external state or nil if no init yet
- `put_ex_state/1` Set the external state, returns the state or nil if no init yet
- `merge_ex_state/1` Update the external state with values from the
  parameter, which can be a keyword list of keys and values or a map.

If ExternalState is `use`d with `persist: true`, then the external state will
remain valid after the process that calls `init_ex_state/0` exits. This
is the default.

## Installation

If [available in Hex](, the package can be installed
by adding `external_state` to your list of dependencies in `mix.exs`:

def deps do
    {:external_state, "~> 1.0.3"}

Documentation can be generated with [ExDoc](
and published on [HexDocs]( Once published, the docs can
be found at [](