packages feed

ribosome-0.4.0.0: lib/Ribosome/Menu/Prompt/Data/Codes.hs

module Ribosome.Menu.Prompt.Data.Codes where

import Control.Exception.Lifted (try)
import Data.Map.Strict ((!?))
import qualified Data.Map.Strict as Map (fromList)
import qualified Data.Text as Text (singleton)

specialCodes :: Map Text Text
specialCodes =
  Map.fromList [
    ("\x80\xffX", "c-@"),
    ("\65533kb", "bs"),
    ("\x80kB", "s-tab"),
    ("\x0", "c-k"),
    ("\x80kD", "del"),
    ("\x9B", "csi"),
    ("\x80\xfdP", "xcsi"),
    ("\x80ku", "up"),
    ("\x80kd", "down"),
    ("\x80kl", "left"),
    ("\x80kr", "right"),
    -- ("\x80\xfd", "s-up"),
    -- ("\x80\xfd", "s-down"),
    ("\x80#4", "s-left"),
    ("\x80%i", "s-right"),
    ("\x80\xfdT", "c-left"),
    ("\x80\xfdU", "c-right"),
    ("\x80k1", "f1"),
    ("\x80k2", "f2"),
    ("\x80k3", "f3"),
    ("\x80k4", "f4"),
    ("\x80k5", "f5"),
    ("\x80k6", "f6"),
    ("\x80k7", "f7"),
    ("\x80k8", "f8"),
    ("\x80k9", "f9"),
    ("\x80k;", "f10"),
    ("\x80F1", "f11"),
    ("\x80F2", "f12"),
    ("\x80\xfd\x06", "s-f1"),
    ("\x80\xfd\x07", "s-f2"),
    ("\x80\xfd\x08", "s-f3"),
    ("\x80\xfd\x09", "s-f4"),
    ("\x80\xfd\x0A", "s-f5"),
    ("\x80\xfd\x0B", "s-f6"),
    ("\x80\xfd\x0C", "s-f7"),
    ("\x80\xfd\x0D", "s-f8"),
    ("\x80\xfd\x0E", "s-f9"),
    ("\x80\xfd\x0F", "s-f10"),
    ("\x80\xfd\x10", "s-f11"),
    ("\x80\xfd\x11", "s-f12"),
    ("\x80%1", "help"),
    ("\x80&8", "undo"),
    ("\x80kI", "insert"),
    ("\x80kh", "home"),
    ("\x80@7", "end"),
    ("\x80kP", "pageup"),
    ("\x80kN", "pagedown"),
    ("\x80K1", "khome"),
    ("\x80K4", "kend"),
    ("\x80K3", "kpageup"),
    ("\x80K5", "kpagedown"),
    ("\x80K6", "kplus"),
    ("\x80K7", "kminus"),
    ("\x80K9", "kmultiply"),
    ("\x80K8", "kdivide"),
    ("\x80KA", "kenter"),
    ("\x80KB", "kpoint"),
    ("\x80KC", "k0"),
    ("\x80KD", "k1"),
    ("\x80KE", "k2"),
    ("\x80KF", "k3"),
    ("\x80KG", "k4"),
    ("\x80KH", "k5"),
    ("\x80KI", "k6"),
    ("\x80KJ", "k7"),
    ("\x80KK", "k8"),
    ("\x80KL", "k9")
    ]

specialNumCodes :: Map Int Text
specialNumCodes =
  Map.fromList [
    (9, "tab"),
    (10, "c-j"),
    (11, "c-k"),
    (12, "fe"),
    (13, "cr"),
    (14, "c-n"),
    (25, "c-y"),
    (27, "esc"),
    (32, "space"),
    (60, "lt"),
    (92, "bslash"),
    (124, "bar")
    ]

modifierCodes :: [(Int, Text)]
modifierCodes =
  [
    (2, "shift"),
    (4, "control"),
    (8, "alt"),
    (16, "meta"),
    (32, "mouse_double"),
    (64, "mouse_triple"),
    (96, "mouse_quadruple"),
    (128, "command")
    ]

decodeInputChar :: Text -> Maybe Text
decodeInputChar =
  (specialCodes !?)

decodeInputNum ::
  MonadBaseControl IO m =>
  Int ->
  m (Maybe Text)
decodeInputNum a =
  maybe codepoint (return . Just) (specialNumCodes !? a)
  where
    codepoint =
      fmap Text.singleton . rightToMaybe @SomeException <$> try (return $ chr a)