Skip to content

Commit 1a0b89b

Browse files
author
Bernard Pietraga
committed
Add exercise 3 from chapter 21
1 parent 631217b commit 1a0b89b

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
defmodule Tracer do
2+
def dump_args(args) do
3+
args
4+
|> Enum.map(&inspect/1)
5+
|> Enum.join(", ")
6+
end
7+
8+
def dump_defn(name, args), do:
9+
"#{name}(#{dump_args(args)})"
10+
11+
defmacro def(definition = {:when, [{name, _, args}, _guard]}, do: content), do:
12+
traced_def(definition, name, args, content)
13+
defmacro def(definition = {name, _, args}, do: content), do:
14+
traced_def(definition, name, args, content)
15+
16+
defp traced_def(definition, name, args, content) do
17+
quote do
18+
Kernel.def(unquote(definition)) do
19+
IO.puts """
20+
#{IO.ANSI.blue}\
21+
==> method call: \
22+
#{IO.ANSI.green}\
23+
#{IO.ANSI.bright}\
24+
#{Tracer.dump_defn(unquote(name), unquote(args))}\
25+
"""
26+
result = unquote(content)
27+
IO.puts "#{IO.ANSI.yellow}\ <== result: #{result}"
28+
result
29+
end
30+
end
31+
end
32+
33+
defmacro __using__(_opts) do
34+
quote do
35+
import Kernel, except: [def: 2]
36+
import unquote(__MODULE__), only: [def: 2]
37+
end
38+
end
39+
end
40+
41+
defmodule MathTracer do
42+
use Tracer
43+
44+
def puts_sum_three(a, b, c), do:
45+
IO.inspect a + b + c
46+
47+
def add_list(list), do:
48+
Enum.reduce(list, 0, &(&1 + &2))
49+
50+
def is_one(x) when is_number(x) and x == 1, do:
51+
"It is one!"
52+
end
53+
54+
ExUnit.start
55+
56+
defmodule MathTracerTest do
57+
use ExUnit.Case
58+
import ExUnit.CaptureIO
59+
60+
test "puts_sum_three" do
61+
messages_string = " \e[34m ==> method call: \e"
62+
<> "[32m \e[1m puts_sum_three(1, 2, 3)\n6\n\e[33m <== result: 6\n"
63+
64+
expected = capture_io fn ->
65+
MathTracer.puts_sum_three(1, 2, 3)
66+
end
67+
68+
assert expected == messages_string
69+
end
70+
71+
test "add_list" do
72+
73+
messages_string = " \e[34m ==> method call: \e[32m \e"
74+
<> "[1m add_list([1, 2, 3])\n\e[33m <== result: 6\n"
75+
76+
expected = capture_io fn ->
77+
MathTracer.add_list([1, 2, 3])
78+
end
79+
80+
assert expected == messages_string
81+
end
82+
end

0 commit comments

Comments
 (0)