{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Yi.Keymap.Vim.Ex.Commands.Delete
-- License     :  GPL-2
-- Maintainer  :  yi-devel@googlegroups.com
-- Stability   :  experimental
-- Portability :  portable

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