whole_func_string: function next(arg, isErr) {
      // Preventive measure. If we end up here, then there is really something wrong
      if (!mainTask.isRunning) {
        throw new Error('Trying to resume an already finished generator')
      }
  
      try {
        let result
        if (isErr) {
          result = iterator.throw(arg)
        } else if (arg === TASK_CANCEL) {
          /**
            getting TASK_CANCEL automatically cancels the main task
            We can get this value here
  
            - By cancelling the parent task manually
            - By joining a Cancelled task
          **/
          mainTask.isCancelled = true
          /**
            Cancels the current effect; this will propagate the cancellation down to any called tasks
          **/
          next.cancel()
          /**
            If this Generator has a `return` method then invokes it
            This will jump to the finally block
          **/
          result = is.func(iterator.return) ? iterator.return(TASK_CANCEL) : { done: true, value: TASK_CANCEL }
        } else if (arg === CHANNEL_END) {
          // We get CHANNEL_END by taking from a channel that ended using `take` (and not `takem` used to trap End of channels)
          result = is.func(iterator.return) ? iterator.return() : { done: true }
        } else {
          result = iterator.next(arg)
        }
  
        if (!result.done) {
          runEffect(result.value, parentEffectId, '', next)
        } else {
          /**
            This Generator has ended, terminate the main task and notify the fork queue
          **/
          mainTask.isMainRunning = false
          mainTask.cont && mainTask.cont(result.value)
        }
      } catch (error) {
        if (mainTask.isCancelled) {
          logError(error)
        }
        mainTask.isMainRunning = false
        mainTask.cont(error, true)
      }
    }
func_code_string: function next(arg, isErr) {
      // Preventive measure. If we end up here, then there is really something wrong
      if (!mainTask.isRunning) {
        throw new Error('Trying to resume an already finished generator')
      }
  
      try {
        let result
        if (isErr) {
          result = iterator.throw(arg)
        } else if (arg === TASK_CANCEL) {
          /**
            getting TASK_CANCEL automatically cancels the main task
            We can get this value here
  
            - By cancelling the parent task manually
            - By joining a Cancelled task
          **/
          mainTask.isCancelled = true
          /**
            Cancels the current effect; this will propagate the cancellation down to any called tasks
          **/
          next.cancel()
          /**
            If this Generator has a `return` method then invokes it
            This will jump to the finally block
          **/
          result = is.func(iterator.return) ? iterator.return(TASK_CANCEL) : { done: true, value: TASK_CANCEL }
        } else if (arg === CHANNEL_END) {
          // We get CHANNEL_END by taking from a channel that ended using `take` (and not `takem` used to trap End of channels)
          result = is.func(iterator.return) ? iterator.return() : { done: true }
        } else {
          result = iterator.next(arg)
        }
  
        if (!result.done) {
          runEffect(result.value, parentEffectId, '', next)
        } else {
          /**
            This Generator has ended, terminate the main task and notify the fork queue
          **/
          mainTask.isMainRunning = false
          mainTask.cont && mainTask.cont(result.value)
        }
      } catch (error) {
        if (mainTask.isCancelled) {
          logError(error)
        }
        mainTask.isMainRunning = false
        mainTask.cont(error, true)
      }
    }
func_documentation_string: This is the generator driver
  It's a recursive async/continuation function which calls itself
  until the generator terminates or throws