module Ribosome.Api.Mode where

import Ribosome.Control.Monad.Ribo (NvimE)
import Ribosome.Msgpack.Decode (MsgpackDecode(..), msgpackFromString)
import Ribosome.Nvim.Api.IO (vimCallFunction)

data NvimMode =
  Normal
  |
  Visual
  |
  Insert
  |
  Other Text
  deriving (NvimMode -> NvimMode -> Bool
(NvimMode -> NvimMode -> Bool)
-> (NvimMode -> NvimMode -> Bool) -> Eq NvimMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NvimMode -> NvimMode -> Bool
$c/= :: NvimMode -> NvimMode -> Bool
== :: NvimMode -> NvimMode -> Bool
$c== :: NvimMode -> NvimMode -> Bool
Eq, Int -> NvimMode -> ShowS
[NvimMode] -> ShowS
NvimMode -> String
(Int -> NvimMode -> ShowS)
-> (NvimMode -> String) -> ([NvimMode] -> ShowS) -> Show NvimMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NvimMode] -> ShowS
$cshowList :: [NvimMode] -> ShowS
show :: NvimMode -> String
$cshow :: NvimMode -> String
showsPrec :: Int -> NvimMode -> ShowS
$cshowsPrec :: Int -> NvimMode -> ShowS
Show)

instance IsString NvimMode where
  fromString :: String -> NvimMode
fromString String
"n" = NvimMode
Normal
  fromString String
"v" = NvimMode
Visual
  fromString String
"V" = NvimMode
Visual
  fromString String
"CTRL-V" = NvimMode
Visual
  fromString String
"i" = NvimMode
Insert
  fromString String
a = Text -> NvimMode
Other (String -> Text
forall a. ToText a => a -> Text
toText String
a)

instance MsgpackDecode NvimMode where
  fromMsgpack :: Object -> Either Err NvimMode
fromMsgpack = Text -> Object -> Either Err NvimMode
forall a. IsString a => Text -> Object -> Either Err a
msgpackFromString Text
"NvimMode"

mode ::
  NvimE e m =>
  m NvimMode
mode :: m NvimMode
mode =
  Text -> [Object] -> m NvimMode
forall (m :: * -> *) e a.
(Nvim m, MonadDeepError e RpcError m, MsgpackDecode a) =>
Text -> [Object] -> m a
vimCallFunction Text
"mode" []

visualModeActive ::
  NvimE e m =>
  m Bool
visualModeActive :: m Bool
visualModeActive =
  (NvimMode -> NvimMode -> Bool
forall a. Eq a => a -> a -> Bool
== NvimMode
Visual) (NvimMode -> Bool) -> m NvimMode -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m NvimMode
forall e (m :: * -> *). NvimE e m => m NvimMode
mode