-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathgen.slots_payouts.ex
59 lines (52 loc) · 1.19 KB
/
gen.slots_payouts.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
defmodule Mix.Tasks.Gen.Payouts do
@shortdoc "Generates slot machine payouts from a CSV"
@moduledoc """
This CSV is waiting for:
probability,multiplier
"""
use Mix.Task
alias NimbleCSV.RFC4180, as: CSV
def run(args) do
if Enum.empty?(args) do
Mix.shell().info("Needs to receive a file URL.")
else
args |> List.first() |> create
end
end
defp create(path) do
Mix.Task.run("app.start")
path
|> parse_csv()
|> validate_probabilities()
|> insert_payouts()
end
defp parse_csv(path) do
path
|> File.stream!()
|> CSV.parse_stream()
|> Enum.map(fn [probability, muliplier] ->
%{
probability: String.to_float(probability),
multiplier: String.to_float(muliplier)
}
end)
end
defp validate_probabilities(list) do
list
|> Enum.map_reduce(0, fn payout, acc -> {payout, payout.probability + acc} end)
|> case do
{_, x} ->
if x < 1 do
list
else
raise "The sum of all payout probabilities is bigger 1."
end
end
end
defp insert_payouts(list) do
list
|> Enum.map(fn payout ->
Safira.Slots.create_payout(payout)
end)
end
end