Skip to content

Instantly share code, notes, and snippets.

@petros
Last active August 23, 2022 16:50
Show Gist options
  • Save petros/5659061fbaa406a6b55508e56e555663 to your computer and use it in GitHub Desktop.
Save petros/5659061fbaa406a6b55508e56e555663 to your computer and use it in GitHub Desktop.
Remote Control Car - Elixir - Exercism
defmodule RemoteControlCar do
@enforce_keys [:nickname]
defstruct [:nickname, battery_percentage: 100, distance_driven_in_meters: 0]
@spec new(String.t()) :: struct()
def new(nickname \\ "none") do
%RemoteControlCar{nickname: nickname}
end
@spec display_distance(remote_car :: struct()) :: String.t()
def display_distance(%RemoteControlCar{} = remote_car) do
"#{remote_car.distance_driven_in_meters} meters"
end
@spec display_battery(remote_car :: struct()) :: String.t()
def display_battery(%RemoteControlCar{battery_percentage: 0}), do: "Battery empty"
def display_battery(%RemoteControlCar{} = remote_car),
do: "Battery at #{remote_car.battery_percentage}%"
@spec drive(remote_car :: struct()) :: struct()
def drive(%RemoteControlCar{battery_percentage: 0} = remote_car), do: remote_car
def drive(%RemoteControlCar{} = remote_car) do
%{
remote_car
| battery_percentage: remote_car.battery_percentage - 1,
distance_driven_in_meters: remote_car.distance_driven_in_meters + 20
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment