Skip to content

Commit 266a1fe

Browse files
author
Bernard Pietraga
committed
Add exercise 9 from chapter 14
1 parent e1a3a69 commit 266a1fe

File tree

6 files changed

+113
-0
lines changed

6 files changed

+113
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.DS_Store
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
defmodule CatCount do
2+
def run do
3+
{ _, wd } = File.cwd
4+
File.cd!("./")
5+
IO.puts "Start word count"
6+
Scheduler.schedule(CatCount, :count, File.ls!)
7+
|> Enum.map(fn({file, count}) ->
8+
:io.format "~-30s ~10B~n", [file, count]
9+
end)
10+
IO.puts "End word count"
11+
File.cd! wd
12+
end
13+
14+
def count(scheduler, file) do
15+
send scheduler, {self(), {file, count_words(file)}}
16+
end
17+
18+
def count_words(file),
19+
do: _count_words(Regex.compile("cat"), file)
20+
defp _count_words({:ok, regex}, file),
21+
do: Regex.scan(regex, File.read!(file)) |> length
22+
defp _count_words({:error, _reason}, _file),
23+
do: -1
24+
end
25+
26+
defmodule Scheduler do
27+
def schedule(module, function, data) do
28+
data
29+
|> Enum.map(fn(x) -> spawn(module, function, [self(), x]) end)
30+
|> collect_results([])
31+
end
32+
33+
def collect_results(processes, results) do
34+
receive do
35+
{ child, result } when length(processes) > 1 ->
36+
collect_results(List.delete(processes, child), [result | results])
37+
{ _child, result } ->
38+
[result | results]
39+
end
40+
end
41+
end
42+
43+
CatCount.run
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
My cat ate sandwich.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
cat in shell!
2+
cat on the tree!
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
cat
2+
cat
3+
4+
cat
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
defmodule CatDirCount do
2+
def run do
3+
File.cd!("./")
4+
IO.puts "START CAT COUNTER"
5+
Scheduler.schedule(CatDirCount, :count, File.ls!)
6+
|> Enum.map(fn({file, count}) ->
7+
:io.format("~-40s\s|~2b~n", [file, count])
8+
end)
9+
IO.puts "END CAT COUNTER"
10+
end
11+
12+
def count(scheduler, file) do
13+
send scheduler, {self(), {file, count_words(file)}}
14+
end
15+
16+
def count_words(file),
17+
do: _count_words(Regex.compile("cat"), file)
18+
defp _count_words({:ok, regex}, file),
19+
do: Regex.scan(regex, File.read!(file)) |> length
20+
defp _count_words({:error, _reason}, _file),
21+
do: 0
22+
end
23+
24+
defmodule Scheduler do
25+
def schedule(module, function, data) do
26+
data
27+
|> Enum.map(fn(x) -> spawn(module, function, [self(), x]) end)
28+
|> collect_results([])
29+
end
30+
31+
def collect_results(processes, results) do
32+
receive do
33+
{child, result} when length(processes) > 1 ->
34+
collect_results(List.delete(processes, child), [result | results])
35+
{_child, result} ->
36+
[result | results]
37+
end
38+
end
39+
end
40+
41+
ExUnit.start
42+
43+
defmodule CatDirCountTest do
44+
use ExUnit.Case
45+
import ExUnit.CaptureIO
46+
47+
test "run returns list of files with cats" do
48+
terminal_string = """
49+
START CAT COUNTER
50+
working_with_multiple_processes_9.ex | 5
51+
cat_3.txt | 3
52+
cat_2.txt | 2
53+
cat_1.txt | 1
54+
END CAT COUNTER
55+
"""
56+
expected = capture_io fn ->
57+
CatDirCount.run
58+
end
59+
60+
assert expected == terminal_string
61+
end
62+
end

0 commit comments

Comments
 (0)