Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Triangles do
- def area({a,b}) when is_number(a) and is_number(b) do
- a * b * 0.5
- end
- def area(_) do
- "Unknown arguments"
- end
- @spec lines_lengths!(String.t) :: Stream.t
- def lines_lengths! filepath do
- File.stream!(filepath)
- |> Stream.map(&String.replace(&1, "\n", ""))
- |> Stream.map(&{&1, String.length(&1)})
- |> Stream.with_index
- end
- defp val {{_, val}, _} do
- val
- end
- def longest_line_length! filepath do
- lines_lengths!(filepath)
- |> Enum.reduce(
- {{"", 0},-1},
- &(if val(&1) > val(&2) do &1 else &2 end)
- )
- end
- def longest_line! filepath do
- longest_line_length! filepath
- end
- def words_per_line! filepath do
- lines_lengths!(filepath)
- |> Stream.map(
- fn {{conts,_},index} ->
- conts
- |> (&String.split(&1,~r/\W+/)).() # Anonymous function needs to be evaluated?
- |> Enum.filter(&(String.length(&1) > 0)) # filter out empty splits
- |> (&{{conts, length(&1)}, index}).()
- end
- )
- end
- end
- defmodule TrianglesTest do
- def test_lines_lengths! do
- Triangles.lines_lengths!("./test.exs")
- |> print_line_info("Length")
- end
- def test_longest_line_length! do
- {{_, length}, line} = Triangles.longest_line_length!("./test.exs")
- IO.puts("#{line + 1}. Length: #{length}")
- end
- def test_longest_line! do
- {{conts, _}, line} = Triangles.longest_line!("./test.exs")
- IO.puts("#{line + 1}. \"#{conts}\"")
- end
- def test_words_per_line! do
- Triangles.words_per_line!("./test.exs")
- |> print_line_info("Words")
- end
- defp print_line_info(stream, attr) do
- stream |> Enum.each(
- fn({{_, value}, line}) ->
- IO.puts "#{line + 1}. #{attr}: #{value}"
- end
- )
- end
- end
- TrianglesTest.test_longest_line_length!
- TrianglesTest.test_longest_line!
- TrianglesTest.test_words_per_line!
- IO.puts [1,-1,1,-1,1,-1] |>
- Stream.filter(&(is_number(&1) and &1 > 0)) |>
- Enum.reduce(&(&1 + &2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement