-
Notifications
You must be signed in to change notification settings - Fork 1
/
gilded_rose_driver.ex
53 lines (45 loc) · 1.47 KB
/
gilded_rose_driver.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
defmodule GildedRose.Driver do
def run(days) do
items = [
%Item{name: "+5 Dexterity Vest", sell_in: 10, quality: 20},
%Item{name: "Aged Brie", sell_in: 2, quality: 0},
%Item{name: "Elixir of the Mongoose", sell_in: 5, quality: 7},
%Item{name: "Sulfuras, Hand of Ragnaros", sell_in: 0, quality: 80},
%Item{name: "Sulfuras, Hand of Ragnaros", sell_in: -1, quality: 80},
%Item{name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 15, quality: 20},
%Item{name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 10, quality: 49},
%Item{name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 5, quality: 49},
%Item{name: "Conjured Mana Cake", sell_in: 3, quality: 6}
]
items
|> age_items(days)
|> report_with_greeting()
end
def age_items(items, days) do
aged_items = Stream.unfold(items, fn items ->
{items, GildedRose.update_quality(items)}
end)
Enum.zip(0..days, aged_items)
end
def report_with_greeting(aged_items) do
"OMGHAI!\n" <> report(aged_items)
end
def report(aged_items) do
aged_items
|> Enum.map(fn {day, items} ->
report_day(items, day)
end)
|> Enum.join("\n\n")
end
def report_day(items, day) do
header = """
-------- day #{day} --------
name, sellIn, quality
"""
body = Enum.map(items, fn item ->
"#{item.name}, #{item.sell_in}, #{item.quality}"
end)
|> Enum.join("\n")
header <> body
end
end