docs: def cytherize(args, file):
      """
      Used by core to integrate all the pieces of information, and to interface
      with the user. Compiles and cleans up.
      """
      if isOutDated(file):
          if isUpdated(file):
              response = initiateCompilation(args, file)
          else:
              response = {'returncode': WAIT_FOR_FIX, 'output': ''}
      else:
          if args['timestamp']:
              response = {'returncode': SKIPPED_COMPILATION, 'output': ''}
          else:
              response = initiateCompilation(args, file)
  
      ###########################################################################
  
      time.sleep(INTERVAL)
      if response['returncode'] == ERROR_PASSOFF:
          file['stamp_if_error'] = time.time()
          if args['watch']:
              if len(args['filenames']) > 1:
                  output = "Error in file: '{}'; Cyther will wait until it is" \
                           "fixed...\n".format(file['file_path'])
              else:
                  output = "Cyther will wait for you to fix this error before" \
                           "it tries to compile again...\n"
          else:
              output = "Error in source file, see above\n"
  
      elif response['returncode'] == SKIPPED_COMPILATION:
          if not args['watch']:
              output = 'Skipping compilation: source file not updated since' \
                       'last compile\n'
          else:
              output = ''
  
      elif response['returncode'] == WAIT_FOR_FIX:
          output = ''
  
      elif response['returncode'] == FINE:
          if args['watch']:
              if len(args['filenames']) > 1:
                  output = "Compiled the file '{}'\n".format(file['file_path'])
              else:
                  output = 'Compiled the file\n'
          else:
              if not args['concise']:
                  output = 'Compilation complete\n'
              else:
                  output = ''
  
      else:
          raise CytherError("Unrecognized return value '{}'"
                            "".format(response['returncode']))
  
      response['output'] += output
  
      ###########################################################################
  
      condition = response['returncode'] == SKIPPED_COMPILATION and not args[
          'watch']
      if (args['execute'] or args['timer']) and response[
          'returncode'] == FINE or condition:
          ret = cueExtractAndRun(args, file)
          response['output'] += ret['output']
  
      ###########################################################################
  
      if args['watch']:
          if response['returncode'] == FINE or response[
              'returncode'] == ERROR_PASSOFF:
              if response['returncode'] == FINE:
                  args['watch_stats']['compiles'] += 1
              else:
                  args['watch_stats']['errors'] += 1
              args['watch_stats']['counter'] += 1
              response['output'] += \
                  WATCH_STATS_TEMPLATE.format(args['watch_stats']['counter'],
                                              args['watch_stats']['compiles'],
                                              args['watch_stats']['errors'],
                                              args['watch_stats']['polls'])
          else:
              args['watch_stats']['polls'] += 1
  
      ###########################################################################
  
      if args['watch']:
          if response['returncode'] == 1:
              print(response['output'] + '\n')
          else:
              if response['output']:
                  print(response['output'])
      else:
          if response['returncode'] == 1:
              if args['error']:
                  raise CytherError(response['output'])
              else:
                  print(response['output'])
          else:
              print(response['output'])