ribosome-0.9.9.9: lib/Ribosome/Data/Register.hs
-- |Data types for register-related API functions.
module Ribosome.Data.Register where
import Data.Char (isAlpha, isNumber)
import qualified Data.Text as Text
import Exon (exon)
import Prettyprinter (Pretty (pretty))
import Ribosome.Host.Class.Msgpack.Decode (MsgpackDecode (..), msgpackFromString)
import Ribosome.Host.Class.Msgpack.Encode (MsgpackEncode (..))
-- |A Neovim register.
data Register =
Named Text
|
Numbered Text
|
Special Text
|
Empty
deriving stock (Eq, Show, Generic)
instance IsString Register where
fromString = \case
"" ->
Empty
[a] | isAlpha a ->
Named (Text.singleton a)
[a] | isNumber a ->
Numbered (Text.singleton a)
a ->
Special (toText a)
instance MsgpackDecode Register where
fromMsgpack =
msgpackFromString "Register"
instance MsgpackEncode Register where
toMsgpack (Named a) =
toMsgpack a
toMsgpack (Numbered a) =
toMsgpack a
toMsgpack (Special a) =
toMsgpack a
toMsgpack Empty =
toMsgpack ("" :: Text)
-- |Render a register name by prefixing it with @"@.
quoted :: Text -> Text
quoted a =
[exon|"#{a}|]
-- |Render a register name as is usual for Neovim.
registerRepr :: Register -> Text
registerRepr = \case
Named a ->
quoted a
Numbered a ->
quoted a
Special a ->
quoted a
Empty ->
""
instance Pretty Register where
pretty = \case
Empty ->
"no register"
a ->
pretty (registerRepr a)