code: def result(self):
          
          if not self.is_done():
              raise ValueError("Cannot get a result for a program that isn't completed.")
  
          if self._raw['status'] == 'CANCELLED':
              raise CancellationError(self._raw['result'])
          elif self._raw['status'] == 'ERROR':
              if self._machine == 'QVM':
                  raise QVMError(self._raw['result'])
              elif self._machine == 'QPU':
                  raise QPUError(self._raw['result'])
              elif self._machine == 'QUILC':
                  raise QUILCError(self._raw['result'])
              else:
                  raise UnknownApiError(self._raw['result'])
  
          if self._raw['program']['type'] == 'wavefunction':
              return Wavefunction.from_bit_packed_string(
                  base64.b64decode(self._raw['result']), self._raw['program']['addresses'])
          elif self._raw['program']['type'] in ['multishot', 'multishot-measure', 'expectation']:
              return np.asarray(self._raw['result'])
          else:
              return self._raw['result']
docs: The result of the job if available
          throws ValueError is result is not available yet
          throws ApiError if server returned an error indicating program execution was not successful
          or if the job was cancelled