seCapslock xs = maybe e (pure ∘ flip testBit 0) (readMaybe xs ∷ Maybe Int)
  where e = tellMaybeT ["‘" ⊕ xs ⊕ "’ is not a boolean value"]

parseLetter ∷ Logger m ⇒ String → m Letter
parseLetter "" = pure 
parseShortcutPos ∷ Logger m ⇒ String → MaybeT m Pos
parseShortcutPos xs = maybe e pure (lookupR xs posAndVkString <|> parseString xs)
  where e = tellMaybeT ["unknown position ‘" ⊕ xs ⊕ "’"]
parseShortcutPos xs = maybe e pure (lookupR xs posAndVkString <|> parseString xs)
  where e = tellMaybeT ["unknown position ‘" ⊕ xs ⊕ "’"]