README.md

# FunServer

[![hex.pm version](https://img.shields.io/hexpm/v/fun_server.svg?style=flat)](https://hex.pm/packages/fun_server)
[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg?style=flat)](https://hexdocs.pm/fun_server/)
[![Total Download](https://img.shields.io/hexpm/dt/fun_server.svg?style=flat)](https://hex.pm/packages/fun_server)
[![License](https://img.shields.io/hexpm/l/fun_server.svg?style=flat)](https://github.com/gspasov/fun_server/blob/main/LICENSE)

FunServer is a way of writing `GenServer` using functions instead of callbacks.

## Installation
Add `:fun_server` as a dependency to your project's mix.exs:

```elixir
defp deps do
  [
    {:fun_server, "~> 0.1.0"}
  ]
end
```

## Usage

```elixir
defmodule Server do
  use FunServer

  def start_link(_args) do
    FunServer.start_link(__MODULE__, fn -> {:ok, []} end, name: __MODULE__)
  end

  def state() do 
    FunServer.sync(fn _from, state -> {:reply, state, state} end, __MODULE__)
  end

  def push(value) do
    value
    |> handle_push()
    |> FunServer.async(__MODULE__)
  end

  def pop(value) do
    value
    |> handle_pop()
    |> FunServer.sync(__MODULE__)
  end

  defp handle_push(value) do
    fn state ->
      {:noreply, [value | state]}
    end
  end

  defp handle_pop(value) do
    fn _from, [value | new_state] ->
      {:noreply, value, new_state}
    end
  end
end
```