seLetter letters
      <*> (Just <$> parseCapslock caps)

parseScancode ∷ Logger m ⇒ String → MaybeT m Pos
parseScancode xs = maybe e pure (readMaybe ('0':'x':xs) >>= (`lookupR` posAndScancode))
  where e = tellMaybeT ["unknown position ‘" ⊕ xs ⊕ "’"]

parseShortcutPos ∷ Logger m ⇒ Stri
klcKey ∷ (Logger m, Parser m) ⇒ m (Maybe Key)
klcKey = runMaybeT $ do
    sc:vk:caps:letters ← lift readLine
    Key
      <$> parseScancode sc
      <*> (Just <$> parseShortcutPos vk)
      <*> pure []
      <*> traverse parseLetter letters
      <*> (Just <$> parseCapslock caps)
klcKey = runMaybeT $ do
    sc:vk:caps:letters ← lift readLine
    Key
      <$> parseScancode sc
      <*> (Just <$> parseShortcutPos vk)
      <*> pure []
      <*> traverse parseLetter letters
      <*> (Just <$> parseCapslock caps)