{-# LANGUAGE CPP #-}
module Yi.Buffer.Normal ( TextUnit(Character, Line, VLine, Document, GenUnit)
, isAnySep
, isWordChar
, leftBoundaryUnit
, outsideUnit
, unitDelimited
, unitEmacsParagraph
, unitParagraph
, unitSentence
, unitSep
, unitSepThisLine
, unitViWORD
, unitViWORDAnyBnd
, unitViWORDOnLine
, unitViWord
, unitViWordAnyBnd
, unitViWordOnLine
, unitWord
, atBoundaryB
, deleteB
, doIfCharB
, doUntilB_
, genMaybeMoveB
, genMoveB
, maybeMoveB
, moveB
, numberOfB
, readPrevUnitB
, readUnitB
, regionOfB
, regionOfNonEmptyB
, regionOfPartB
, regionOfPartNonEmptyAtB
, regionOfPartNonEmptyB
, transformB
, transposeB
, untilB
, untilB_
, whileB
, BoundarySide(..)
, checkPeekB
, genAtBoundaryB
, genEnclosingUnit
, genUnitBoundary
, RegionStyle(..)
, convertRegionToStyleB
, extendRegionToBoundaries
, getRegionStyle
, mkRegionOfStyleB
, putRegionStyle
, unitWiseRegion
) where
import Data.List (sort)
import Yi.Buffer.Basic (Direction (Backward, Forward), Point)
import Yi.Buffer.Misc (BufferM, getBufferDyn, moveTo, pointB, putBufferDyn, savingPointB)
import Yi.Buffer.Region (Region (..), inclusiveRegionB, mkRegion, mkRegion')
import Yi.Buffer.TextUnit
import Yi.Types (RegionStyle (..))
getRegionStyle :: BufferM RegionStyle
getRegionStyle :: BufferM RegionStyle
getRegionStyle = BufferM RegionStyle
forall (m :: * -> *) a.
(Default a, YiVariable a, MonadState FBuffer m, Functor m) =>
m a
getBufferDyn
putRegionStyle :: RegionStyle -> BufferM ()
putRegionStyle :: RegionStyle -> BufferM ()
putRegionStyle = RegionStyle -> BufferM ()
forall a (m :: * -> *).
(YiVariable a, MonadState FBuffer m, Functor m) =>
a -> m ()
putBufferDyn
convertRegionToStyleB :: Region -> RegionStyle -> BufferM Region
convertRegionToStyleB :: Region -> RegionStyle -> BufferM Region
convertRegionToStyleB r :: Region
r = Point -> Point -> RegionStyle -> BufferM Region
mkRegionOfStyleB (Region -> Point
regionStart Region
r) (Region -> Point
regionEnd Region
r)
mkRegionOfStyleB :: Point -> Point -> RegionStyle -> BufferM Region
mkRegionOfStyleB :: Point -> Point -> RegionStyle -> BufferM Region
mkRegionOfStyleB start' :: Point
start' stop' :: Point
stop' regionStyle :: RegionStyle
regionStyle =
let [start :: Point
start, stop :: Point
stop] = [Point] -> [Point]
forall a. Ord a => [a] -> [a]
sort [Point
start', Point
stop']
region :: Region
region = Point -> Point -> Region
mkRegion Point
start Point
stop in
case RegionStyle
regionStyle of
LineWise -> Region -> BufferM Region
inclusiveRegionB (Region -> BufferM Region) -> BufferM Region -> BufferM Region
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TextUnit -> Region -> BufferM Region
unitWiseRegion TextUnit
Line Region
region
Inclusive -> Region -> BufferM Region
inclusiveRegionB Region
region
Exclusive -> Region -> BufferM Region
forall (m :: * -> *) a. Monad m => a -> m a
return Region
region
Block -> Region -> BufferM Region
forall (m :: * -> *) a. Monad m => a -> m a
return Region
region
unitWiseRegion :: TextUnit -> Region -> BufferM Region
unitWiseRegion :: TextUnit -> Region -> BufferM Region
unitWiseRegion unit :: TextUnit
unit = TextUnit
-> BoundarySide -> BoundarySide -> Region -> BufferM Region
extendRegionToBoundaries TextUnit
unit BoundarySide
InsideBound BoundarySide
OutsideBound
extendRegionToBoundaries :: TextUnit -> BoundarySide -> BoundarySide -> Region -> BufferM Region
extendRegionToBoundaries :: TextUnit
-> BoundarySide -> BoundarySide -> Region -> BufferM Region
extendRegionToBoundaries unit :: TextUnit
unit bs1 :: BoundarySide
bs1 bs2 :: BoundarySide
bs2 region :: Region
region = BufferM Region -> BufferM Region
forall a. BufferM a -> BufferM a
savingPointB (BufferM Region -> BufferM Region)
-> BufferM Region -> BufferM Region
forall a b. (a -> b) -> a -> b
$ do
Point -> BufferM ()
moveTo (Point -> BufferM ()) -> Point -> BufferM ()
forall a b. (a -> b) -> a -> b
$ Region -> Point
regionStart Region
region
TextUnit -> (Direction, BoundarySide) -> Direction -> BufferM ()
genMaybeMoveB TextUnit
unit (Direction
Backward, BoundarySide
bs1) Direction
Backward
Point
start <- BufferM Point
pointB
Point -> BufferM ()
moveTo (Point -> BufferM ()) -> Point -> BufferM ()
forall a b. (a -> b) -> a -> b
$ Region -> Point
regionEnd Region
region
TextUnit -> (Direction, BoundarySide) -> Direction -> BufferM ()
genMaybeMoveB TextUnit
unit (Direction
Forward, BoundarySide
bs2) Direction
Forward
Point
stop <- BufferM Point
pointB
Region -> BufferM Region
forall (m :: * -> *) a. Monad m => a -> m a
return (Region -> BufferM Region) -> Region -> BufferM Region
forall a b. (a -> b) -> a -> b
$ Direction -> Point -> Point -> Region
mkRegion' (Region -> Direction
regionDirection Region
region) Point
start Point
stop