local ThreadNode = Node:extend('ThreadNode', {
  threadFile = nil,
  threadChannel = nil,
  updateInterval = 5,
  lastUpdate = 0,
  state = nil,
})

function ThreadNode:update(dt)
  if not self.state then self:checkUpdate() end
end

function ThreadNode:checkUpdate()
  if self.threadFile and self.threadChannel then
    if self.lastUpdate < love.timer.getTime() - self.updateInterval or
        (not self.state and self.lastUpdate < love.timer.getTime() - 5) then
      self.lastUpdate = love.timer.getTime()
      print(self.threadChannel, "Updating...")

      local updateThread = love.thread.newThread(self.threadFile)
      updateThread:start()
    end

    local v = love.thread.getChannel(self.threadChannel):pop()
    if v then
      self:onUpdate(v)
    end
  end
end

function ThreadNode:afterExit()
  print('exit')
  self:checkUpdate()
end

function ThreadNode:onUpdate(v)
  self.state = v
end

return ThreadNode
