Sha256: bc0e0433280c45c04bcaeb5769a7a7166906c826ab29c02eaa3f7b87b22f2fd9

Contents?: true

Size: 1.51 KB

Versions: 324

Compression:

Stored size: 1.51 KB

Contents

defmodule Clock do
  defstruct hour: 0, minute: 0
  @type t :: %Clock{hour: integer, minute: integer}
  @type t(hour, minute) :: %Clock{hour: hour, minute: minute}

  @doc """
  Returns a string representation of a clock:

      iex> Clock.new(8, 9) |> to_string
      "08:09"
  """
  @spec new(integer, integer) :: Clock.t
  def new(hour, minute) do
    rollover(%Clock{hour: hour, minute: minute})
  end

  @doc """
  Adds two clock times:

      iex> Clock.new(10, 0) |> Clock.add(3) |> to_string
      "10:03"
  """
  @spec add(Clock.t, integer) :: Clock.t
  def add(%Clock{hour: hour, minute: minute}, add_minute) do
    new(hour, minute + add_minute)
  end

  defp rollover(%Clock{hour: hour, minute: minute}) do
    {carry_hour, minute} = roll_minute(minute)
    %Clock{hour: roll_hour(hour + carry_hour), minute: minute}
  end

  defp roll_hour(hour) when hour < 0 and rem(hour, 24) == 0, do: 0
  defp roll_hour(hour) when hour < 0, do: 24 + rem(hour, 24)
  defp roll_hour(hour) when hour >= 24, do: rem(hour, 24)
  defp roll_hour(hour), do: hour

  defp roll_minute(minute) when minute < 0 do
    {div(minute, 60) - 1, 60 + rem(minute, 60)}
  end
  defp roll_minute(minute) when minute >= 60 do
    {div(minute, 60), rem(minute, 60)}
  end
  defp roll_minute(minute), do: {0, minute}

  defimpl String.Chars, for: Clock do
    def to_string(%Clock{hour: hour, minute: minute}) do
      "#{format(hour)}:#{format(minute)}"
    end

    defp format(number) do
      number |> Integer.to_string |> String.pad_leading(2, "0")
    end
  end
end

Version data entries

324 entries across 324 versions & 1 rubygems

Version Path
trackler-2.2.1.109 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.108 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.107 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.106 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.105 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.104 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.103 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.102 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.101 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.100 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.99 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.98 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.97 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.96 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.95 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.94 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.93 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.92 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.91 tracks/elixir/exercises/clock/example.exs
trackler-2.2.1.90 tracks/elixir/exercises/clock/example.exs