const offFns = [] const loadRows = [] const unloadRows = []

const onPage = row => {

const { controller, action } = row
const { dataset } = document.body

let controllerMatched = (dataset.controller === controller)
let actionMatched = (dataset.action === action)

if (controller === '*') {
  controllerMatched = true
}
if (action === '*') {
  actionMatched = true
}
return controllerMatched && actionMatched

}

export const $ = (selector, dom = document) => dom.querySelector(selector)

export const $$ = (selector, dom = document) => Array.from(dom.querySelectorAll(selector))

export const on = (dom, event, cb, useCapture = false) => {

dom.addEventListener(event, cb, useCapture)
const off = () => dom.removeEventListener(event, cb, useCapture)
offFns.push(off)

return () => {
  const index = offFns.findIndex(fn => fn === off)
  if (index !== -1) {
    offFns.splice(index, 1)
  }
  off()
}

}

export const allOff = () => {

offFns.forEach(fn => fn())
offFns.length = 0

}

export const onload = (controller, action, fn) => {

loadRows.push({ controller, action, fn })

}

export const load = () => {

loadRows.forEach(row => {
  if (onPage(row)) {
    row.fn()
  }
})

}

export const onunload = (controller, action, fn) => {

unloadRows.push({ controller, action, fn })

}

export const unload = () => {

unloadRows.forEach(row => {
  if (onPage(row)) {
    row.fn()
  }
})

}