(local { : view } (require :fennel))
(local { : Gdk } (require :lgi))

(local keymap (require :keymap))


(local Mod Gdk.ModifierType)

(local km {
           "a" {
                "a" ["command-1"]
                "b" ["command-2" {:arg-1 "10" :arg-2 "11"}]
                }
           "b" {
                "z" ["command-3"]
                }
           "c" ["command-4"]
        })

(fn fake-key-event [c]
  {:keyval (string.byte c)
   :state {}
   })


(let [s (keymap._.keychord->spec "q")]
  (match s
    {:keyval 113 :modmask 0} true
    _ (assert false (view s))))

(let [s (keymap._.keychord->spec "C-a")]
  (match s
    {:keyval 97 :modmask 4} true
    _ (assert false (view s))))

(let [s (keymap._.keychord->spec "C-M-z")]
  (match s
    {:keyval 122 :modmask 12} true
    _ (assert false (view s))))


(let [r (keymap.recogniser km)
      (ok err)
      (match (r:accept-event (fake-key-event "c"))
        ["command-4"] true
        x (values false (view x))
        nil (values false "???"))]
  (assert ok err))

(let [r (keymap.recogniser km)
      (ok err)
      (match-try
          (r:accept-event (fake-key-event "a"))
        nil (r:accept-event (fake-key-event "b"))
        ["command-2"  {:arg-1 "10" :arg-2 "11"}] true
        (catch x (values false (view x))))]
  (assert ok err))