Guest User

Untitled

a guest
Dec 2nd, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 3.43 KB | None | 0 0
  1. %%%-------------------------------------------------------------------
  2. %%% @author Utena
  3. %%% @copyright (C) 2016, <COMPANY>
  4. %%% @doc
  5. %%%
  6. %%% @end
  7. %%% Created : 02. Dec 2016 11:43 AM
  8. %%%-------------------------------------------------------------------
  9. -module(part2).
  10. -author("Utena").
  11. -behavior(gen_statem).
  12.  
  13. %% API
  14. -export([]).
  15.  
  16.  
  17. %% States
  18.  
  19. -export([start/0,stop/0]).
  20. -export([terminate/3,code_change/4,init/1,callback_mode/0]).
  21. -export([path/1, show/0]).
  22. -export([handle_event/4]).
  23.  
  24.  
  25. %% API.  This example uses a registered name name()
  26. %% and does not link to the caller.
  27. start() ->
  28.   gen_statem:start({local,name()}, ?MODULE, [], []).
  29. stop() ->
  30.   gen_statem:stop(name()).
  31.  
  32. name() -> aoc_2_part2.
  33.  
  34. %% Stuff I need
  35. terminate(_Reason, _State, _Data) ->
  36.   void.
  37. code_change(_Vsn, State, Data, _Extra) ->
  38.   {ok,State,Data}.
  39. init(_) ->
  40.   {ok, five, ok}.
  41.  
  42. path([Dir|Rest]) ->
  43.   gen_statem:cast(name(), {direction, Dir}),
  44.   path(Rest);
  45. path([]) ->
  46.   ok.
  47.  
  48. show() ->
  49.   gen_statem:cast(name(), {show_state}).
  50.  
  51. callback_mode() -> handle_event_function.
  52.  
  53. handle_event(_, {show_state}, State, _) ->
  54.   io:format("~w~n",[State]),
  55.   {keep_state, ok};
  56.  
  57. handle_event(_, {direction, Dir}, State, _) ->
  58.  
  59.   case State of
  60.     one ->
  61.       case Dir of
  62.         $D -> {next_state, three, ok};
  63.         _ -> {keep_state, ok}
  64.       end;
  65.     two ->
  66.       case Dir of
  67.         $R -> {next_state, three, ok};
  68.         $D -> {next_state, six, ok};
  69.         _ -> {keep_state, ok}
  70.       end;
  71.     three ->
  72.       case Dir of
  73.         $U -> {next_state, one, ok};
  74.         $D -> {next_state, seven, ok};
  75.         $R -> {next_state, four, ok};
  76.         $L -> {next_state, two, ok};
  77.         _ -> {keep_state, ok}
  78.       end;
  79.     four ->
  80.       case Dir of
  81.         $D -> {next_state, eight, ok};
  82.         $L -> {next_state, three, ok};
  83.         _ -> {keep_state, ok}
  84.       end;
  85.     five ->
  86.       case Dir of
  87.         $R -> {next_state, six, ok};
  88.         _ -> {keep_state, ok}
  89.       end;
  90.     six ->
  91.       case Dir of
  92.         $L -> {next_state, five, ok};
  93.         $R -> {next_state, seven, ok};
  94.         $U -> {next_state, two, ok};
  95.         $D -> {next_state, alpha, ok};
  96.         _ -> {keep_state, ok}
  97.       end;
  98.     seven ->
  99.       case Dir of
  100.         $U -> {next_state, three, ok};
  101.         $D -> {next_state, beta, ok};
  102.         $R -> {next_state, eight, ok};
  103.         $L -> {next_state, six, ok};
  104.         _ -> {keep_state, ok}
  105.       end;
  106.     eight ->
  107.       case Dir of
  108.         $U -> {next_state, four, ok};
  109.         $D -> {next_state, charlie, ok};
  110.         $R -> {next_state, nine, ok};
  111.         $L -> {next_state, seven, ok};
  112.         _ -> {keep_state, ok}
  113.       end;
  114.     nine ->
  115.       case Dir of
  116.         $L -> {next_state, eight, ok};
  117.         _ -> {keep_state, ok}
  118.       end;
  119.     alpha ->
  120.       case Dir of
  121.         $U -> {next_state, six, ok};
  122.         $R -> {next_state, beta, ok};
  123.         _ -> {keep_state, ok}
  124.       end;
  125.     beta ->
  126.       case Dir of
  127.         $U -> {next_state, seven, ok};
  128.         $D -> {next_state, delta, ok};
  129.         $R -> {next_state, charlie, ok};
  130.         $L -> {next_state, alpha, ok};
  131.         _ -> {keep_state, ok}
  132.       end;
  133.     charlie ->
  134.       case Dir of
  135.         $U -> {next_state, eight, ok};
  136.         $L -> {next_state, beta, ok};
  137.         _ -> {keep_state, ok}
  138.       end;
  139.     delta ->
  140.       case Dir of
  141.         $U -> {next_state, beta, ok};
  142.         _ -> {keep_state, ok}
  143.       end
  144.   end.
Add Comment
Please, Sign In to add comment