{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Yi.Keymap.Vim.Ex.Commands.Delete (parse) where
import Control.Applicative (Alternative ((<|>)))
import Control.Monad (void)
import qualified Data.Attoparsec.Text as P (string, try, match)
import Data.Maybe (fromMaybe)
import Data.Text ()
import Data.Semigroup ((<>))
import Lens.Micro.Platform
import Yi.Buffer hiding (Delete)
import Yi.Keymap (Action (BufferA))
import Yi.Keymap.Vim.Common (EventString)
import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (parse, pureExCommand, parseRange)
import Yi.Keymap.Vim.Ex.Types (ExCommand (cmdAction, cmdShow))
parse :: EventString -> Maybe ExCommand
parse :: EventString -> Maybe ExCommand
parse = Parser ExCommand -> EventString -> Maybe ExCommand
Common.parse (Parser ExCommand -> EventString -> Maybe ExCommand)
-> Parser ExCommand -> EventString -> Maybe ExCommand
forall a b. (a -> b) -> a -> b
$ do
(Text
rangeText, BufferM Region
rangeB) <- ASetter
(Text, Maybe (BufferM Region))
(Text, BufferM Region)
(Maybe (BufferM Region))
(BufferM Region)
-> (Maybe (BufferM Region) -> BufferM Region)
-> (Text, Maybe (BufferM Region))
-> (Text, BufferM Region)
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over ASetter
(Text, Maybe (BufferM Region))
(Text, BufferM Region)
(Maybe (BufferM Region))
(BufferM Region)
forall s t a b. Field2 s t a b => Lens s t a b
_2 (BufferM Region -> Maybe (BufferM Region) -> BufferM Region
forall a. a -> Maybe a -> a
fromMaybe BufferM Region
currentLineRegionB)
((Text, Maybe (BufferM Region)) -> (Text, BufferM Region))
-> Parser Text (Text, Maybe (BufferM Region))
-> Parser Text (Text, BufferM Region)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Maybe (BufferM Region))
-> Parser Text (Text, Maybe (BufferM Region))
forall a. Parser a -> Parser (Text, a)
P.match Parser (Maybe (BufferM Region))
Common.parseRange
Parser Text Text -> Parser Text ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Parser Text Text -> Parser Text ())
-> Parser Text Text -> Parser Text ()
forall a b. (a -> b) -> a -> b
$ Parser Text Text -> Parser Text Text
forall i a. Parser i a -> Parser i a
P.try ( Text -> Parser Text Text
P.string Text
"delete") Parser Text Text -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
P.string Text
"d"
ExCommand -> Parser ExCommand
forall (m :: * -> *) a. Monad m => a -> m a
return (ExCommand -> Parser ExCommand) -> ExCommand -> Parser ExCommand
forall a b. (a -> b) -> a -> b
$ ExCommand
Common.pureExCommand {
cmdShow :: Text
cmdShow = Text
rangeText Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"delete"
, cmdAction :: Action
cmdAction = BufferM () -> Action
forall a. Show a => BufferM a -> Action
BufferA (BufferM () -> Action) -> BufferM () -> Action
forall a b. (a -> b) -> a -> b
$ Region -> BufferM ()
deleteRegionB (Region -> BufferM ()) -> BufferM Region -> BufferM ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< BufferM Region
rangeB
}
where currentLineRegionB :: BufferM Region
currentLineRegionB = (Region -> RegionStyle -> BufferM Region)
-> RegionStyle -> Region -> BufferM Region
forall a b c. (a -> b -> c) -> b -> a -> c
flip Region -> RegionStyle -> BufferM Region
convertRegionToStyleB RegionStyle
LineWise (Region -> BufferM Region) -> BufferM Region -> BufferM Region
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TextUnit -> BufferM Region
regionOfB TextUnit
Line