Current section
Files
Jump to
Current section
Files
src/robot_simulator.erl
-module(robot_simulator).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([create/2, move/3]).
-export_type([direction/0, position/0, robot/0]).
-type direction() :: north | east | south | west.
-type position() :: {position, integer(), integer()}.
-type robot() :: {robot, direction(), position()}.
-file("/Users/bradleymehder/Developer/Frameworks/Gleam/playground/src/robot_simulator.gleam", 19).
-spec create(direction(), position()) -> robot().
create(Direction, Position) ->
{robot, Direction, Position}.
-file("/Users/bradleymehder/Developer/Frameworks/Gleam/playground/src/robot_simulator.gleam", 44).
-spec turn_right(robot()) -> robot().
turn_right(Robot) ->
case erlang:element(2, Robot) of
north ->
erlang:setelement(2, Robot, east);
east ->
erlang:setelement(2, Robot, south);
south ->
erlang:setelement(2, Robot, west);
west ->
erlang:setelement(2, Robot, north)
end.
-file("/Users/bradleymehder/Developer/Frameworks/Gleam/playground/src/robot_simulator.gleam", 53).
-spec turn_left(robot()) -> robot().
turn_left(Robot) ->
case erlang:element(2, Robot) of
north ->
erlang:setelement(2, Robot, west);
east ->
erlang:setelement(2, Robot, north);
south ->
erlang:setelement(2, Robot, east);
west ->
erlang:setelement(2, Robot, south)
end.
-file("/Users/bradleymehder/Developer/Frameworks/Gleam/playground/src/robot_simulator.gleam", 62).
-spec advance(robot()) -> robot().
advance(Robot) ->
{position, X, Y} = erlang:element(3, Robot),
case erlang:element(2, Robot) of
north ->
erlang:setelement(3, Robot, {position, X, Y + 1});
east ->
erlang:setelement(3, Robot, {position, X + 1, Y});
south ->
erlang:setelement(3, Robot, {position, X, Y - 1});
west ->
erlang:setelement(3, Robot, {position, X - 1, Y})
end.
-file("/Users/bradleymehder/Developer/Frameworks/Gleam/playground/src/robot_simulator.gleam", 23).
-spec move(direction(), position(), binary()) -> robot().
move(Direction, Position, Instructions) ->
Robot = create(Direction, Position),
Move_folder = fun(Robot@1, Instruction) -> case Instruction of
<<"R"/utf8>> ->
turn_right(Robot@1);
<<"L"/utf8>> ->
turn_left(Robot@1);
<<"A"/utf8>> ->
advance(Robot@1);
_ ->
erlang:error(#{gleam_error => panic,
message => <<"unreachable"/utf8>>,
module => <<"robot_simulator"/utf8>>,
function => <<"move"/utf8>>,
line => 35})
end end,
_pipe = Instructions,
_pipe@1 = gleam@string:to_graphemes(_pipe),
gleam@list:fold(_pipe@1, Robot, Move_folder).