diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..7162132 --- /dev/null +++ b/config/config.exs @@ -0,0 +1,5 @@ +use Mix.Config + +config :orangeade, default_start_seed: 1 + +import_config "#{Mix.env()}.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..d2d855e --- /dev/null +++ b/config/dev.exs @@ -0,0 +1 @@ +use Mix.Config diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..d2d855e --- /dev/null +++ b/config/prod.exs @@ -0,0 +1 @@ +use Mix.Config diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..9e004ad --- /dev/null +++ b/config/test.exs @@ -0,0 +1,3 @@ +use Mix.Config + +config :orangeade, default_start_seed: ExUnit.configuration()[:seed] diff --git a/lib/orangeade.ex b/lib/orangeade.ex index 4a1c713..7c48e9c 100644 --- a/lib/orangeade.ex +++ b/lib/orangeade.ex @@ -20,6 +20,10 @@ defmodule Orangeade do defdelegate term(), to: Gen.Term, as: :stream def start(_type, _args) do - Orangeade.Supervisor.start_link(1) + Orangeade.Application.Supervisor.start_link(start_seed: get_default_seed()) + end + + defp get_default_seed do + Application.get_env(:orangeade, :default_start_seed) end end diff --git a/lib/orangeade/seed_state.ex b/lib/orangeade/application/seed_state.ex similarity index 86% rename from lib/orangeade/seed_state.ex rename to lib/orangeade/application/seed_state.ex index 0d75ddf..b6d074b 100644 --- a/lib/orangeade/seed_state.ex +++ b/lib/orangeade/application/seed_state.ex @@ -1,4 +1,4 @@ -defmodule Orangeade.SeedState do +defmodule Orangeade.Application.SeedState do use Agent alias Psi.LinearCongruentialGenerator, as: LCG @@ -7,12 +7,12 @@ defmodule Orangeade.SeedState do Starts a new seed state which is a big natural numbers stream which is created with start_seed passed by supervisor. """ - def start_link(start_seed: start_seed) do + def start_link(start_seed: seed) do Agent.start_link( fn -> LCG.stream( generator: Orangeade.Generator.BigNatural.instance(), - seed: start_seed + seed: seed ) end, name: __MODULE__ diff --git a/lib/orangeade/application/supervisor.ex b/lib/orangeade/application/supervisor.ex new file mode 100644 index 0000000..f812bb0 --- /dev/null +++ b/lib/orangeade/application/supervisor.ex @@ -0,0 +1,18 @@ +defmodule Orangeade.Application.Supervisor do + use Supervisor + + def start_link(start_seed: seed) do + Supervisor.start_link(__MODULE__, seed) + end + + def init(seed) do + children = [ + %{ + id: SeedState, + start: {Orangeade.Application.SeedState, :start_link, [[start_seed: seed]]} + } + ] + + Supervisor.init(children, strategy: :one_for_one) + end +end diff --git a/lib/orangeade/generator/big_natural.ex b/lib/orangeade/generator/big_natural.ex index a2385ac..a4f8079 100644 --- a/lib/orangeade/generator/big_natural.ex +++ b/lib/orangeade/generator/big_natural.ex @@ -2,7 +2,7 @@ defmodule Orangeade.Generator.BigNatural do alias Psi.LinearCongruentialGenerator, as: LCG def stream() do - alias Orangeade.SeedState + alias Orangeade.Application.SeedState seed = SeedState.get_next() LCG.stream(generator: Orangeade.Generator.BigNatural.instance(), seed: seed) diff --git a/lib/orangeade/generator/bound_natural.ex b/lib/orangeade/generator/bound_natural.ex index 0ca0907..b0515e9 100644 --- a/lib/orangeade/generator/bound_natural.ex +++ b/lib/orangeade/generator/bound_natural.ex @@ -1,7 +1,7 @@ defmodule Orangeade.Generator.BoundNatural do def stream(limit: i) do alias Psi.LinearCongruentialGenerator, as: LCG - alias Orangeade.SeedState + alias Orangeade.Application.SeedState seed = SeedState.get_next() s = LCG.stream(generator: Orangeade.Generator.BigNatural.instance(), seed: seed) diff --git a/lib/orangeade/supervisor.ex b/lib/orangeade/supervisor.ex deleted file mode 100644 index fdbdbd9..0000000 --- a/lib/orangeade/supervisor.ex +++ /dev/null @@ -1,18 +0,0 @@ -defmodule Orangeade.Supervisor do - use Supervisor - - def start_link(start_seed) do - Supervisor.start_link(__MODULE__, start_seed) - end - - def init(start_seed) do - children = [ - %{ - id: SeedState, - start: {Orangeade.SeedState, :start_link, [[start_seed: start_seed]]} - } - ] - - Supervisor.init(children, strategy: :one_for_one) - end -end diff --git a/test/orangeade/seed_state_test.exs b/test/orangeade/application/seed_state_test.exs similarity index 74% rename from test/orangeade/seed_state_test.exs rename to test/orangeade/application/seed_state_test.exs index 6452228..0126321 100644 --- a/test/orangeade/seed_state_test.exs +++ b/test/orangeade/application/seed_state_test.exs @@ -1,7 +1,7 @@ -defmodule Orangeade.SeedStateTest do +defmodule Orangeade.Application.SeedStateTest do use ExUnit.Case - alias Orangeade.SeedState + alias Orangeade.Application.SeedState test "Check if each next seed from get_next/1 is different" do list_of_seeds = for _n <- 1..100, do: SeedState.get_next() diff --git a/test/orangeade/generator/big_natural_test.exs b/test/orangeade/generator/big_natural_test.exs index d2f737e..ef6958b 100644 --- a/test/orangeade/generator/big_natural_test.exs +++ b/test/orangeade/generator/big_natural_test.exs @@ -1,16 +1,20 @@ defmodule Orangeade.Generator.BigNaturalTest do - use ExUnit.Case, async: true - import Orangeade.Generator.BigNatural, only: [stream: 0] + use ExUnit.Case + alias Orangeade.Generator.BigNatural - test "check 5 first generated elements" do - generated = Caffeine.Stream.take(stream(), 5) + test "generated elements are always natural" do + list_of_elements = + BigNatural.stream() + |> Caffeine.Stream.take(10) - assert generated == [ - 1, - 7_806_831_264_735_756_412, - 9_396_908_728_118_811_419, - 11_960_119_808_228_829_710, - 7_062_582_979_898_595_269 - ] + assert Enum.all?(list_of_elements, &is_natural/1) + end + + defp is_natural(n) when n >= 0 do + true + end + + defp is_natural(_n) do + false end end diff --git a/test/test_helper.exs b/test/test_helper.exs index 869559e..20f76e1 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1,2 @@ -ExUnit.start() +seed = Application.get_env(:orangeade, :default_start_seed) +ExUnit.start(seed: seed)