code: def restart_on_change_helper(lambda_f, restart_map, stopstart=False,
                               restart_functions=None):
      
      if restart_functions is None:
          restart_functions = {}
      checksums = {path: path_hash(path) for path in restart_map}
      r = lambda_f()
      # create a list of lists of the services to restart
      restarts = [restart_map[path]
                  for path in restart_map
                  if path_hash(path) != checksums[path]]
      # create a flat list of ordered services without duplicates from lists
      services_list = list(OrderedDict.fromkeys(itertools.chain(*restarts)))
      if services_list:
          actions = ('stop', 'start') if stopstart else ('restart',)
          for service_name in services_list:
              if service_name in restart_functions:
                  restart_functions[service_name](service_name)
              else:
                  for action in actions:
                      service(action, service_name)
      return r
docs: Helper function to perform the restart_on_change function.
  
      This is provided for decorators to restart services if files described
      in the restart_map have changed after an invocation of lambda_f().
  
      @param lambda_f: function to call.
      @param restart_map: {file: [service, ...]}
      @param stopstart: whether to stop, start or restart a service
      @param restart_functions: nonstandard functions to use to restart services
                                {svc: func, ...}
      @returns result of lambda_f()