Skip to content
This repository was archived by the owner on Sep 22, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
use Mix.Config

config :orangeade, default_start_seed: 1

import_config "#{Mix.env()}.exs"
1 change: 1 addition & 0 deletions config/dev.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use Mix.Config
1 change: 1 addition & 0 deletions config/prod.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use Mix.Config
3 changes: 3 additions & 0 deletions config/test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
use Mix.Config

config :orangeade, default_start_seed: ExUnit.configuration()[:seed]
6 changes: 5 additions & 1 deletion lib/orangeade.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
defmodule Orangeade.SeedState do
defmodule Orangeade.Application.SeedState do
use Agent

alias Psi.LinearCongruentialGenerator, as: LCG
Expand All @@ -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__
Expand Down
18 changes: 18 additions & 0 deletions lib/orangeade/application/supervisor.ex
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion lib/orangeade/generator/big_natural.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion lib/orangeade/generator/bound_natural.ex
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
18 changes: 0 additions & 18 deletions lib/orangeade/supervisor.ex

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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()
Expand Down
26 changes: 15 additions & 11 deletions test/orangeade/generator/big_natural_test.exs
Original file line number Diff line number Diff line change
@@ -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
3 changes: 2 additions & 1 deletion test/test_helper.exs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
ExUnit.start()
seed = Application.get_env(:orangeade, :default_start_seed)
ExUnit.start(seed: seed)