{-# LANGUAGE DataKinds #-}
{-# LANGUAGE UndecidableInstances #-}
module Agda.Syntax.Position
(
Position
, PositionWithoutFile
, Position'(..)
, SrcFile
, RangeFile(..)
, mkRangeFile
, positionInvariant
, startPos
, movePos
, movePosByString
, backupPos
, startPos'
, Interval
, IntervalWithoutFile
, Interval'(..)
, intervalInvariant
, posToInterval
, getIntervalFile
, iLength
, fuseIntervals
, setIntervalFile
, Range
, Range'(..)
, rangeInvariant
, consecutiveAndSeparated
, intervalsToRange
, intervalToRange
, rangeIntervals
, rangeFile
, rangeModule'
, rangeModule
, rightMargin
, noRange
, posToRange, posToRange'
, rStart, rStart'
, rEnd, rEnd'
, rangeToInterval
, rangeToIntervalWithFile
, continuous
, continuousPerLine
, PrintRange(..)
, HasRange(..)
, SetRange(..)
, KillRange(..)
, KillRangeT
, killRangeMap
, KILLRANGE(..)
, withRangeOf
, fuseRange
, fuseRanges
, beginningOf
, beginningOfFile
, interleaveRanges
) where
import Prelude hiding ( null )
import Control.DeepSeq
import Control.Monad
import Control.Monad.Writer (runWriter, tell)
import qualified Data.Foldable as Fold
import Data.Function (on)
import Data.Int
import Data.List (sort)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq
import Data.Semigroup (Semigroup(..))
import Data.Void
import GHC.Generics (Generic)
import Agda.Syntax.TopLevelModuleName.Boot (TopLevelModuleName'(..))
import Agda.Utils.FileName
import Agda.Utils.List
import Agda.Utils.List1 (List1)
import Agda.Utils.List2 (List2)
import qualified Agda.Utils.Maybe.Strict as Strict
import Agda.Utils.Null
import Agda.Utils.Permutation
import Agda.Utils.TypeLevel (IsBase, All, Domains)
import Agda.Utils.Impossible
data Position' a = Pn
{ forall a. Position' a -> a
srcFile :: !a
, forall a. Position' a -> Int32
posPos :: !Int32
, forall a. Position' a -> Int32
posLine :: !Int32
, forall a. Position' a -> Int32
posCol :: !Int32
}
deriving (Int -> Position' a -> ShowS
[Position' a] -> ShowS
Position' a -> String
(Int -> Position' a -> ShowS)
-> (Position' a -> String)
-> ([Position' a] -> ShowS)
-> Show (Position' a)
forall a. Show a => Int -> Position' a -> ShowS
forall a. Show a => [Position' a] -> ShowS
forall a. Show a => Position' a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Position' a -> ShowS
showsPrec :: Int -> Position' a -> ShowS
$cshow :: forall a. Show a => Position' a -> String
show :: Position' a -> String
$cshowList :: forall a. Show a => [Position' a] -> ShowS
showList :: [Position' a] -> ShowS
Show, (forall a b. (a -> b) -> Position' a -> Position' b)
-> (forall a b. a -> Position' b -> Position' a)
-> Functor Position'
forall a b. a -> Position' b -> Position' a
forall a b. (a -> b) -> Position' a -> Position' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Position' a -> Position' b
fmap :: forall a b. (a -> b) -> Position' a -> Position' b
$c<$ :: forall a b. a -> Position' b -> Position' a
<$ :: forall a b. a -> Position' b -> Position' a
Functor, (forall m. Monoid m => Position' m -> m)
-> (forall m a. Monoid m => (a -> m) -> Position' a -> m)
-> (forall m a. Monoid m => (a -> m) -> Position' a -> m)
-> (forall a b. (a -> b -> b) -> b -> Position' a -> b)
-> (forall a b. (a -> b -> b) -> b -> Position' a -> b)
-> (forall b a. (b -> a -> b) -> b -> Position' a -> b)
-> (forall b a. (b -> a -> b) -> b -> Position' a -> b)
-> (forall a. (a -> a -> a) -> Position' a -> a)
-> (forall a. (a -> a -> a) -> Position' a -> a)
-> (forall a. Position' a -> [a])
-> (forall a. Position' a -> Bool)
-> (forall a. Position' a -> Int)
-> (forall a. Eq a => a -> Position' a -> Bool)
-> (forall a. Ord a => Position' a -> a)
-> (forall a. Ord a => Position' a -> a)
-> (forall a. Num a => Position' a -> a)
-> (forall a. Num a => Position' a -> a)
-> Foldable Position'
forall a. Eq a => a -> Position' a -> Bool
forall a. Num a => Position' a -> a
forall a. Ord a => Position' a -> a
forall m. Monoid m => Position' m -> m
forall a. Position' a -> Bool
forall a. Position' a -> Int
forall a. Position' a -> [a]
forall a. (a -> a -> a) -> Position' a -> a
forall m a. Monoid m => (a -> m) -> Position' a -> m
forall b a. (b -> a -> b) -> b -> Position' a -> b
forall a b. (a -> b -> b) -> b -> Position' a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => Position' m -> m
fold :: forall m. Monoid m => Position' m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Position' a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Position' a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Position' a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Position' a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> Position' a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Position' a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Position' a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Position' a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Position' a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Position' a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Position' a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Position' a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> Position' a -> a
foldr1 :: forall a. (a -> a -> a) -> Position' a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Position' a -> a
foldl1 :: forall a. (a -> a -> a) -> Position' a -> a
$ctoList :: forall a. Position' a -> [a]
toList :: forall a. Position' a -> [a]
$cnull :: forall a. Position' a -> Bool
null :: forall a. Position' a -> Bool
$clength :: forall a. Position' a -> Int
length :: forall a. Position' a -> Int
$celem :: forall a. Eq a => a -> Position' a -> Bool
elem :: forall a. Eq a => a -> Position' a -> Bool
$cmaximum :: forall a. Ord a => Position' a -> a
maximum :: forall a. Ord a => Position' a -> a
$cminimum :: forall a. Ord a => Position' a -> a
minimum :: forall a. Ord a => Position' a -> a
$csum :: forall a. Num a => Position' a -> a
sum :: forall a. Num a => Position' a -> a
$cproduct :: forall a. Num a => Position' a -> a
product :: forall a. Num a => Position' a -> a
Foldable, Functor Position'
Foldable Position'
(Functor Position', Foldable Position') =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Position' a -> f (Position' b))
-> (forall (f :: * -> *) a.
Applicative f =>
Position' (f a) -> f (Position' a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Position' a -> m (Position' b))
-> (forall (m :: * -> *) a.
Monad m =>
Position' (m a) -> m (Position' a))
-> Traversable Position'
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
Position' (m a) -> m (Position' a)
forall (f :: * -> *) a.
Applicative f =>
Position' (f a) -> f (Position' a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Position' a -> m (Position' b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Position' a -> f (Position' b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Position' a -> f (Position' b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Position' a -> f (Position' b)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
Position' (f a) -> f (Position' a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Position' (f a) -> f (Position' a)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Position' a -> m (Position' b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Position' a -> m (Position' b)
$csequence :: forall (m :: * -> *) a.
Monad m =>
Position' (m a) -> m (Position' a)
sequence :: forall (m :: * -> *) a.
Monad m =>
Position' (m a) -> m (Position' a)
Traversable, (forall x. Position' a -> Rep (Position' a) x)
-> (forall x. Rep (Position' a) x -> Position' a)
-> Generic (Position' a)
forall x. Rep (Position' a) x -> Position' a
forall x. Position' a -> Rep (Position' a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Position' a) x -> Position' a
forall a x. Position' a -> Rep (Position' a) x
$cfrom :: forall a x. Position' a -> Rep (Position' a) x
from :: forall x. Position' a -> Rep (Position' a) x
$cto :: forall a x. Rep (Position' a) x -> Position' a
to :: forall x. Rep (Position' a) x -> Position' a
Generic)
positionInvariant :: Position' a -> Bool
positionInvariant :: forall a. Position' a -> Bool
positionInvariant Position' a
p =
Position' a -> Int32
forall a. Position' a -> Int32
posPos Position' a
p Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> Int32
0 Bool -> Bool -> Bool
&& Position' a -> Int32
forall a. Position' a -> Int32
posLine Position' a
p Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> Int32
0 Bool -> Bool -> Bool
&& Position' a -> Int32
forall a. Position' a -> Int32
posCol Position' a
p Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> Int32
0
importantPart :: Position' a -> (a, Int32)
importantPart :: forall a. Position' a -> (a, Int32)
importantPart Position' a
p = (Position' a -> a
forall a. Position' a -> a
srcFile Position' a
p, Position' a -> Int32
forall a. Position' a -> Int32
posPos Position' a
p)
instance Eq a => Eq (Position' a) where
== :: Position' a -> Position' a -> Bool
(==) = (a, Int32) -> (a, Int32) -> Bool
forall a. Eq a => a -> a -> Bool
(==) ((a, Int32) -> (a, Int32) -> Bool)
-> (Position' a -> (a, Int32))
-> Position' a
-> Position' a
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Position' a -> (a, Int32)
forall a. Position' a -> (a, Int32)
importantPart
instance Ord a => Ord (Position' a) where
compare :: Position' a -> Position' a -> Ordering
compare = (a, Int32) -> (a, Int32) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ((a, Int32) -> (a, Int32) -> Ordering)
-> (Position' a -> (a, Int32))
-> Position' a
-> Position' a
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Position' a -> (a, Int32)
forall a. Position' a -> (a, Int32)
importantPart
type SrcFile = Strict.Maybe RangeFile
data RangeFile = RangeFile
{ RangeFile -> AbsolutePath
rangeFilePath :: !AbsolutePath
, RangeFile -> Maybe (TopLevelModuleName' Range)
rangeFileName :: !(Maybe (TopLevelModuleName' Range))
}
deriving (Int -> RangeFile -> ShowS
[RangeFile] -> ShowS
RangeFile -> String
(Int -> RangeFile -> ShowS)
-> (RangeFile -> String)
-> ([RangeFile] -> ShowS)
-> Show RangeFile
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RangeFile -> ShowS
showsPrec :: Int -> RangeFile -> ShowS
$cshow :: RangeFile -> String
show :: RangeFile -> String
$cshowList :: [RangeFile] -> ShowS
showList :: [RangeFile] -> ShowS
Show, (forall x. RangeFile -> Rep RangeFile x)
-> (forall x. Rep RangeFile x -> RangeFile) -> Generic RangeFile
forall x. Rep RangeFile x -> RangeFile
forall x. RangeFile -> Rep RangeFile x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. RangeFile -> Rep RangeFile x
from :: forall x. RangeFile -> Rep RangeFile x
$cto :: forall x. Rep RangeFile x -> RangeFile
to :: forall x. Rep RangeFile x -> RangeFile
Generic)
mkRangeFile :: AbsolutePath -> Maybe (TopLevelModuleName' Range) -> RangeFile
mkRangeFile :: AbsolutePath -> Maybe (TopLevelModuleName' Range) -> RangeFile
mkRangeFile AbsolutePath
f Maybe (TopLevelModuleName' Range)
top = RangeFile
{ rangeFilePath :: AbsolutePath
rangeFilePath = AbsolutePath
f
, rangeFileName :: Maybe (TopLevelModuleName' Range)
rangeFileName = KillRangeT (Maybe (TopLevelModuleName' Range))
forall a. KillRange a => KillRangeT a
killRange Maybe (TopLevelModuleName' Range)
top
}
instance Eq RangeFile where
== :: RangeFile -> RangeFile -> Bool
(==) = Maybe (TopLevelModuleName' Range)
-> Maybe (TopLevelModuleName' Range) -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Maybe (TopLevelModuleName' Range)
-> Maybe (TopLevelModuleName' Range) -> Bool)
-> (RangeFile -> Maybe (TopLevelModuleName' Range))
-> RangeFile
-> RangeFile
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` RangeFile -> Maybe (TopLevelModuleName' Range)
rangeFileName
instance Ord RangeFile where
compare :: RangeFile -> RangeFile -> Ordering
compare = Maybe (TopLevelModuleName' Range)
-> Maybe (TopLevelModuleName' Range) -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Maybe (TopLevelModuleName' Range)
-> Maybe (TopLevelModuleName' Range) -> Ordering)
-> (RangeFile -> Maybe (TopLevelModuleName' Range))
-> RangeFile
-> RangeFile
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` RangeFile -> Maybe (TopLevelModuleName' Range)
rangeFileName
instance NFData RangeFile where
rnf :: RangeFile -> ()
rnf (RangeFile AbsolutePath
_ Maybe (TopLevelModuleName' Range)
n) = Maybe (TopLevelModuleName' Range) -> ()
forall a. NFData a => a -> ()
rnf Maybe (TopLevelModuleName' Range)
n
type Position = Position' SrcFile
type PositionWithoutFile = Position' ()
instance NFData Position where
rnf :: Position -> ()
rnf = (Position -> () -> ()
forall a b. a -> b -> b
`seq` ())
instance NFData PositionWithoutFile where
rnf :: PositionWithoutFile -> ()
rnf = (PositionWithoutFile -> () -> ()
forall a b. a -> b -> b
`seq` ())
data Interval' a = Interval { forall a. Interval' a -> Position' a
iStart, forall a. Interval' a -> Position' a
iEnd :: !(Position' a) }
deriving (Int -> Interval' a -> ShowS
[Interval' a] -> ShowS
Interval' a -> String
(Int -> Interval' a -> ShowS)
-> (Interval' a -> String)
-> ([Interval' a] -> ShowS)
-> Show (Interval' a)
forall a. Show a => Int -> Interval' a -> ShowS
forall a. Show a => [Interval' a] -> ShowS
forall a. Show a => Interval' a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Interval' a -> ShowS
showsPrec :: Int -> Interval' a -> ShowS
$cshow :: forall a. Show a => Interval' a -> String
show :: Interval' a -> String
$cshowList :: forall a. Show a => [Interval' a] -> ShowS
showList :: [Interval' a] -> ShowS
Show, Interval' a -> Interval' a -> Bool
(Interval' a -> Interval' a -> Bool)
-> (Interval' a -> Interval' a -> Bool) -> Eq (Interval' a)
forall a. Eq a => Interval' a -> Interval' a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Interval' a -> Interval' a -> Bool
== :: Interval' a -> Interval' a -> Bool
$c/= :: forall a. Eq a => Interval' a -> Interval' a -> Bool
/= :: Interval' a -> Interval' a -> Bool
Eq, Eq (Interval' a)
Eq (Interval' a) =>
(Interval' a -> Interval' a -> Ordering)
-> (Interval' a -> Interval' a -> Bool)
-> (Interval' a -> Interval' a -> Bool)
-> (Interval' a -> Interval' a -> Bool)
-> (Interval' a -> Interval' a -> Bool)
-> (Interval' a -> Interval' a -> Interval' a)
-> (Interval' a -> Interval' a -> Interval' a)
-> Ord (Interval' a)
Interval' a -> Interval' a -> Bool
Interval' a -> Interval' a -> Ordering
Interval' a -> Interval' a -> Interval' a
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
forall a. Ord a => Eq (Interval' a)
forall a. Ord a => Interval' a -> Interval' a -> Bool
forall a. Ord a => Interval' a -> Interval' a -> Ordering
forall a. Ord a => Interval' a -> Interval' a -> Interval' a
$ccompare :: forall a. Ord a => Interval' a -> Interval' a -> Ordering
compare :: Interval' a -> Interval' a -> Ordering
$c< :: forall a. Ord a => Interval' a -> Interval' a -> Bool
< :: Interval' a -> Interval' a -> Bool
$c<= :: forall a. Ord a => Interval' a -> Interval' a -> Bool
<= :: Interval' a -> Interval' a -> Bool
$c> :: forall a. Ord a => Interval' a -> Interval' a -> Bool
> :: Interval' a -> Interval' a -> Bool
$c>= :: forall a. Ord a => Interval' a -> Interval' a -> Bool
>= :: Interval' a -> Interval' a -> Bool
$cmax :: forall a. Ord a => Interval' a -> Interval' a -> Interval' a
max :: Interval' a -> Interval' a -> Interval' a
$cmin :: forall a. Ord a => Interval' a -> Interval' a -> Interval' a
min :: Interval' a -> Interval' a -> Interval' a
Ord, (forall a b. (a -> b) -> Interval' a -> Interval' b)
-> (forall a b. a -> Interval' b -> Interval' a)
-> Functor Interval'
forall a b. a -> Interval' b -> Interval' a
forall a b. (a -> b) -> Interval' a -> Interval' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Interval' a -> Interval' b
fmap :: forall a b. (a -> b) -> Interval' a -> Interval' b
$c<$ :: forall a b. a -> Interval' b -> Interval' a
<$ :: forall a b. a -> Interval' b -> Interval' a
Functor, (forall m. Monoid m => Interval' m -> m)
-> (forall m a. Monoid m => (a -> m) -> Interval' a -> m)
-> (forall m a. Monoid m => (a -> m) -> Interval' a -> m)
-> (forall a b. (a -> b -> b) -> b -> Interval' a -> b)
-> (forall a b. (a -> b -> b) -> b -> Interval' a -> b)
-> (forall b a. (b -> a -> b) -> b -> Interval' a -> b)
-> (forall b a. (b -> a -> b) -> b -> Interval' a -> b)
-> (forall a. (a -> a -> a) -> Interval' a -> a)
-> (forall a. (a -> a -> a) -> Interval' a -> a)
-> (forall a. Interval' a -> [a])
-> (forall a. Interval' a -> Bool)
-> (forall a. Interval' a -> Int)
-> (forall a. Eq a => a -> Interval' a -> Bool)
-> (forall a. Ord a => Interval' a -> a)
-> (forall a. Ord a => Interval' a -> a)
-> (forall a. Num a => Interval' a -> a)
-> (forall a. Num a => Interval' a -> a)
-> Foldable Interval'
forall a. Eq a => a -> Interval' a -> Bool
forall a. Num a => Interval' a -> a
forall a. Ord a => Interval' a -> a
forall m. Monoid m => Interval' m -> m
forall a. Interval' a -> Bool
forall a. Interval' a -> Int
forall a. Interval' a -> [a]
forall a. (a -> a -> a) -> Interval' a -> a
forall m a. Monoid m => (a -> m) -> Interval' a -> m
forall b a. (b -> a -> b) -> b -> Interval' a -> b
forall a b. (a -> b -> b) -> b -> Interval' a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => Interval' m -> m
fold :: forall m. Monoid m => Interval' m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Interval' a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Interval' a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Interval' a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Interval' a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> Interval' a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Interval' a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Interval' a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Interval' a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Interval' a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Interval' a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Interval' a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Interval' a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> Interval' a -> a
foldr1 :: forall a. (a -> a -> a) -> Interval' a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Interval' a -> a
foldl1 :: forall a. (a -> a -> a) -> Interval' a -> a
$ctoList :: forall a. Interval' a -> [a]
toList :: forall a. Interval' a -> [a]
$cnull :: forall a. Interval' a -> Bool
null :: forall a. Interval' a -> Bool
$clength :: forall a. Interval' a -> Int
length :: forall a. Interval' a -> Int
$celem :: forall a. Eq a => a -> Interval' a -> Bool
elem :: forall a. Eq a => a -> Interval' a -> Bool
$cmaximum :: forall a. Ord a => Interval' a -> a
maximum :: forall a. Ord a => Interval' a -> a
$cminimum :: forall a. Ord a => Interval' a -> a
minimum :: forall a. Ord a => Interval' a -> a
$csum :: forall a. Num a => Interval' a -> a
sum :: forall a. Num a => Interval' a -> a
$cproduct :: forall a. Num a => Interval' a -> a
product :: forall a. Num a => Interval' a -> a
Foldable, Functor Interval'
Foldable Interval'
(Functor Interval', Foldable Interval') =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Interval' a -> f (Interval' b))
-> (forall (f :: * -> *) a.
Applicative f =>
Interval' (f a) -> f (Interval' a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Interval' a -> m (Interval' b))
-> (forall (m :: * -> *) a.
Monad m =>
Interval' (m a) -> m (Interval' a))
-> Traversable Interval'
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
Interval' (m a) -> m (Interval' a)
forall (f :: * -> *) a.
Applicative f =>
Interval' (f a) -> f (Interval' a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Interval' a -> m (Interval' b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Interval' a -> f (Interval' b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Interval' a -> f (Interval' b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Interval' a -> f (Interval' b)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
Interval' (f a) -> f (Interval' a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Interval' (f a) -> f (Interval' a)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Interval' a -> m (Interval' b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Interval' a -> m (Interval' b)
$csequence :: forall (m :: * -> *) a.
Monad m =>
Interval' (m a) -> m (Interval' a)
sequence :: forall (m :: * -> *) a.
Monad m =>
Interval' (m a) -> m (Interval' a)
Traversable, (forall x. Interval' a -> Rep (Interval' a) x)
-> (forall x. Rep (Interval' a) x -> Interval' a)
-> Generic (Interval' a)
forall x. Rep (Interval' a) x -> Interval' a
forall x. Interval' a -> Rep (Interval' a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Interval' a) x -> Interval' a
forall a x. Interval' a -> Rep (Interval' a) x
$cfrom :: forall a x. Interval' a -> Rep (Interval' a) x
from :: forall x. Interval' a -> Rep (Interval' a) x
$cto :: forall a x. Rep (Interval' a) x -> Interval' a
to :: forall x. Rep (Interval' a) x -> Interval' a
Generic)
type Interval = Interval' SrcFile
type IntervalWithoutFile = Interval' ()
instance NFData Interval where
rnf :: Interval -> ()
rnf = (Interval -> () -> ()
forall a b. a -> b -> b
`seq` ())
instance NFData IntervalWithoutFile where
rnf :: IntervalWithoutFile -> ()
rnf = (IntervalWithoutFile -> () -> ()
forall a b. a -> b -> b
`seq` ())
intervalInvariant :: Ord a => Interval' a -> Bool
intervalInvariant :: forall a. Ord a => Interval' a -> Bool
intervalInvariant Interval' a
i =
(Position' a -> Bool) -> [Position' a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Position' a -> Bool
forall a. Position' a -> Bool
positionInvariant [Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
i, Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
i]
Bool -> Bool -> Bool
&&
Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
i Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
<= Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
i
Bool -> Bool -> Bool
&&
Position' a -> a
forall a. Position' a -> a
srcFile (Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
i) a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== Position' a -> a
forall a. Position' a -> a
srcFile (Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
i)
setIntervalFile :: a -> Interval' b -> Interval' a
setIntervalFile :: forall a b. a -> Interval' b -> Interval' a
setIntervalFile a
f (Interval Position' b
p1 Position' b
p2) =
Position' a -> Position' a -> Interval' a
forall a. Position' a -> Position' a -> Interval' a
Interval (Position' b
p1 { srcFile = f }) (Position' b
p2 { srcFile = f })
getIntervalFile :: Interval' a -> a
getIntervalFile :: forall a. Interval' a -> a
getIntervalFile = Position' a -> a
forall a. Position' a -> a
srcFile (Position' a -> a)
-> (Interval' a -> Position' a) -> Interval' a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart
posToInterval ::
a -> PositionWithoutFile -> PositionWithoutFile -> Interval' a
posToInterval :: forall a.
a -> PositionWithoutFile -> PositionWithoutFile -> Interval' a
posToInterval a
f PositionWithoutFile
p1 PositionWithoutFile
p2 = a -> IntervalWithoutFile -> Interval' a
forall a b. a -> Interval' b -> Interval' a
setIntervalFile a
f (IntervalWithoutFile -> Interval' a)
-> IntervalWithoutFile -> Interval' a
forall a b. (a -> b) -> a -> b
$
if PositionWithoutFile
p1 PositionWithoutFile -> PositionWithoutFile -> Bool
forall a. Ord a => a -> a -> Bool
< PositionWithoutFile
p2
then PositionWithoutFile -> PositionWithoutFile -> IntervalWithoutFile
forall a. Position' a -> Position' a -> Interval' a
Interval PositionWithoutFile
p1 PositionWithoutFile
p2
else PositionWithoutFile -> PositionWithoutFile -> IntervalWithoutFile
forall a. Position' a -> Position' a -> Interval' a
Interval PositionWithoutFile
p2 PositionWithoutFile
p1
iLength :: Interval' a -> Int32
iLength :: forall a. Interval' a -> Int32
iLength Interval' a
i = Position' a -> Int32
forall a. Position' a -> Int32
posPos (Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
i) Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Position' a -> Int32
forall a. Position' a -> Int32
posPos (Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
i)
data Range' a
= NoRange
| Range !a (Seq IntervalWithoutFile)
deriving
(Int -> Range' a -> ShowS
[Range' a] -> ShowS
Range' a -> String
(Int -> Range' a -> ShowS)
-> (Range' a -> String) -> ([Range' a] -> ShowS) -> Show (Range' a)
forall a. Show a => Int -> Range' a -> ShowS
forall a. Show a => [Range' a] -> ShowS
forall a. Show a => Range' a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Range' a -> ShowS
showsPrec :: Int -> Range' a -> ShowS
$cshow :: forall a. Show a => Range' a -> String
show :: Range' a -> String
$cshowList :: forall a. Show a => [Range' a] -> ShowS
showList :: [Range' a] -> ShowS
Show, Range' a -> Range' a -> Bool
(Range' a -> Range' a -> Bool)
-> (Range' a -> Range' a -> Bool) -> Eq (Range' a)
forall a. Eq a => Range' a -> Range' a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Range' a -> Range' a -> Bool
== :: Range' a -> Range' a -> Bool
$c/= :: forall a. Eq a => Range' a -> Range' a -> Bool
/= :: Range' a -> Range' a -> Bool
Eq, Eq (Range' a)
Eq (Range' a) =>
(Range' a -> Range' a -> Ordering)
-> (Range' a -> Range' a -> Bool)
-> (Range' a -> Range' a -> Bool)
-> (Range' a -> Range' a -> Bool)
-> (Range' a -> Range' a -> Bool)
-> (Range' a -> Range' a -> Range' a)
-> (Range' a -> Range' a -> Range' a)
-> Ord (Range' a)
Range' a -> Range' a -> Bool
Range' a -> Range' a -> Ordering
Range' a -> Range' a -> Range' a
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
forall a. Ord a => Eq (Range' a)
forall a. Ord a => Range' a -> Range' a -> Bool
forall a. Ord a => Range' a -> Range' a -> Ordering
forall a. Ord a => Range' a -> Range' a -> Range' a
$ccompare :: forall a. Ord a => Range' a -> Range' a -> Ordering
compare :: Range' a -> Range' a -> Ordering
$c< :: forall a. Ord a => Range' a -> Range' a -> Bool
< :: Range' a -> Range' a -> Bool
$c<= :: forall a. Ord a => Range' a -> Range' a -> Bool
<= :: Range' a -> Range' a -> Bool
$c> :: forall a. Ord a => Range' a -> Range' a -> Bool
> :: Range' a -> Range' a -> Bool
$c>= :: forall a. Ord a => Range' a -> Range' a -> Bool
>= :: Range' a -> Range' a -> Bool
$cmax :: forall a. Ord a => Range' a -> Range' a -> Range' a
max :: Range' a -> Range' a -> Range' a
$cmin :: forall a. Ord a => Range' a -> Range' a -> Range' a
min :: Range' a -> Range' a -> Range' a
Ord, (forall a b. (a -> b) -> Range' a -> Range' b)
-> (forall a b. a -> Range' b -> Range' a) -> Functor Range'
forall a b. a -> Range' b -> Range' a
forall a b. (a -> b) -> Range' a -> Range' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Range' a -> Range' b
fmap :: forall a b. (a -> b) -> Range' a -> Range' b
$c<$ :: forall a b. a -> Range' b -> Range' a
<$ :: forall a b. a -> Range' b -> Range' a
Functor, (forall m. Monoid m => Range' m -> m)
-> (forall m a. Monoid m => (a -> m) -> Range' a -> m)
-> (forall m a. Monoid m => (a -> m) -> Range' a -> m)
-> (forall a b. (a -> b -> b) -> b -> Range' a -> b)
-> (forall a b. (a -> b -> b) -> b -> Range' a -> b)
-> (forall b a. (b -> a -> b) -> b -> Range' a -> b)
-> (forall b a. (b -> a -> b) -> b -> Range' a -> b)
-> (forall a. (a -> a -> a) -> Range' a -> a)
-> (forall a. (a -> a -> a) -> Range' a -> a)
-> (forall a. Range' a -> [a])
-> (forall a. Range' a -> Bool)
-> (forall a. Range' a -> Int)
-> (forall a. Eq a => a -> Range' a -> Bool)
-> (forall a. Ord a => Range' a -> a)
-> (forall a. Ord a => Range' a -> a)
-> (forall a. Num a => Range' a -> a)
-> (forall a. Num a => Range' a -> a)
-> Foldable Range'
forall a. Eq a => a -> Range' a -> Bool
forall a. Num a => Range' a -> a
forall a. Ord a => Range' a -> a
forall m. Monoid m => Range' m -> m
forall a. Range' a -> Bool
forall a. Range' a -> Int
forall a. Range' a -> [a]
forall a. (a -> a -> a) -> Range' a -> a
forall m a. Monoid m => (a -> m) -> Range' a -> m
forall b a. (b -> a -> b) -> b -> Range' a -> b
forall a b. (a -> b -> b) -> b -> Range' a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall m. Monoid m => Range' m -> m
fold :: forall m. Monoid m => Range' m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Range' a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Range' a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Range' a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Range' a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> Range' a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Range' a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Range' a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Range' a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Range' a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Range' a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Range' a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Range' a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> Range' a -> a
foldr1 :: forall a. (a -> a -> a) -> Range' a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Range' a -> a
foldl1 :: forall a. (a -> a -> a) -> Range' a -> a
$ctoList :: forall a. Range' a -> [a]
toList :: forall a. Range' a -> [a]
$cnull :: forall a. Range' a -> Bool
null :: forall a. Range' a -> Bool
$clength :: forall a. Range' a -> Int
length :: forall a. Range' a -> Int
$celem :: forall a. Eq a => a -> Range' a -> Bool
elem :: forall a. Eq a => a -> Range' a -> Bool
$cmaximum :: forall a. Ord a => Range' a -> a
maximum :: forall a. Ord a => Range' a -> a
$cminimum :: forall a. Ord a => Range' a -> a
minimum :: forall a. Ord a => Range' a -> a
$csum :: forall a. Num a => Range' a -> a
sum :: forall a. Num a => Range' a -> a
$cproduct :: forall a. Num a => Range' a -> a
product :: forall a. Num a => Range' a -> a
Foldable, Functor Range'
Foldable Range'
(Functor Range', Foldable Range') =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Range' a -> f (Range' b))
-> (forall (f :: * -> *) a.
Applicative f =>
Range' (f a) -> f (Range' a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Range' a -> m (Range' b))
-> (forall (m :: * -> *) a.
Monad m =>
Range' (m a) -> m (Range' a))
-> Traversable Range'
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => Range' (m a) -> m (Range' a)
forall (f :: * -> *) a.
Applicative f =>
Range' (f a) -> f (Range' a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Range' a -> m (Range' b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Range' a -> f (Range' b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Range' a -> f (Range' b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Range' a -> f (Range' b)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
Range' (f a) -> f (Range' a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Range' (f a) -> f (Range' a)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Range' a -> m (Range' b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Range' a -> m (Range' b)
$csequence :: forall (m :: * -> *) a. Monad m => Range' (m a) -> m (Range' a)
sequence :: forall (m :: * -> *) a. Monad m => Range' (m a) -> m (Range' a)
Traversable, (forall x. Range' a -> Rep (Range' a) x)
-> (forall x. Rep (Range' a) x -> Range' a) -> Generic (Range' a)
forall x. Rep (Range' a) x -> Range' a
forall x. Range' a -> Rep (Range' a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Range' a) x -> Range' a
forall a x. Range' a -> Rep (Range' a) x
$cfrom :: forall a x. Range' a -> Rep (Range' a) x
from :: forall x. Range' a -> Rep (Range' a) x
$cto :: forall a x. Rep (Range' a) x -> Range' a
to :: forall x. Rep (Range' a) x -> Range' a
Generic)
type Range = Range' SrcFile
instance NFData a => NFData (Range' a)
instance Null (Range' a) where
null :: Range' a -> Bool
null Range' a
NoRange = Bool
True
null Range{} = Bool
False
empty :: Range' a
empty = Range' a
forall a. Range' a
NoRange
instance Eq a => Semigroup (Range' a) where
Range' a
NoRange <> :: Range' a -> Range' a -> Range' a
<> Range' a
r = Range' a
r
Range' a
r <> Range' a
NoRange = Range' a
r
Range a
f Seq IntervalWithoutFile
is <> Range a
f' Seq IntervalWithoutFile
is'
| a
f a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
f' = Range' a
forall a. HasCallStack => a
__IMPOSSIBLE__
| Bool
otherwise = a -> Seq IntervalWithoutFile -> Range' a
forall a. a -> Seq IntervalWithoutFile -> Range' a
Range a
f (Seq IntervalWithoutFile
is Seq IntervalWithoutFile
-> Seq IntervalWithoutFile -> Seq IntervalWithoutFile
forall a. Semigroup a => a -> a -> a
<> Seq IntervalWithoutFile
is')
instance Eq a => Monoid (Range' a) where
mempty :: Range' a
mempty = Range' a
forall a. Null a => a
empty
mappend :: Range' a -> Range' a -> Range' a
mappend = Range' a -> Range' a -> Range' a
forall a. Semigroup a => a -> a -> a
(<>)
rangeIntervals :: Range' a -> [IntervalWithoutFile]
rangeIntervals :: forall a. Range' a -> [IntervalWithoutFile]
rangeIntervals Range' a
NoRange = []
rangeIntervals (Range a
_ Seq IntervalWithoutFile
is) = Seq IntervalWithoutFile -> [IntervalWithoutFile]
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
Fold.toList Seq IntervalWithoutFile
is
intervalsToRange :: a -> [IntervalWithoutFile] -> Range' a
intervalsToRange :: forall a. a -> [IntervalWithoutFile] -> Range' a
intervalsToRange a
_ [] = Range' a
forall a. Range' a
NoRange
intervalsToRange a
f [IntervalWithoutFile]
is = a -> Seq IntervalWithoutFile -> Range' a
forall a. a -> Seq IntervalWithoutFile -> Range' a
Range a
f ([IntervalWithoutFile] -> Seq IntervalWithoutFile
forall a. [a] -> Seq a
Seq.fromList [IntervalWithoutFile]
is)
consecutiveAndSeparated :: Ord a => [Interval' a] -> Bool
consecutiveAndSeparated :: forall a. Ord a => [Interval' a] -> Bool
consecutiveAndSeparated [Interval' a]
is =
(Interval' a -> Bool) -> [Interval' a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Interval' a -> Bool
forall a. Ord a => Interval' a -> Bool
intervalInvariant [Interval' a]
is
Bool -> Bool -> Bool
&&
[a] -> Bool
forall a. Eq a => [a] -> Bool
allEqual ((Interval' a -> a) -> [Interval' a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (Position' a -> a
forall a. Position' a -> a
srcFile (Position' a -> a)
-> (Interval' a -> Position' a) -> Interval' a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart) [Interval' a]
is)
Bool -> Bool -> Bool
&&
(Interval' a -> Interval' a -> Bool) -> [Interval' a] -> Bool
forall a. (a -> a -> Bool) -> [a] -> Bool
allConsecutive (\ Interval' a
i Interval' a
j -> Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
i Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
j) [Interval' a]
is
rangeInvariant :: Ord a => Range' a -> Bool
rangeInvariant :: forall a. Ord a => Range' a -> Bool
rangeInvariant Range' a
r =
[IntervalWithoutFile] -> Bool
forall a. Ord a => [Interval' a] -> Bool
consecutiveAndSeparated (Range' a -> [IntervalWithoutFile]
forall a. Range' a -> [IntervalWithoutFile]
rangeIntervals Range' a
r)
Bool -> Bool -> Bool
&&
case Range' a
r of
Range a
_ Seq IntervalWithoutFile
is -> Bool -> Bool
not (Seq IntervalWithoutFile -> Bool
forall a. Null a => a -> Bool
null Seq IntervalWithoutFile
is)
Range' a
NoRange -> Bool
True
rangeFile :: Range -> SrcFile
rangeFile :: Range -> SrcFile
rangeFile Range
NoRange = SrcFile
forall a. Maybe a
Strict.Nothing
rangeFile (Range SrcFile
f Seq IntervalWithoutFile
_) = SrcFile
f
rangeModule' :: Range -> Maybe (Maybe (TopLevelModuleName' Range))
rangeModule' :: Range -> Maybe (Maybe (TopLevelModuleName' Range))
rangeModule' Range
NoRange = Maybe (Maybe (TopLevelModuleName' Range))
forall a. Maybe a
Nothing
rangeModule' (Range SrcFile
f Seq IntervalWithoutFile
_) = Maybe (TopLevelModuleName' Range)
-> Maybe (Maybe (TopLevelModuleName' Range))
forall a. a -> Maybe a
Just (Maybe (TopLevelModuleName' Range)
-> Maybe (Maybe (TopLevelModuleName' Range)))
-> Maybe (TopLevelModuleName' Range)
-> Maybe (Maybe (TopLevelModuleName' Range))
forall a b. (a -> b) -> a -> b
$ case SrcFile
f of
SrcFile
Strict.Nothing -> Maybe (TopLevelModuleName' Range)
forall a. Maybe a
Nothing
Strict.Just RangeFile
f -> RangeFile -> Maybe (TopLevelModuleName' Range)
rangeFileName RangeFile
f
rangeModule :: Range -> Maybe (TopLevelModuleName' Range)
rangeModule :: Range -> Maybe (TopLevelModuleName' Range)
rangeModule = Maybe (Maybe (TopLevelModuleName' Range))
-> Maybe (TopLevelModuleName' Range)
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (Maybe (Maybe (TopLevelModuleName' Range))
-> Maybe (TopLevelModuleName' Range))
-> (Range -> Maybe (Maybe (TopLevelModuleName' Range)))
-> Range
-> Maybe (TopLevelModuleName' Range)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Range -> Maybe (Maybe (TopLevelModuleName' Range))
rangeModule'
rightMargin :: Range -> Range
rightMargin :: Range -> Range
rightMargin r :: Range
r@Range
NoRange = Range
r
rightMargin r :: Range
r@(Range SrcFile
f Seq IntervalWithoutFile
is) = case Seq IntervalWithoutFile -> ViewR IntervalWithoutFile
forall a. Seq a -> ViewR a
Seq.viewr Seq IntervalWithoutFile
is of
ViewR IntervalWithoutFile
Seq.EmptyR -> Range
forall a. HasCallStack => a
__IMPOSSIBLE__
Seq IntervalWithoutFile
_ Seq.:> IntervalWithoutFile
i -> SrcFile -> IntervalWithoutFile -> Range
forall a. a -> IntervalWithoutFile -> Range' a
intervalToRange SrcFile
f (IntervalWithoutFile
i { iStart = iEnd i })
newtype PrintRange a = PrintRange a
deriving (PrintRange a -> PrintRange a -> Bool
(PrintRange a -> PrintRange a -> Bool)
-> (PrintRange a -> PrintRange a -> Bool) -> Eq (PrintRange a)
forall a. Eq a => PrintRange a -> PrintRange a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => PrintRange a -> PrintRange a -> Bool
== :: PrintRange a -> PrintRange a -> Bool
$c/= :: forall a. Eq a => PrintRange a -> PrintRange a -> Bool
/= :: PrintRange a -> PrintRange a -> Bool
Eq, Eq (PrintRange a)
Eq (PrintRange a) =>
(PrintRange a -> PrintRange a -> Ordering)
-> (PrintRange a -> PrintRange a -> Bool)
-> (PrintRange a -> PrintRange a -> Bool)
-> (PrintRange a -> PrintRange a -> Bool)
-> (PrintRange a -> PrintRange a -> Bool)
-> (PrintRange a -> PrintRange a -> PrintRange a)
-> (PrintRange a -> PrintRange a -> PrintRange a)
-> Ord (PrintRange a)
PrintRange a -> PrintRange a -> Bool
PrintRange a -> PrintRange a -> Ordering
PrintRange a -> PrintRange a -> PrintRange a
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
forall a. Ord a => Eq (PrintRange a)
forall a. Ord a => PrintRange a -> PrintRange a -> Bool
forall a. Ord a => PrintRange a -> PrintRange a -> Ordering
forall a. Ord a => PrintRange a -> PrintRange a -> PrintRange a
$ccompare :: forall a. Ord a => PrintRange a -> PrintRange a -> Ordering
compare :: PrintRange a -> PrintRange a -> Ordering
$c< :: forall a. Ord a => PrintRange a -> PrintRange a -> Bool
< :: PrintRange a -> PrintRange a -> Bool
$c<= :: forall a. Ord a => PrintRange a -> PrintRange a -> Bool
<= :: PrintRange a -> PrintRange a -> Bool
$c> :: forall a. Ord a => PrintRange a -> PrintRange a -> Bool
> :: PrintRange a -> PrintRange a -> Bool
$c>= :: forall a. Ord a => PrintRange a -> PrintRange a -> Bool
>= :: PrintRange a -> PrintRange a -> Bool
$cmax :: forall a. Ord a => PrintRange a -> PrintRange a -> PrintRange a
max :: PrintRange a -> PrintRange a -> PrintRange a
$cmin :: forall a. Ord a => PrintRange a -> PrintRange a -> PrintRange a
min :: PrintRange a -> PrintRange a -> PrintRange a
Ord, PrintRange a -> Range
(PrintRange a -> Range) -> HasRange (PrintRange a)
forall a. HasRange a => PrintRange a -> Range
forall a. (a -> Range) -> HasRange a
$cgetRange :: forall a. HasRange a => PrintRange a -> Range
getRange :: PrintRange a -> Range
HasRange, HasRange (PrintRange a)
HasRange (PrintRange a) =>
(Range -> PrintRange a -> PrintRange a) -> SetRange (PrintRange a)
Range -> PrintRange a -> PrintRange a
forall a. SetRange a => HasRange (PrintRange a)
forall a. SetRange a => Range -> PrintRange a -> PrintRange a
forall a. HasRange a => (Range -> a -> a) -> SetRange a
$csetRange :: forall a. SetRange a => Range -> PrintRange a -> PrintRange a
setRange :: Range -> PrintRange a -> PrintRange a
SetRange, KillRangeT (PrintRange a)
KillRangeT (PrintRange a) -> KillRange (PrintRange a)
forall a. KillRange a => KillRangeT (PrintRange a)
forall a. KillRangeT a -> KillRange a
$ckillRange :: forall a. KillRange a => KillRangeT (PrintRange a)
killRange :: KillRangeT (PrintRange a)
KillRange)
class HasRange a where
getRange :: a -> Range
default getRange :: (Foldable t, HasRange b, t b ~ a) => a -> Range
getRange = (b -> Range -> Range) -> Range -> t b -> Range
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Fold.foldr b -> Range -> Range
forall u t. (HasRange u, HasRange t) => u -> t -> Range
fuseRange Range
forall a. Range' a
noRange
{-# INLINABLE getRange #-}
instance HasRange Interval where
getRange :: Interval -> Range
getRange Interval
i =
SrcFile -> IntervalWithoutFile -> Range
forall a. a -> IntervalWithoutFile -> Range' a
intervalToRange (Position -> SrcFile
forall a. Position' a -> a
srcFile (Interval -> Position
forall a. Interval' a -> Position' a
iStart Interval
i))
(() -> Interval -> IntervalWithoutFile
forall a b. a -> Interval' b -> Interval' a
setIntervalFile () Interval
i)
instance HasRange Range where
getRange :: Range -> Range
getRange = Range -> Range
forall a. a -> a
id
instance HasRange () where
getRange :: () -> Range
getRange ()
_ = Range
forall a. Range' a
noRange
instance HasRange Bool where
getRange :: Bool -> Range
getRange Bool
_ = Range
forall a. Range' a
noRange
instance HasRange (TopLevelModuleName' Range) where
getRange :: TopLevelModuleName' Range -> Range
getRange = TopLevelModuleName' Range -> Range
forall range. TopLevelModuleName' range -> range
moduleNameRange
instance SetRange (TopLevelModuleName' Range) where
setRange :: Range -> TopLevelModuleName' Range -> TopLevelModuleName' Range
setRange Range
r (TopLevelModuleName Range
_ ModuleNameHash
h TopLevelModuleNameParts
x) = Range
-> ModuleNameHash
-> TopLevelModuleNameParts
-> TopLevelModuleName' Range
forall range.
range
-> ModuleNameHash
-> TopLevelModuleNameParts
-> TopLevelModuleName' range
TopLevelModuleName Range
r ModuleNameHash
h TopLevelModuleNameParts
x
instance KillRange (TopLevelModuleName' Range) where
killRange :: TopLevelModuleName' Range -> TopLevelModuleName' Range
killRange (TopLevelModuleName Range
_ ModuleNameHash
h TopLevelModuleNameParts
x) = Range
-> ModuleNameHash
-> TopLevelModuleNameParts
-> TopLevelModuleName' Range
forall range.
range
-> ModuleNameHash
-> TopLevelModuleNameParts
-> TopLevelModuleName' range
TopLevelModuleName Range
forall a. Range' a
noRange ModuleNameHash
h TopLevelModuleNameParts
x
instance HasRange a => HasRange [a]
instance HasRange a => HasRange (List1 a)
instance HasRange a => HasRange (List2 a)
instance HasRange a => HasRange (Maybe a)
instance (HasRange a, HasRange b) => HasRange (a,b) where
getRange :: (a, b) -> Range
getRange = (a -> b -> Range) -> (a, b) -> Range
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> b -> Range
forall u t. (HasRange u, HasRange t) => u -> t -> Range
fuseRange
instance (HasRange a, HasRange b, HasRange c) => HasRange (a,b,c) where
getRange :: (a, b, c) -> Range
getRange (a
x,b
y,c
z) = (a, (b, c)) -> Range
forall a. HasRange a => a -> Range
getRange (a
x,(b
y,c
z))
instance (HasRange a, HasRange b, HasRange c, HasRange d) => HasRange (a,b,c,d) where
getRange :: (a, b, c, d) -> Range
getRange (a
x,b
y,c
z,d
w) = (a, (b, (c, d))) -> Range
forall a. HasRange a => a -> Range
getRange (a
x,(b
y,(c
z,d
w)))
instance (HasRange a, HasRange b, HasRange c, HasRange d, HasRange e) => HasRange (a,b,c,d,e) where
getRange :: (a, b, c, d, e) -> Range
getRange (a
x,b
y,c
z,d
w,e
v) = (a, (b, (c, (d, e)))) -> Range
forall a. HasRange a => a -> Range
getRange (a
x,(b
y,(c
z,(d
w,e
v))))
instance (HasRange a, HasRange b, HasRange c, HasRange d, HasRange e, HasRange f) => HasRange (a,b,c,d,e,f) where
getRange :: (a, b, c, d, e, f) -> Range
getRange (a
x,b
y,c
z,d
w,e
v,f
u) = (a, (b, (c, (d, (e, f))))) -> Range
forall a. HasRange a => a -> Range
getRange (a
x,(b
y,(c
z,(d
w,(e
v,f
u)))))
instance (HasRange a, HasRange b, HasRange c, HasRange d, HasRange e, HasRange f, HasRange g) => HasRange (a,b,c,d,e,f,g) where
getRange :: (a, b, c, d, e, f, g) -> Range
getRange (a
x,b
y,c
z,d
w,e
v,f
u,g
t) = (a, (b, (c, (d, (e, (f, g)))))) -> Range
forall a. HasRange a => a -> Range
getRange (a
x,(b
y,(c
z,(d
w,(e
v,(f
u,g
t))))))
instance (HasRange a, HasRange b) => HasRange (Either a b) where
getRange :: Either a b -> Range
getRange = (a -> Range) -> (b -> Range) -> Either a b -> Range
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either a -> Range
forall a. HasRange a => a -> Range
getRange b -> Range
forall a. HasRange a => a -> Range
getRange
class HasRange a => SetRange a where
setRange :: Range -> a -> a
default setRange :: (Functor f, SetRange b, f b ~ a) => Range -> a -> a
setRange = (b -> b) -> a -> a
(b -> b) -> f b -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((b -> b) -> a -> a) -> (Range -> b -> b) -> Range -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Range -> b -> b
forall a. SetRange a => Range -> a -> a
setRange
instance SetRange Range where
setRange :: Range -> Range -> Range
setRange = Range -> Range -> Range
forall a b. a -> b -> a
const
instance SetRange a => SetRange [a]
instance SetRange a => SetRange (Maybe a)
class KillRange a where
killRange :: KillRangeT a
default killRange :: (Functor f, KillRange b, f b ~ a) => KillRangeT a
killRange = (b -> b) -> f b -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> b
forall a. KillRange a => KillRangeT a
killRange
type KillRangeT a = a -> a
class KILLRANGE t b where
killRangeN :: IsBase t ~ b => All KillRange (Domains t) =>
t -> t
instance IsBase t ~ 'True => KILLRANGE t 'True where
{-# INLINE killRangeN #-}
killRangeN :: (IsBase t ~ 'True, All KillRange (Domains t)) => t -> t
killRangeN t
v = t
v
instance KILLRANGE t (IsBase t) => KILLRANGE (a -> t) 'False where
{-# INLINE killRangeN #-}
killRangeN :: (IsBase (a -> t) ~ 'False, All KillRange (Domains (a -> t))) =>
(a -> t) -> a -> t
killRangeN a -> t
f a
a = t -> t
forall t (b :: Bool).
(KILLRANGE t b, IsBase t ~ b, All KillRange (Domains t)) =>
t -> t
killRangeN (a -> t
f (KillRangeT a
forall a. KillRange a => KillRangeT a
killRange a
a))
killRangeMap :: (KillRange k, KillRange v) => KillRangeT (Map k v)
killRangeMap :: forall k v. (KillRange k, KillRange v) => KillRangeT (Map k v)
killRangeMap = (k -> k) -> Map k v -> Map k v
forall k1 k2 a. (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysMonotonic k -> k
forall a. KillRange a => KillRangeT a
killRange (Map k v -> Map k v) -> (Map k v -> Map k v) -> Map k v -> Map k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v -> v) -> Map k v -> Map k v
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map v -> v
forall a. KillRange a => KillRangeT a
killRange
instance KillRange Range where
killRange :: Range -> Range
killRange Range
_ = Range
forall a. Range' a
noRange
instance KillRange Void where
killRange :: KillRangeT Void
killRange = KillRangeT Void
forall a. a -> a
id
instance KillRange () where
killRange :: () -> ()
killRange = () -> ()
forall a. a -> a
id
instance KillRange Bool where
killRange :: Bool -> Bool
killRange = Bool -> Bool
forall a. a -> a
id
instance KillRange Int where
killRange :: KillRangeT Int
killRange = KillRangeT Int
forall a. a -> a
id
instance KillRange Integer where
killRange :: KillRangeT Integer
killRange = KillRangeT Integer
forall a. a -> a
id
instance KillRange Permutation where
killRange :: KillRangeT Permutation
killRange = KillRangeT Permutation
forall a. a -> a
id
instance {-# OVERLAPPING #-} KillRange String where
killRange :: ShowS
killRange = ShowS
forall a. a -> a
id
instance {-# OVERLAPPABLE #-} KillRange a => KillRange [a]
instance {-# OVERLAPPABLE #-} KillRange a => KillRange (Map k a)
instance KillRange a => KillRange (Drop a)
instance KillRange a => KillRange (List1 a)
instance KillRange a => KillRange (List2 a)
instance KillRange a => KillRange (Maybe a)
instance KillRange a => KillRange (Strict.Maybe a)
instance {-# OVERLAPPABLE #-} (Ord a, KillRange a) => KillRange (Set a) where
killRange :: KillRangeT (Set a)
killRange = (a -> a) -> KillRangeT (Set a)
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map a -> a
forall a. KillRange a => KillRangeT a
killRange
instance (KillRange a, KillRange b) => KillRange (a, b) where
killRange :: KillRangeT (a, b)
killRange (a
x, b
y) = (KillRangeT a
forall a. KillRange a => KillRangeT a
killRange a
x, KillRangeT b
forall a. KillRange a => KillRangeT a
killRange b
y)
instance (KillRange a, KillRange b, KillRange c) =>
KillRange (a, b, c) where
killRange :: KillRangeT (a, b, c)
killRange (a
x, b
y, c
z) = (a -> b -> c -> (a, b, c)) -> a -> b -> c -> (a, b, c)
forall t (b :: Bool).
(KILLRANGE t b, IsBase t ~ b, All KillRange (Domains t)) =>
t -> t
killRangeN (,,) a
x b
y c
z
instance (KillRange a, KillRange b, KillRange c, KillRange d) =>
KillRange (a, b, c, d) where
killRange :: KillRangeT (a, b, c, d)
killRange (a
x, b
y, c
z, d
u) = (a -> b -> c -> d -> (a, b, c, d))
-> a -> b -> c -> d -> (a, b, c, d)
forall t (b :: Bool).
(KILLRANGE t b, IsBase t ~ b, All KillRange (Domains t)) =>
t -> t
killRangeN (,,,) a
x b
y c
z d
u
instance (KillRange a, KillRange b) => KillRange (Either a b) where
killRange :: KillRangeT (Either a b)
killRange (Left a
x) = a -> Either a b
forall a b. a -> Either a b
Left (a -> Either a b) -> a -> Either a b
forall a b. (a -> b) -> a -> b
$ KillRangeT a
forall a. KillRange a => KillRangeT a
killRange a
x
killRange (Right b
x) = b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b) -> b -> Either a b
forall a b. (a -> b) -> a -> b
$ KillRangeT b
forall a. KillRange a => KillRangeT a
killRange b
x
startPos' :: a -> Position' a
startPos' :: forall a. a -> Position' a
startPos' a
f = Pn
{ srcFile :: a
srcFile = a
f
, posPos :: Int32
posPos = Int32
1
, posLine :: Int32
posLine = Int32
1
, posCol :: Int32
posCol = Int32
1
}
startPos :: Maybe RangeFile -> Position
startPos :: Maybe RangeFile -> Position
startPos = SrcFile -> Position
forall a. a -> Position' a
startPos' (SrcFile -> Position)
-> (Maybe RangeFile -> SrcFile) -> Maybe RangeFile -> Position
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe RangeFile -> SrcFile
forall lazy strict. Strict lazy strict => lazy -> strict
Strict.toStrict
noRange :: Range' a
noRange :: forall a. Range' a
noRange = Range' a
forall a. Range' a
NoRange
movePos :: Position' a -> Char -> Position' a
movePos :: forall a. Position' a -> Char -> Position' a
movePos (Pn a
f Int32
p Int32
l Int32
c) Char
'\n' = a -> Int32 -> Int32 -> Int32 -> Position' a
forall a. a -> Int32 -> Int32 -> Int32 -> Position' a
Pn a
f (Int32
p Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
1) (Int32
l Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
1) Int32
1
movePos (Pn a
f Int32
p Int32
l Int32
c) Char
_ = a -> Int32 -> Int32 -> Int32 -> Position' a
forall a. a -> Int32 -> Int32 -> Int32 -> Position' a
Pn a
f (Int32
p Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
1) Int32
l (Int32
c Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
1)
movePosByString :: Foldable t => Position' a -> t Char -> Position' a
movePosByString :: forall (t :: * -> *) a.
Foldable t =>
Position' a -> t Char -> Position' a
movePosByString = (Position' a -> Char -> Position' a)
-> Position' a -> t Char -> Position' a
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
Fold.foldl' Position' a -> Char -> Position' a
forall a. Position' a -> Char -> Position' a
movePos
backupPos :: Position' a -> Position' a
backupPos :: forall a. Position' a -> Position' a
backupPos (Pn a
f Int32
p Int32
l Int32
c) = a -> Int32 -> Int32 -> Int32 -> Position' a
forall a. a -> Int32 -> Int32 -> Int32 -> Position' a
Pn a
f (Int32
p Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1) Int32
l (Int32
c Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1)
posToRange' ::
a -> PositionWithoutFile -> PositionWithoutFile -> Range' a
posToRange' :: forall a.
a -> PositionWithoutFile -> PositionWithoutFile -> Range' a
posToRange' a
f PositionWithoutFile
p1 PositionWithoutFile
p2 = a -> IntervalWithoutFile -> Range' a
forall a. a -> IntervalWithoutFile -> Range' a
intervalToRange a
f (()
-> PositionWithoutFile
-> PositionWithoutFile
-> IntervalWithoutFile
forall a.
a -> PositionWithoutFile -> PositionWithoutFile -> Interval' a
posToInterval () PositionWithoutFile
p1 PositionWithoutFile
p2)
posToRange :: Position' a -> Position' a -> Range' a
posToRange :: forall a. Position' a -> Position' a -> Range' a
posToRange Position' a
p1 Position' a
p2 =
a -> PositionWithoutFile -> PositionWithoutFile -> Range' a
forall a.
a -> PositionWithoutFile -> PositionWithoutFile -> Range' a
posToRange' (Position' a -> a
forall a. Position' a -> a
srcFile Position' a
p1) (Position' a
p1 { srcFile = () }) (Position' a
p2 { srcFile = () })
intervalToRange :: a -> IntervalWithoutFile -> Range' a
intervalToRange :: forall a. a -> IntervalWithoutFile -> Range' a
intervalToRange a
f IntervalWithoutFile
i = a -> Seq IntervalWithoutFile -> Range' a
forall a. a -> Seq IntervalWithoutFile -> Range' a
Range a
f (IntervalWithoutFile -> Seq IntervalWithoutFile
forall a. a -> Seq a
Seq.singleton IntervalWithoutFile
i)
rangeToIntervalWithFile :: Range' a -> Maybe (Interval' a)
rangeToIntervalWithFile :: forall a. Range' a -> Maybe (Interval' a)
rangeToIntervalWithFile Range' a
NoRange = Maybe (Interval' a)
forall a. Maybe a
Nothing
rangeToIntervalWithFile (Range a
f Seq IntervalWithoutFile
is) = case (Seq IntervalWithoutFile -> ViewL IntervalWithoutFile
forall a. Seq a -> ViewL a
Seq.viewl Seq IntervalWithoutFile
is, Seq IntervalWithoutFile -> ViewR IntervalWithoutFile
forall a. Seq a -> ViewR a
Seq.viewr Seq IntervalWithoutFile
is) of
(IntervalWithoutFile
head Seq.:< Seq IntervalWithoutFile
_, Seq IntervalWithoutFile
_ Seq.:> IntervalWithoutFile
last) -> Interval' a -> Maybe (Interval' a)
forall a. a -> Maybe a
Just (Interval' a -> Maybe (Interval' a))
-> Interval' a -> Maybe (Interval' a)
forall a b. (a -> b) -> a -> b
$ a -> IntervalWithoutFile -> Interval' a
forall a b. a -> Interval' b -> Interval' a
setIntervalFile a
f (IntervalWithoutFile -> Interval' a)
-> IntervalWithoutFile -> Interval' a
forall a b. (a -> b) -> a -> b
$
Interval { iStart :: PositionWithoutFile
iStart = IntervalWithoutFile -> PositionWithoutFile
forall a. Interval' a -> Position' a
iStart IntervalWithoutFile
head
, iEnd :: PositionWithoutFile
iEnd = IntervalWithoutFile -> PositionWithoutFile
forall a. Interval' a -> Position' a
iEnd IntervalWithoutFile
last
}
(ViewL IntervalWithoutFile, ViewR IntervalWithoutFile)
_ -> Maybe (Interval' a)
forall a. HasCallStack => a
__IMPOSSIBLE__
rangeToInterval :: Range' a -> Maybe IntervalWithoutFile
rangeToInterval :: forall a. Range' a -> Maybe IntervalWithoutFile
rangeToInterval Range' a
NoRange = Maybe IntervalWithoutFile
forall a. Maybe a
Nothing
rangeToInterval (Range a
_ Seq IntervalWithoutFile
is) = case (Seq IntervalWithoutFile -> ViewL IntervalWithoutFile
forall a. Seq a -> ViewL a
Seq.viewl Seq IntervalWithoutFile
is, Seq IntervalWithoutFile -> ViewR IntervalWithoutFile
forall a. Seq a -> ViewR a
Seq.viewr Seq IntervalWithoutFile
is) of
(IntervalWithoutFile
head Seq.:< Seq IntervalWithoutFile
_, Seq IntervalWithoutFile
_ Seq.:> IntervalWithoutFile
last) -> IntervalWithoutFile -> Maybe IntervalWithoutFile
forall a. a -> Maybe a
Just (IntervalWithoutFile -> Maybe IntervalWithoutFile)
-> IntervalWithoutFile -> Maybe IntervalWithoutFile
forall a b. (a -> b) -> a -> b
$
Interval { iStart :: PositionWithoutFile
iStart = IntervalWithoutFile -> PositionWithoutFile
forall a. Interval' a -> Position' a
iStart IntervalWithoutFile
head
, iEnd :: PositionWithoutFile
iEnd = IntervalWithoutFile -> PositionWithoutFile
forall a. Interval' a -> Position' a
iEnd IntervalWithoutFile
last
}
(ViewL IntervalWithoutFile, ViewR IntervalWithoutFile)
_ -> Maybe IntervalWithoutFile
forall a. HasCallStack => a
__IMPOSSIBLE__
continuous :: Range' a -> Range' a
continuous :: forall a. Range' a -> Range' a
continuous Range' a
NoRange = Range' a
forall a. Range' a
NoRange
continuous r :: Range' a
r@(Range a
f Seq IntervalWithoutFile
_) = case Range' a -> Maybe IntervalWithoutFile
forall a. Range' a -> Maybe IntervalWithoutFile
rangeToInterval Range' a
r of
Maybe IntervalWithoutFile
Nothing -> Range' a
forall a. HasCallStack => a
__IMPOSSIBLE__
Just IntervalWithoutFile
i -> a -> IntervalWithoutFile -> Range' a
forall a. a -> IntervalWithoutFile -> Range' a
intervalToRange a
f IntervalWithoutFile
i
continuousPerLine :: Ord a => Range' a -> Range' a
continuousPerLine :: forall a. Ord a => Range' a -> Range' a
continuousPerLine r :: Range' a
r@Range' a
NoRange = Range' a
r
continuousPerLine r :: Range' a
r@(Range a
f Seq IntervalWithoutFile
_) =
a -> Seq IntervalWithoutFile -> Range' a
forall a. a -> Seq IntervalWithoutFile -> Range' a
Range a
f (([IntervalWithoutFile]
-> Maybe (IntervalWithoutFile, [IntervalWithoutFile]))
-> [IntervalWithoutFile] -> Seq IntervalWithoutFile
forall b a. (b -> Maybe (a, b)) -> b -> Seq a
Seq.unfoldr [IntervalWithoutFile]
-> Maybe (IntervalWithoutFile, [IntervalWithoutFile])
forall {a}.
Ord a =>
[Interval' a] -> Maybe (Interval' a, [Interval' a])
step (Range' a -> [IntervalWithoutFile]
forall a. Range' a -> [IntervalWithoutFile]
rangeIntervals Range' a
r))
where
step :: [Interval' a] -> Maybe (Interval' a, [Interval' a])
step [] = Maybe (Interval' a, [Interval' a])
forall a. Maybe a
Nothing
step [Interval' a
i] = (Interval' a, [Interval' a]) -> Maybe (Interval' a, [Interval' a])
forall a. a -> Maybe a
Just (Interval' a
i, [])
step (Interval' a
i : is :: [Interval' a]
is@(Interval' a
j : [Interval' a]
js))
| Bool
sameLine = [Interval' a] -> Maybe (Interval' a, [Interval' a])
step (Interval' a -> Interval' a -> Interval' a
forall a. Ord a => Interval' a -> Interval' a -> Interval' a
fuseIntervals Interval' a
i Interval' a
j Interval' a -> [Interval' a] -> [Interval' a]
forall a. a -> [a] -> [a]
: [Interval' a]
js)
| Bool
otherwise = (Interval' a, [Interval' a]) -> Maybe (Interval' a, [Interval' a])
forall a. a -> Maybe a
Just (Interval' a
i, [Interval' a]
is)
where
sameLine :: Bool
sameLine = Position' a -> Int32
forall a. Position' a -> Int32
posLine (Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
i) Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
== Position' a -> Int32
forall a. Position' a -> Int32
posLine (Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
j)
rStart' :: Range' a -> Maybe PositionWithoutFile
rStart' :: forall a. Range' a -> Maybe PositionWithoutFile
rStart' Range' a
r = IntervalWithoutFile -> PositionWithoutFile
forall a. Interval' a -> Position' a
iStart (IntervalWithoutFile -> PositionWithoutFile)
-> Maybe IntervalWithoutFile -> Maybe PositionWithoutFile
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range' a -> Maybe IntervalWithoutFile
forall a. Range' a -> Maybe IntervalWithoutFile
rangeToInterval Range' a
r
rStart :: Range' a -> Maybe (Position' a)
rStart :: forall a. Range' a -> Maybe (Position' a)
rStart Range' a
NoRange = Maybe (Position' a)
forall a. Maybe a
Nothing
rStart r :: Range' a
r@(Range a
f Seq IntervalWithoutFile
_) = (\PositionWithoutFile
p -> PositionWithoutFile
p { srcFile = f }) (PositionWithoutFile -> Position' a)
-> Maybe PositionWithoutFile -> Maybe (Position' a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range' a -> Maybe PositionWithoutFile
forall a. Range' a -> Maybe PositionWithoutFile
rStart' Range' a
r
rEnd' :: Range' a -> Maybe PositionWithoutFile
rEnd' :: forall a. Range' a -> Maybe PositionWithoutFile
rEnd' Range' a
r = IntervalWithoutFile -> PositionWithoutFile
forall a. Interval' a -> Position' a
iEnd (IntervalWithoutFile -> PositionWithoutFile)
-> Maybe IntervalWithoutFile -> Maybe PositionWithoutFile
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range' a -> Maybe IntervalWithoutFile
forall a. Range' a -> Maybe IntervalWithoutFile
rangeToInterval Range' a
r
rEnd :: Range' a -> Maybe (Position' a)
rEnd :: forall a. Range' a -> Maybe (Position' a)
rEnd Range' a
NoRange = Maybe (Position' a)
forall a. Maybe a
Nothing
rEnd r :: Range' a
r@(Range a
f Seq IntervalWithoutFile
_) = (\PositionWithoutFile
p -> PositionWithoutFile
p { srcFile = f }) (PositionWithoutFile -> Position' a)
-> Maybe PositionWithoutFile -> Maybe (Position' a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range' a -> Maybe PositionWithoutFile
forall a. Range' a -> Maybe PositionWithoutFile
rEnd' Range' a
r
fuseIntervals :: Ord a => Interval' a -> Interval' a -> Interval' a
fuseIntervals :: forall a. Ord a => Interval' a -> Interval' a -> Interval' a
fuseIntervals Interval' a
x Interval' a
y = Interval { iStart :: Position' a
iStart = Position' a
s, iEnd :: Position' a
iEnd = Position' a
e }
where
s :: Position' a
s = Position' a -> [Position' a] -> Position' a
forall a. a -> [a] -> a
headWithDefault Position' a
forall a. HasCallStack => a
__IMPOSSIBLE__ ([Position' a] -> Position' a) -> [Position' a] -> Position' a
forall a b. (a -> b) -> a -> b
$ [Position' a] -> [Position' a]
forall a. Ord a => [a] -> [a]
sort [Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
x, Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
y]
e :: Position' a
e = Position' a -> [Position' a] -> Position' a
forall a. a -> [a] -> a
lastWithDefault Position' a
forall a. HasCallStack => a
__IMPOSSIBLE__ ([Position' a] -> Position' a) -> [Position' a] -> Position' a
forall a b. (a -> b) -> a -> b
$ [Position' a] -> [Position' a]
forall a. Ord a => [a] -> [a]
sort [Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
x, Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
y]
fuseRanges :: (Ord a) => Range' a -> Range' a -> Range' a
fuseRanges :: forall a. Ord a => Range' a -> Range' a -> Range' a
fuseRanges Range' a
NoRange Range' a
is2 = Range' a
is2
fuseRanges Range' a
is1 Range' a
NoRange = Range' a
is1
fuseRanges (Range a
f Seq IntervalWithoutFile
is1) (Range a
_ Seq IntervalWithoutFile
is2) = a -> Seq IntervalWithoutFile -> Range' a
forall a. a -> Seq IntervalWithoutFile -> Range' a
Range a
f (Seq IntervalWithoutFile
-> Seq IntervalWithoutFile -> Seq IntervalWithoutFile
forall {a}.
Ord a =>
Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
fuse Seq IntervalWithoutFile
is1 Seq IntervalWithoutFile
is2)
where
fuse :: Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
fuse Seq (Interval' a)
is1 Seq (Interval' a)
is2 = case (Seq (Interval' a) -> ViewL (Interval' a)
forall a. Seq a -> ViewL a
Seq.viewl Seq (Interval' a)
is1, Seq (Interval' a) -> ViewR (Interval' a)
forall a. Seq a -> ViewR a
Seq.viewr Seq (Interval' a)
is1,
Seq (Interval' a) -> ViewL (Interval' a)
forall a. Seq a -> ViewL a
Seq.viewl Seq (Interval' a)
is2, Seq (Interval' a) -> ViewR (Interval' a)
forall a. Seq a -> ViewR a
Seq.viewr Seq (Interval' a)
is2) of
(ViewL (Interval' a)
Seq.EmptyL, ViewR (Interval' a)
_, ViewL (Interval' a)
_, ViewR (Interval' a)
_) -> Seq (Interval' a)
is2
(ViewL (Interval' a)
_, ViewR (Interval' a)
_, ViewL (Interval' a)
Seq.EmptyL, ViewR (Interval' a)
_) -> Seq (Interval' a)
is1
(Interval' a
s1 Seq.:< Seq (Interval' a)
r1, Seq (Interval' a)
l1 Seq.:> Interval' a
e1, Interval' a
s2 Seq.:< Seq (Interval' a)
r2, Seq (Interval' a)
l2 Seq.:> Interval' a
e2)
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
e1 Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s2 -> Seq (Interval' a)
is1 Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
forall a. Seq a -> Seq a -> Seq a
Seq.>< Seq (Interval' a)
is2
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
e2 Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s1 -> Seq (Interval' a)
is2 Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
forall a. Seq a -> Seq a -> Seq a
Seq.>< Seq (Interval' a)
is1
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
e1 Position' a -> Position' a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s2 -> Seq (Interval' a)
-> Interval' a
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
forall {a}.
Seq (Interval' a)
-> Interval' a
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
mergeTouching Seq (Interval' a)
l1 Interval' a
e1 Interval' a
s2 Seq (Interval' a)
r2
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
e2 Position' a -> Position' a -> Bool
forall a. Eq a => a -> a -> Bool
== Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s1 -> Seq (Interval' a)
-> Interval' a
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
forall {a}.
Seq (Interval' a)
-> Interval' a
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
mergeTouching Seq (Interval' a)
l2 Interval' a
e2 Interval' a
s1 Seq (Interval' a)
r1
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s1 Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s2 -> Interval' a
-> Seq (Interval' a)
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
outputLeftPrefix Interval' a
s1 Seq (Interval' a)
r1 Interval' a
s2 Seq (Interval' a)
is2
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s2 Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s1 -> Interval' a
-> Seq (Interval' a)
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
outputLeftPrefix Interval' a
s2 Seq (Interval' a)
r2 Interval' a
s1 Seq (Interval' a)
is1
| Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s1 Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s2 -> Interval' a
-> Seq (Interval' a)
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
fuseSome Interval' a
s1 Seq (Interval' a)
r1 Interval' a
s2 Seq (Interval' a)
r2
| Bool
otherwise -> Interval' a
-> Seq (Interval' a)
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
fuseSome Interval' a
s2 Seq (Interval' a)
r2 Interval' a
s1 Seq (Interval' a)
r1
(ViewL (Interval' a), ViewR (Interval' a), ViewL (Interval' a),
ViewR (Interval' a))
_ -> Seq (Interval' a)
forall a. HasCallStack => a
__IMPOSSIBLE__
mergeTouching :: Seq (Interval' a)
-> Interval' a
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
mergeTouching Seq (Interval' a)
l Interval' a
e Interval' a
s Seq (Interval' a)
r = Seq (Interval' a)
l Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
forall a. Seq a -> Seq a -> Seq a
Seq.>< Interval' a
i Interval' a -> Seq (Interval' a) -> Seq (Interval' a)
forall a. a -> Seq a -> Seq a
Seq.<| Seq (Interval' a)
r
where
i :: Interval' a
i = Interval { iStart :: Position' a
iStart = Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
e, iEnd :: Position' a
iEnd = Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s }
outputLeftPrefix :: Interval' a
-> Seq (Interval' a)
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
outputLeftPrefix Interval' a
s1 Seq (Interval' a)
r1 Interval' a
s2 Seq (Interval' a)
is2 = Interval' a
s1 Interval' a -> Seq (Interval' a) -> Seq (Interval' a)
forall a. a -> Seq a -> Seq a
Seq.<| Seq (Interval' a)
r1' Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
forall a. Seq a -> Seq a -> Seq a
Seq.>< Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
fuse Seq (Interval' a)
r1'' Seq (Interval' a)
is2
where
(Seq (Interval' a)
r1', Seq (Interval' a)
r1'') = (Interval' a -> Bool)
-> Seq (Interval' a) -> (Seq (Interval' a), Seq (Interval' a))
forall a. (a -> Bool) -> Seq a -> (Seq a, Seq a)
Seq.spanl (\Interval' a
s -> Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
< Interval' a -> Position' a
forall a. Interval' a -> Position' a
iStart Interval' a
s2) Seq (Interval' a)
r1
fuseSome :: Interval' a
-> Seq (Interval' a)
-> Interval' a
-> Seq (Interval' a)
-> Seq (Interval' a)
fuseSome Interval' a
s1 Seq (Interval' a)
r1 Interval' a
s2 Seq (Interval' a)
r2 = Seq (Interval' a) -> Seq (Interval' a) -> Seq (Interval' a)
fuse Seq (Interval' a)
r1' (Interval' a -> Interval' a -> Interval' a
forall a. Ord a => Interval' a -> Interval' a -> Interval' a
fuseIntervals Interval' a
s1 Interval' a
s2 Interval' a -> Seq (Interval' a) -> Seq (Interval' a)
forall a. a -> Seq a -> Seq a
Seq.<| Seq (Interval' a)
r2)
where
r1' :: Seq (Interval' a)
r1' = (Interval' a -> Bool) -> Seq (Interval' a) -> Seq (Interval' a)
forall a. (a -> Bool) -> Seq a -> Seq a
Seq.dropWhileL (\Interval' a
s -> Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s Position' a -> Position' a -> Bool
forall a. Ord a => a -> a -> Bool
<= Interval' a -> Position' a
forall a. Interval' a -> Position' a
iEnd Interval' a
s2) Seq (Interval' a)
r1
{-# INLINE fuseRange #-}
fuseRange :: (HasRange u, HasRange t) => u -> t -> Range
fuseRange :: forall u t. (HasRange u, HasRange t) => u -> t -> Range
fuseRange u
x t
y = Range -> Range -> Range
forall a. Ord a => Range' a -> Range' a -> Range' a
fuseRanges (u -> Range
forall a. HasRange a => a -> Range
getRange u
x) (t -> Range
forall a. HasRange a => a -> Range
getRange t
y)
beginningOf :: Range -> Range
beginningOf :: Range -> Range
beginningOf Range
NoRange = Range
forall a. Range' a
NoRange
beginningOf r :: Range
r@(Range SrcFile
f Seq IntervalWithoutFile
_) = case Range -> Maybe PositionWithoutFile
forall a. Range' a -> Maybe PositionWithoutFile
rStart' Range
r of
Maybe PositionWithoutFile
Nothing -> Range
forall a. HasCallStack => a
__IMPOSSIBLE__
Just PositionWithoutFile
pos -> SrcFile -> PositionWithoutFile -> PositionWithoutFile -> Range
forall a.
a -> PositionWithoutFile -> PositionWithoutFile -> Range' a
posToRange' SrcFile
f PositionWithoutFile
pos PositionWithoutFile
pos
beginningOfFile :: Range -> Range
beginningOfFile :: Range -> Range
beginningOfFile Range
NoRange = Range
forall a. Range' a
NoRange
beginningOfFile (Range SrcFile
f Seq IntervalWithoutFile
_) = SrcFile -> PositionWithoutFile -> PositionWithoutFile -> Range
forall a.
a -> PositionWithoutFile -> PositionWithoutFile -> Range' a
posToRange' SrcFile
f PositionWithoutFile
p PositionWithoutFile
p
where p :: PositionWithoutFile
p = () -> PositionWithoutFile
forall a. a -> Position' a
startPos' ()
withRangeOf :: (SetRange t, HasRange u) => t -> u -> t
t
x withRangeOf :: forall t u. (SetRange t, HasRange u) => t -> u -> t
`withRangeOf` u
y = Range -> t -> t
forall a. SetRange a => Range -> a -> a
setRange (u -> Range
forall a. HasRange a => a -> Range
getRange u
y) t
x
interleaveRanges :: (HasRange a) => [a] -> [a] -> ([a], [(a,a)])
interleaveRanges :: forall a. HasRange a => [a] -> [a] -> ([a], [(a, a)])
interleaveRanges [a]
as [a]
bs = Writer [(a, a)] [a] -> ([a], [(a, a)])
forall w a. Writer w a -> (a, w)
runWriter (Writer [(a, a)] [a] -> ([a], [(a, a)]))
-> Writer [(a, a)] [a] -> ([a], [(a, a)])
forall a b. (a -> b) -> a -> b
$ [a] -> [a] -> Writer [(a, a)] [a]
forall {m :: * -> *} {b}.
(HasRange b, MonadWriter [(b, b)] m) =>
[b] -> [b] -> m [b]
go [a]
as [a]
bs
where
go :: [b] -> [b] -> m [b]
go [] [b]
as = [b] -> m [b]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return [b]
as
go [b]
as [] = [b] -> m [b]
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return [b]
as
go as :: [b]
as@(b
a:[b]
as') bs :: [b]
bs@(b
b:[b]
bs') =
let ra :: Range
ra = b -> Range
forall a. HasRange a => a -> Range
getRange b
a
rb :: Range
rb = b -> Range
forall a. HasRange a => a -> Range
getRange b
b
ra0 :: Maybe Position
ra0 = Range -> Maybe Position
forall a. Range' a -> Maybe (Position' a)
rStart Range
ra
rb0 :: Maybe Position
rb0 = Range -> Maybe Position
forall a. Range' a -> Maybe (Position' a)
rStart Range
rb
ra1 :: Maybe Position
ra1 = Range -> Maybe Position
forall a. Range' a -> Maybe (Position' a)
rEnd Range
ra
rb1 :: Maybe Position
rb1 = Range -> Maybe Position
forall a. Range' a -> Maybe (Position' a)
rEnd Range
rb
in
if Maybe Position
ra1 Maybe Position -> Maybe Position -> Bool
forall a. Ord a => a -> a -> Bool
<= Maybe Position
rb0 then
(b
ab -> [b] -> [b]
forall a. a -> [a] -> [a]
:) ([b] -> [b]) -> m [b] -> m [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [b] -> [b] -> m [b]
go [b]
as' [b]
bs
else if Maybe Position
rb1 Maybe Position -> Maybe Position -> Bool
forall a. Ord a => a -> a -> Bool
<= Maybe Position
ra0 then
(b
bb -> [b] -> [b]
forall a. a -> [a] -> [a]
:) ([b] -> [b]) -> m [b] -> m [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [b] -> [b] -> m [b]
go [b]
as [b]
bs'
else do
[(b, b)] -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell [(b
a,b
b)]
if Maybe Position
ra0 Maybe Position -> Maybe Position -> Bool
forall a. Ord a => a -> a -> Bool
< Maybe Position
rb0 Bool -> Bool -> Bool
|| (Maybe Position
ra0 Maybe Position -> Maybe Position -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Position
rb0 Bool -> Bool -> Bool
&& Maybe Position
ra1 Maybe Position -> Maybe Position -> Bool
forall a. Ord a => a -> a -> Bool
<= Maybe Position
rb1) then
(b
ab -> [b] -> [b]
forall a. a -> [a] -> [a]
:) ([b] -> [b]) -> m [b] -> m [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [b] -> [b] -> m [b]
go [b]
as' [b]
bs
else
(b
bb -> [b] -> [b]
forall a. a -> [a] -> [a]
:) ([b] -> [b]) -> m [b] -> m [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [b] -> [b] -> m [b]
go [b]
as [b]
bs'