module Data.Loc.Area
(
Area,
fromTo, spanArea,
(+), (-), addSpan,
firstSpan, lastSpan,
start, end,
areaSpan, spansAsc, spanCount,
areaShowsPrec, areaReadPrec,
)
where
import Data.Loc.Internal.Prelude
import Data.Loc.Loc (Loc)
import Data.Loc.Span (Span)
import qualified Data.Loc.Internal.Map as Map
import qualified Data.Loc.Span as Span
import Data.Data (Data)
import qualified Data.Foldable as Foldable
import qualified Data.Set as Set
data Terminus = Start | End
deriving (Typeable Terminus
Terminus -> DataType
Terminus -> Constr
(forall b. Data b => b -> b) -> Terminus -> Terminus
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Terminus -> u
forall u. (forall d. Data d => d -> u) -> Terminus -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Terminus -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Terminus -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Terminus
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Terminus -> c Terminus
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Terminus)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Terminus)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Terminus -> m Terminus
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Terminus -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Terminus -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Terminus -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Terminus -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Terminus -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Terminus -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Terminus -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Terminus -> r
gmapT :: (forall b. Data b => b -> b) -> Terminus -> Terminus
$cgmapT :: (forall b. Data b => b -> b) -> Terminus -> Terminus
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Terminus)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Terminus)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Terminus)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Terminus)
dataTypeOf :: Terminus -> DataType
$cdataTypeOf :: Terminus -> DataType
toConstr :: Terminus -> Constr
$ctoConstr :: Terminus -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Terminus
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Terminus
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Terminus -> c Terminus
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Terminus -> c Terminus
Data, Terminus -> Terminus -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Terminus -> Terminus -> Bool
$c/= :: Terminus -> Terminus -> Bool
== :: Terminus -> Terminus -> Bool
$c== :: Terminus -> Terminus -> Bool
Eq, Eq Terminus
Terminus -> Terminus -> Bool
Terminus -> Terminus -> Ordering
Terminus -> Terminus -> Terminus
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Terminus -> Terminus -> Terminus
$cmin :: Terminus -> Terminus -> Terminus
max :: Terminus -> Terminus -> Terminus
$cmax :: Terminus -> Terminus -> Terminus
>= :: Terminus -> Terminus -> Bool
$c>= :: Terminus -> Terminus -> Bool
> :: Terminus -> Terminus -> Bool
$c> :: Terminus -> Terminus -> Bool
<= :: Terminus -> Terminus -> Bool
$c<= :: Terminus -> Terminus -> Bool
< :: Terminus -> Terminus -> Bool
$c< :: Terminus -> Terminus -> Bool
compare :: Terminus -> Terminus -> Ordering
$ccompare :: Terminus -> Terminus -> Ordering
Ord)
newtype Area = Area (Map Loc Terminus)
deriving (Typeable Area
Area -> DataType
Area -> Constr
(forall b. Data b => b -> b) -> Area -> Area
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Area -> u
forall u. (forall d. Data d => d -> u) -> Area -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Area -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Area -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Area -> m Area
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Area -> m Area
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Area
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Area -> c Area
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Area)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Area)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Area -> m Area
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Area -> m Area
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Area -> m Area
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Area -> m Area
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Area -> m Area
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Area -> m Area
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Area -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Area -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Area -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Area -> [u]
gmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Area -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Area -> r
gmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Area -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Area -> r
gmapT :: (forall b. Data b => b -> b) -> Area -> Area
$cgmapT :: (forall b. Data b => b -> b) -> Area -> Area
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Area)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Area)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Area)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Area)
dataTypeOf :: Area -> DataType
$cdataTypeOf :: Area -> DataType
toConstr :: Area -> Constr
$ctoConstr :: Area -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Area
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Area
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Area -> c Area
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Area -> c Area
Data, Area -> Area -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Area -> Area -> Bool
$c/= :: Area -> Area -> Bool
== :: Area -> Area -> Bool
$c== :: Area -> Area -> Bool
Eq, Eq Area
Area -> Area -> Bool
Area -> Area -> Ordering
Area -> Area -> Area
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Area -> Area -> Area
$cmin :: Area -> Area -> Area
max :: Area -> Area -> Area
$cmax :: Area -> Area -> Area
>= :: Area -> Area -> Bool
$c>= :: Area -> Area -> Bool
> :: Area -> Area -> Bool
$c> :: Area -> Area -> Bool
<= :: Area -> Area -> Bool
$c<= :: Area -> Area -> Bool
< :: Area -> Area -> Bool
$c< :: Area -> Area -> Bool
compare :: Area -> Area -> Ordering
$ccompare :: Area -> Area -> Ordering
Ord)
instance Show Area
where
showsPrec :: Int -> Area -> ShowS
showsPrec = Int -> Area -> ShowS
areaShowsPrec
instance Read Area
where
readPrec :: ReadPrec Area
readPrec = ReadPrec Area
areaReadPrec
instance Monoid Area
where
mempty :: Area
mempty = Map Loc Terminus -> Area
Area forall k a. Map k a
Map.empty
instance Semigroup Area
where
<> :: Area -> Area -> Area
(<>) = Area -> Area -> Area
(+)
areaShowsPrec :: Int -> Area -> ShowS
areaShowsPrec :: Int -> Area -> ShowS
areaShowsPrec Int
_ Area
a =
forall a. Show a => [a] -> ShowS
showList (Area -> [Span]
spansAsc Area
a)
areaReadPrec :: ReadPrec Area
areaReadPrec :: ReadPrec Area
areaReadPrec =
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Span -> Area
spanArea forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Read a => ReadPrec [a]
readListPrec
fromTo
:: Loc
-> Loc
-> Area
fromTo :: Loc -> Loc -> Area
fromTo Loc
a Loc
b
| Loc
a forall a. Eq a => a -> a -> Bool
== Loc
b = forall a. Monoid a => a
mempty
| Bool
otherwise = Span -> Area
spanArea (Loc -> Loc -> Span
Span.fromTo Loc
a Loc
b)
spanArea :: Span -> Area
spanArea :: Span -> Area
spanArea Span
s = Map Loc Terminus -> Area
Area (forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Loc, Terminus)]
locs)
where
locs :: [(Loc, Terminus)]
locs = [ (Span -> Loc
Span.start Span
s, Terminus
Start)
, (Span -> Loc
Span.end Span
s, Terminus
End )
]
areaSpan :: Area -> Maybe Span
areaSpan :: Area -> Maybe Span
areaSpan Area
x =
Area -> Maybe Loc
start Area
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Loc
a ->
Area -> Maybe Loc
end Area
x forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \Loc
b ->
Loc -> Loc -> Span
Span.fromTo Loc
a Loc
b
spansAsc :: Area -> [Span]
spansAsc :: Area -> [Span]
spansAsc (Area Map Loc Terminus
m) =
forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL Maybe Loc -> Loc -> (Maybe Loc, Maybe Span)
f forall a. Maybe a
Nothing (forall k a. Map k a -> [k]
Map.keys Map Loc Terminus
m) forall a b. a -> (a -> b) -> b
& forall a b. (a, b) -> b
snd forall a b. a -> (a -> b) -> b
& forall a. [Maybe a] -> [a]
catMaybes
where
f :: Maybe Loc -> Loc -> (Maybe Loc, Maybe Span)
f Maybe Loc
Nothing Loc
l = (forall a. a -> Maybe a
Just Loc
l, forall a. Maybe a
Nothing)
f (Just Loc
l) Loc
l' = (forall a. Maybe a
Nothing, forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Loc -> Loc -> Span
Span.fromTo Loc
l Loc
l')
spanCount :: Area -> Natural
spanCount :: Area -> Natural
spanCount (Area Map Loc Terminus
locs) =
forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (t :: * -> *) a. Foldable t => t a -> Int
Foldable.length Map Loc Terminus
locs forall a. Integral a => a -> a -> a
`div` Int
2)
firstSpan :: Area -> Maybe Span
firstSpan :: Area -> Maybe Span
firstSpan (Area Map Loc Terminus
m) =
case forall a. Set a -> [a]
Set.toAscList (forall k a. Map k a -> Set k
Map.keysSet Map Loc Terminus
m) of
Loc
a:Loc
b:[Loc]
_ -> forall a. a -> Maybe a
Just (Loc -> Loc -> Span
Span.fromTo Loc
a Loc
b)
[Loc]
_ -> forall a. Maybe a
Nothing
lastSpan :: Area -> Maybe Span
lastSpan :: Area -> Maybe Span
lastSpan (Area Map Loc Terminus
m) =
case forall a. Set a -> [a]
Set.toDescList (forall k a. Map k a -> Set k
Map.keysSet Map Loc Terminus
m) of
Loc
b:Loc
a:[Loc]
_ -> forall a. a -> Maybe a
Just (Loc -> Loc -> Span
Span.fromTo Loc
a Loc
b)
[Loc]
_ -> forall a. Maybe a
Nothing
start :: Area -> Maybe Loc
start :: Area -> Maybe Loc
start (Area Map Loc Terminus
m) =
case forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.minViewWithKey Map Loc Terminus
m of
Just ((Loc
l, Terminus
_), Map Loc Terminus
_) -> forall a. a -> Maybe a
Just Loc
l
Maybe ((Loc, Terminus), Map Loc Terminus)
Nothing -> forall a. Maybe a
Nothing
end :: Area -> Maybe Loc
end :: Area -> Maybe Loc
end (Area Map Loc Terminus
locs) =
case forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.maxViewWithKey Map Loc Terminus
locs of
Just ((Loc
l, Terminus
_), Map Loc Terminus
_) -> forall a. a -> Maybe a
Just Loc
l
Maybe ((Loc, Terminus), Map Loc Terminus)
Nothing -> forall a. Maybe a
Nothing
(+) :: Area -> Area -> Area
Area
a + :: Area -> Area -> Area
+ Area
b
| Area -> Natural
spanCount Area
a forall a. Ord a => a -> a -> Bool
>= Area -> Natural
spanCount Area
b = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Span -> Area -> Area
addSpan Area
a (Area -> [Span]
spansAsc Area
b)
| Bool
otherwise = Area
b Area -> Area -> Area
+ Area
a
addSpan :: Span -> Area -> Area
addSpan :: Span -> Area -> Area
addSpan Span
b (Area Map Loc Terminus
as) =
let
unmodifiedSpansBelow :: Map Loc Terminus
unmodifiedSpansAbove :: Map Loc Terminus
startBelow :: Maybe Loc
endAbove :: Maybe Loc
middle :: Map Loc Terminus
(Map Loc Terminus
unmodifiedSpansBelow, Maybe Loc
startBelow) =
let
below :: Map Loc Terminus
below = forall k a. Ord k => k -> Map k a -> Map k a
Map.below (Span -> Loc
Span.start Span
b) Map Loc Terminus
as
in
case forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.maxViewWithKey Map Loc Terminus
below of
Just ((Loc
l, Terminus
Start), Map Loc Terminus
xs) -> (Map Loc Terminus
xs, forall a. a -> Maybe a
Just Loc
l)
Maybe ((Loc, Terminus), Map Loc Terminus)
_ -> (Map Loc Terminus
below, forall a. Maybe a
Nothing)
(Map Loc Terminus
unmodifiedSpansAbove, Maybe Loc
endAbove) =
let
above :: Map Loc Terminus
above = forall k a. Ord k => k -> Map k a -> Map k a
Map.above (Span -> Loc
Span.end Span
b) Map Loc Terminus
as
in
case forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.minViewWithKey Map Loc Terminus
above of
Just ((Loc
l, Terminus
End), Map Loc Terminus
xs) -> (Map Loc Terminus
xs, forall a. a -> Maybe a
Just Loc
l)
Maybe ((Loc, Terminus), Map Loc Terminus)
_ -> (Map Loc Terminus
above, forall a. Maybe a
Nothing)
middle :: Map Loc Terminus
middle = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> [a]
Foldable.toList Maybe Loc
startBelow forall a. Semigroup a => a -> a -> a
<> [Span -> Loc
Span.start Span
b], Terminus
Start)
, (forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> [a]
Foldable.toList Maybe Loc
endAbove forall a. Semigroup a => a -> a -> a
<> [Span -> Loc
Span.end Span
b], Terminus
End)
]
in
Map Loc Terminus -> Area
Area forall a b. (a -> b) -> a -> b
$ Map Loc Terminus
unmodifiedSpansBelow forall a. Semigroup a => a -> a -> a
<> Map Loc Terminus
middle forall a. Semigroup a => a -> a -> a
<> Map Loc Terminus
unmodifiedSpansAbove
(-) :: Area -> Area -> Area
Area
a - :: Area -> Area -> Area
- Area
b = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Span -> Area -> Area
subtractSpan Area
a (Area -> [Span]
spansAsc Area
b)
subtractSpan :: Span -> Area -> Area
subtractSpan :: Span -> Area -> Area
subtractSpan Span
b (Area Map Loc Terminus
as) =
let
Map Loc Terminus
resultBelow :: Map Loc Terminus =
let
below :: Map Loc Terminus
below = forall k a. Ord k => k -> Map k a -> Map k a
Map.belowInclusive (Span -> Loc
Span.start Span
b) Map Loc Terminus
as
in
case forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.maxViewWithKey Map Loc Terminus
below of
Just ((Loc
l, Terminus
Start), Map Loc Terminus
xs) ->
if Loc
l forall a. Eq a => a -> a -> Bool
== Span -> Loc
Span.start Span
b
then Map Loc Terminus
xs
else Map Loc Terminus
below forall a b. a -> (a -> b) -> b
& forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert (Span -> Loc
Span.start Span
b) Terminus
End
Maybe ((Loc, Terminus), Map Loc Terminus)
_ -> Map Loc Terminus
below
Map Loc Terminus
resultAbove :: Map Loc Terminus =
let
above :: Map Loc Terminus
above = forall k a. Ord k => k -> Map k a -> Map k a
Map.aboveInclusive (Span -> Loc
Span.end Span
b) Map Loc Terminus
as
in
case forall k a. Map k a -> Maybe ((k, a), Map k a)
Map.minViewWithKey Map Loc Terminus
above of
Just ((Loc
l, Terminus
End), Map Loc Terminus
xs) ->
if Loc
l forall a. Eq a => a -> a -> Bool
== Span -> Loc
Span.end Span
b
then Map Loc Terminus
xs
else Map Loc Terminus
above forall a b. a -> (a -> b) -> b
& forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert (Span -> Loc
Span.end Span
b) Terminus
Start
Maybe ((Loc, Terminus), Map Loc Terminus)
_ -> Map Loc Terminus
above
in
Map Loc Terminus -> Area
Area forall a b. (a -> b) -> a -> b
$ Map Loc Terminus
resultBelow forall a. Semigroup a => a -> a -> a
<> Map Loc Terminus
resultAbove