anchor.diff:  cmd_get(_Cmd, _Object, State, Reply) ->
       {State, Reply}.
   
  +%% @doc Prints list of available commands, grouped by their real action.
  +-spec cmd_help(Cmd :: binary(), Args :: [binary()], State :: state(), Reply :: reply()) -> {state(), reply()}.
  +cmd_help(_Cmd, _Anything, #{commands := Commands} = State, Reply) ->
  +    Groups = maps:values(
  +               lists:foldl(
  +                 fun ({Name, Cmd}, Acc) ->
  +                         maps:put(Cmd, [ Name | maps:get(Cmd, Acc, []) ], Acc)
  +                 end, #{}, maps:to_list(Commands))),
  +    GroupsAsStrings = [ string:join([binary_to_list(Cmd) || Cmd <- GroupCommands], "|")
  +                        || GroupCommands <- Groups ],
  +    {State, add_reply_text("You can use any of the following commands: ~s",
  +                           [string:join(GroupsAsStrings, ", ")],
  +                           Reply)}.
  +
   %% @doc Stop the game
   -spec cmd_quit(Cmd :: binary(), Args :: [binary()], State :: state(), Reply :: reply()) -> {state(), reply()}.
   cmd_quit(_Cmd, _Object, State, Reply) ->
  
positive.code: move_to(NewLocation, #{edges := Edges} = State) ->
      State#{location := NewLocation, location_edges := maps:get(NewLocation, Edges)}.
  
  unlines(ListOfStrings) ->
      list_to_binary(string:join(ListOfStrings, "\n")).
  
  
negative.code: %% them by name later. Command dispatch table is a part of our process
  %% state, so we couldn't just use short function references (fun
  %% name/X) here, or we'll lose ability to reload changed code.
  -export([cmd_look/4, cmd_go/4, cmd_get/4, cmd_quit/4, cmd_help/4]).
  
  %% Very simple console user UI. 
  -export([console_play/0]).
  