Last active
June 7, 2016 01:25
-
-
Save stockwellb/3bf4faac552d9b2d0ccab0f39d0be9bb to your computer and use it in GitHub Desktop.
Hello world in Elixir with some odd twists
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule HelloWorld do | |
def greet("") do | |
{:ok, "Hello World"} | |
end | |
def greet([]) do | |
{:ok, "Hello World"} | |
end | |
def greet(names) when is_list(names) do | |
name_list = Joiner.join(names,", ", " and ") | |
{:ok, "Hello #{name_list}"} | |
end | |
def greet(name) do | |
{:ok, "Hello #{name}"} | |
end | |
end | |
defmodule Joiner do | |
def join(list, sep, last_sep) do | |
list |> do_join(sep, last_sep) |> Enum.join | |
end | |
defp do_join([], _, _), do: [] | |
defp do_join([x], _, _), do: [x] | |
defp do_join([x,y], _, last_sep) do | |
[x, last_sep, y] | |
end | |
defp do_join([head|rest], sep, last_sep) do | |
[head, sep | do_join(rest, sep, last_sep)] | |
end | |
end | |
ExUnit.start | |
defmodule HelloWorldTest do | |
use ExUnit.Case, async: true | |
test "returns hello world" do | |
{_, greeting} = HelloWorld.greet("") | |
assert greeting == "Hello World" | |
end | |
test "return hello <username>" do | |
name = "Bruce" | |
{_, greeting} = HelloWorld.greet(name) | |
assert greeting == "Hello " <> name | |
end | |
test "returns hello world for no users" do | |
names = [] | |
{_, greeting} = HelloWorld.greet(names) | |
assert greeting == "Hello World" | |
end | |
test "returns hello user1, user2 ...." do | |
names = ["Bruce", "Lora", "Carter"] | |
{_, greeting} = HelloWorld.greet(names) | |
assert greeting == "Hello Bruce, Lora and Carter" | |
end | |
end | |
defmodule JoinerTests do | |
use ExUnit.Case, async: true | |
test "join many names" do | |
value = Joiner.join(["a", "b", "c", "d"], ", ", " and ") | |
assert value == "a, b, c and d" | |
end | |
test "join two names" do | |
value = Joiner.join(["a", "b"], ", ", " and ") | |
assert value == "a and b" | |
end | |
test "join one names" do | |
value = Joiner.join(["a"], ", ", " and ") | |
assert value == "a" | |
end | |
test "join empty names" do | |
value = Joiner.join([], ", ", " and ") | |
assert value == "" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment