Sha256: 4e268edc8876302950eaa4a5f6ee6a98e87e1ae41d462a08252bc2499e4392ab

Contents?: true

Size: 1.44 KB

Versions: 131

Compression:

Stored size: 1.44 KB

Contents

defmodule BankAccount do
  @moduledoc """
  A bank account that supports access from multiple processes.
  """

  use GenServer

  ## Callbacks

  def init(_args) do
    {:ok, 0}
  end

  def handle_call(:balance, _from, balance) do
    {:reply, balance, balance}
  end

  def handle_call({:update, amount}, _from, balance) do
    {:reply, :ok, balance + amount}
  end

  def handle_call(:close, _from, balance) do
    # We stop normally and return :stopped to the caller.
    {:stop, :normal, :stopped, balance}
  end

  ## Interface for tests

  @typedoc """
  An account handle.
  """
  @opaque account :: pid

  @doc """
  Open the bank. Makes the account available.
  """
  @spec open_bank() :: account
  def open_bank() do
    {:ok, pid} = GenServer.start_link(__MODULE__, [], [])
    pid
  end

  @doc """
  Close the bank. Makes the account unavailable.
  """
  @spec close_bank(account) :: any
  def close_bank(account) do
    GenServer.stop(account)
  end

  @doc """
  Get the account's balance.
  """
  @spec balance(account) :: integer
  def balance(account) do
    if Process.alive?(account) do
      GenServer.call(account, :balance)
    else
      {:error, :account_closed}
    end
  end

  @doc """
  Update the account's balance by adding the given amount which may be negative.
  """
  def update(account, amount) do
    if Process.alive?(account) do
      GenServer.call(account, {:update, amount})
    else
      {:error, :account_closed}
    end
  end
end

Version data entries

131 entries across 131 versions & 1 rubygems

Version Path
trackler-2.2.1.119 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.118 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.117 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.116 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.115 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.114 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.113 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.111 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.110 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.109 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.108 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.107 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.106 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.105 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.104 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.103 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.102 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.101 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.100 tracks/elixir/exercises/bank-account/example.exs
trackler-2.2.1.99 tracks/elixir/exercises/bank-account/example.exs