I'm trying to simulate setTimeout with spawn but apparently it cannot work properly
import threadpool
from os import sleep
type
  TimerObj[T] = object
    doit: bool
    time: int
    when T isnot void:
      arg: T
      exec: ExecProc[T]
    else:
      exec: ExecNoArg
  
  ExecNoArg = proc()
  
  Timer[T] = ref TimerObj[T]
  PTimer[T] = ptr TimerObj[T]
proc runit(x: PTimer[void], duration: int) =
  sleep duration
  if x.doit:
    x.exec()
proc setTimeout(exec: ExecNoArg, duration: int): Timer[void] =
  var temp: Timer[void]
  new temp
  temp.exec = exec
  temp.doit = true
  temp.time = duration
  
  spawn runit(temp[].addr, duration)
  
  result = temp
proc cancelTimeout[T](timer: var Timer[T]) =
  timer.doit = false
var timer = setTimeout(
  (proc() = echo "interweaving echo"),
  300)
cancelTimeout timer # should set the branch false and won't run the supply proc
sleep 400           # if it works, it'll silently end
How to make it works correctly?
Also, if any, please tell me a better approach for this.
Thanks in advance.