{-# LANGUAGE CPP #-}
{-# LANGUAGE MultiParamTypeClasses #-}
#if __GLASGOW_HASKELL__ >= 702
{-# LANGUAGE Safe #-}
#endif
#if __GLASGOW_HASKELL__ >= 706
{-# LANGUAGE DeriveGeneric #-}
#endif
#if __GLASGOW_HASKELL__ >= 710 && __GLASGOW_HASKELL__ < 802
{-# LANGUAGE AutoDeriveTypeable #-}
#endif
module Data.IntervalMap.FingerTree (
Interval(..), low, high, point,
IntervalMap, empty, singleton, insert, union,
search, intersections, dominators,
bounds, leastView, splitAfter
) where
import qualified Data.FingerTree as FT
import Data.FingerTree (FingerTree, Measured(..), ViewL(..), (<|), (><))
import Prelude hiding (null)
#if MIN_VERSION_base(4,6,0)
import GHC.Generics
#endif
#if MIN_VERSION_base(4,8,0)
import qualified Prelude (null)
#else
import Control.Applicative ((<$>))
import Data.Foldable (Foldable(foldMap))
import Data.Monoid
import Data.Traversable (Traversable(traverse))
#endif
#if (MIN_VERSION_base(4,9,0)) && !(MIN_VERSION_base(4,11,0))
import Data.Semigroup
#endif
import Data.Foldable (toList)
data Interval v = Interval v v
deriving (Interval v -> Interval v -> Bool
forall v. Eq v => Interval v -> Interval v -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Interval v -> Interval v -> Bool
$c/= :: forall v. Eq v => Interval v -> Interval v -> Bool
== :: Interval v -> Interval v -> Bool
$c== :: forall v. Eq v => Interval v -> Interval v -> Bool
Eq, Interval v -> Interval v -> Bool
Interval v -> Interval v -> Ordering
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 {v}. Ord v => Eq (Interval v)
forall v. Ord v => Interval v -> Interval v -> Bool
forall v. Ord v => Interval v -> Interval v -> Ordering
forall v. Ord v => Interval v -> Interval v -> Interval v
min :: Interval v -> Interval v -> Interval v
$cmin :: forall v. Ord v => Interval v -> Interval v -> Interval v
max :: Interval v -> Interval v -> Interval v
$cmax :: forall v. Ord v => Interval v -> Interval v -> Interval v
>= :: Interval v -> Interval v -> Bool
$c>= :: forall v. Ord v => Interval v -> Interval v -> Bool
> :: Interval v -> Interval v -> Bool
$c> :: forall v. Ord v => Interval v -> Interval v -> Bool
<= :: Interval v -> Interval v -> Bool
$c<= :: forall v. Ord v => Interval v -> Interval v -> Bool
< :: Interval v -> Interval v -> Bool
$c< :: forall v. Ord v => Interval v -> Interval v -> Bool
compare :: Interval v -> Interval v -> Ordering
$ccompare :: forall v. Ord v => Interval v -> Interval v -> Ordering
Ord, Int -> Interval v -> ShowS
forall v. Show v => Int -> Interval v -> ShowS
forall v. Show v => [Interval v] -> ShowS
forall v. Show v => Interval v -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Interval v] -> ShowS
$cshowList :: forall v. Show v => [Interval v] -> ShowS
show :: Interval v -> String
$cshow :: forall v. Show v => Interval v -> String
showsPrec :: Int -> Interval v -> ShowS
$cshowsPrec :: forall v. Show v => Int -> Interval v -> ShowS
Show, ReadPrec [Interval v]
ReadPrec (Interval v)
ReadS [Interval v]
forall v. Read v => ReadPrec [Interval v]
forall v. Read v => ReadPrec (Interval v)
forall v. Read v => Int -> ReadS (Interval v)
forall v. Read v => ReadS [Interval v]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Interval v]
$creadListPrec :: forall v. Read v => ReadPrec [Interval v]
readPrec :: ReadPrec (Interval v)
$creadPrec :: forall v. Read v => ReadPrec (Interval v)
readList :: ReadS [Interval v]
$creadList :: forall v. Read v => ReadS [Interval v]
readsPrec :: Int -> ReadS (Interval v)
$creadsPrec :: forall v. Read v => Int -> ReadS (Interval v)
Read
#if __GLASGOW_HASKELL__ >= 706
, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall v x. Rep (Interval v) x -> Interval v
forall v x. Interval v -> Rep (Interval v) x
$cto :: forall v x. Rep (Interval v) x -> Interval v
$cfrom :: forall v x. Interval v -> Rep (Interval v) x
Generic
#endif
)
low :: Interval v -> v
low :: forall v. Interval v -> v
low (Interval v
lo v
_) = v
lo
high :: Interval v -> v
high :: forall v. Interval v -> v
high (Interval v
_ v
hi) = v
hi
point :: v -> Interval v
point :: forall v. v -> Interval v
point v
v = forall v. v -> v -> Interval v
Interval v
v v
v
data Node v a = Node (Interval v) a
deriving (Node v a -> Node v a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall v a. (Eq v, Eq a) => Node v a -> Node v a -> Bool
/= :: Node v a -> Node v a -> Bool
$c/= :: forall v a. (Eq v, Eq a) => Node v a -> Node v a -> Bool
== :: Node v a -> Node v a -> Bool
$c== :: forall v a. (Eq v, Eq a) => Node v a -> Node v a -> Bool
Eq, Node v a -> Node v a -> Bool
Node v a -> Node v a -> Ordering
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 {v} {a}. (Ord v, Ord a) => Eq (Node v a)
forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Bool
forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Ordering
forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Node v a
min :: Node v a -> Node v a -> Node v a
$cmin :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Node v a
max :: Node v a -> Node v a -> Node v a
$cmax :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Node v a
>= :: Node v a -> Node v a -> Bool
$c>= :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Bool
> :: Node v a -> Node v a -> Bool
$c> :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Bool
<= :: Node v a -> Node v a -> Bool
$c<= :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Bool
< :: Node v a -> Node v a -> Bool
$c< :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Bool
compare :: Node v a -> Node v a -> Ordering
$ccompare :: forall v a. (Ord v, Ord a) => Node v a -> Node v a -> Ordering
Ord, Int -> Node v a -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall v a. (Show v, Show a) => Int -> Node v a -> ShowS
forall v a. (Show v, Show a) => [Node v a] -> ShowS
forall v a. (Show v, Show a) => Node v a -> String
showList :: [Node v a] -> ShowS
$cshowList :: forall v a. (Show v, Show a) => [Node v a] -> ShowS
show :: Node v a -> String
$cshow :: forall v a. (Show v, Show a) => Node v a -> String
showsPrec :: Int -> Node v a -> ShowS
$cshowsPrec :: forall v a. (Show v, Show a) => Int -> Node v a -> ShowS
Show, ReadPrec [Node v a]
ReadPrec (Node v a)
ReadS [Node v a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall v a. (Read v, Read a) => ReadPrec [Node v a]
forall v a. (Read v, Read a) => ReadPrec (Node v a)
forall v a. (Read v, Read a) => Int -> ReadS (Node v a)
forall v a. (Read v, Read a) => ReadS [Node v a]
readListPrec :: ReadPrec [Node v a]
$creadListPrec :: forall v a. (Read v, Read a) => ReadPrec [Node v a]
readPrec :: ReadPrec (Node v a)
$creadPrec :: forall v a. (Read v, Read a) => ReadPrec (Node v a)
readList :: ReadS [Node v a]
$creadList :: forall v a. (Read v, Read a) => ReadS [Node v a]
readsPrec :: Int -> ReadS (Node v a)
$creadsPrec :: forall v a. (Read v, Read a) => Int -> ReadS (Node v a)
Read
#if __GLASGOW_HASKELL__ >= 706
, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall v a x. Rep (Node v a) x -> Node v a
forall v a x. Node v a -> Rep (Node v a) x
$cto :: forall v a x. Rep (Node v a) x -> Node v a
$cfrom :: forall v a x. Node v a -> Rep (Node v a) x
Generic
#endif
)
instance Functor (Node v) where
fmap :: forall a b. (a -> b) -> Node v a -> Node v b
fmap a -> b
f (Node Interval v
i a
x) = forall v a. Interval v -> a -> Node v a
Node Interval v
i (a -> b
f a
x)
instance Foldable (Node v) where
foldMap :: forall m a. Monoid m => (a -> m) -> Node v a -> m
foldMap a -> m
f (Node Interval v
_ a
x) = a -> m
f a
x
instance Traversable (Node v) where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Node v a -> f (Node v b)
traverse a -> f b
f (Node Interval v
i a
x) = forall v a. Interval v -> a -> Node v a
Node Interval v
i forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
x
data IntInterval v = NoInterval | IntInterval (Interval v) v
#if __GLASGOW_HASKELL__ >= 706
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall v x. Rep (IntInterval v) x -> IntInterval v
forall v x. IntInterval v -> Rep (IntInterval v) x
$cto :: forall v x. Rep (IntInterval v) x -> IntInterval v
$cfrom :: forall v x. IntInterval v -> Rep (IntInterval v) x
Generic)
#endif
#if MIN_VERSION_base(4,9,0)
instance Ord v => Semigroup (IntInterval v) where
<> :: IntInterval v -> IntInterval v -> IntInterval v
(<>) = forall v. Ord v => IntInterval v -> IntInterval v -> IntInterval v
intervalUnion
#endif
instance Ord v => Monoid (IntInterval v) where
mempty :: IntInterval v
mempty = forall v. IntInterval v
NoInterval
#if !(MIN_VERSION_base(4,11,0))
mappend = intervalUnion
#endif
intervalUnion :: Ord v => IntInterval v -> IntInterval v -> IntInterval v
IntInterval v
NoInterval intervalUnion :: forall v. Ord v => IntInterval v -> IntInterval v -> IntInterval v
`intervalUnion` IntInterval v
i = IntInterval v
i
IntInterval v
i `intervalUnion` IntInterval v
NoInterval = IntInterval v
i
IntInterval Interval v
_ v
hi1 `intervalUnion` IntInterval Interval v
int2 v
hi2 =
forall v. Interval v -> v -> IntInterval v
IntInterval Interval v
int2 (forall a. Ord a => a -> a -> a
max v
hi1 v
hi2)
instance (Ord v) => Measured (IntInterval v) (Node v a) where
measure :: Node v a -> IntInterval v
measure (Node Interval v
i a
_) = forall v. Interval v -> v -> IntInterval v
IntInterval Interval v
i (forall v. Interval v -> v
high Interval v
i)
newtype IntervalMap v a =
IntervalMap (FingerTree (IntInterval v) (Node v a))
#if __GLASGOW_HASKELL__ >= 706
deriving (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall v a x. Rep (IntervalMap v a) x -> IntervalMap v a
forall v a x. IntervalMap v a -> Rep (IntervalMap v a) x
$cto :: forall v a x. Rep (IntervalMap v a) x -> IntervalMap v a
$cfrom :: forall v a x. IntervalMap v a -> Rep (IntervalMap v a) x
Generic)
#endif
instance Functor (IntervalMap v) where
fmap :: forall a b. (a -> b) -> IntervalMap v a -> IntervalMap v b
fmap a -> b
f (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap (forall a b v. (a -> b) -> FingerTree v a -> FingerTree v b
FT.unsafeFmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) FingerTree (IntInterval v) (Node v a)
t)
instance Foldable (IntervalMap v) where
foldMap :: forall m a. Monoid m => (a -> m) -> IntervalMap v a -> m
foldMap a -> m
f (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> m
f) FingerTree (IntInterval v) (Node v a)
t
#if MIN_VERSION_base(4,8,0)
null :: forall a. IntervalMap v a -> Bool
null (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = forall v a. FingerTree v a -> Bool
FT.null FingerTree (IntInterval v) (Node v a)
t
#endif
instance Traversable (IntervalMap v) where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> IntervalMap v a -> f (IntervalMap v b)
traverse a -> f b
f (IntervalMap FingerTree (IntInterval v) (Node v a)
t) =
forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a b v.
Applicative f =>
(a -> f b) -> FingerTree v a -> f (FingerTree v b)
FT.unsafeTraverse (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse a -> f b
f) FingerTree (IntInterval v) (Node v a)
t
instance (Eq v, Eq a) => Eq (IntervalMap v a) where
IntervalMap FingerTree (IntInterval v) (Node v a)
xs == :: IntervalMap v a -> IntervalMap v a -> Bool
== IntervalMap FingerTree (IntInterval v) (Node v a)
ys = forall (t :: * -> *) a. Foldable t => t a -> [a]
toList FingerTree (IntInterval v) (Node v a)
xs forall a. Eq a => a -> a -> Bool
== forall (t :: * -> *) a. Foldable t => t a -> [a]
toList FingerTree (IntInterval v) (Node v a)
ys
instance (Ord v, Ord a) => Ord (IntervalMap v a) where
compare :: IntervalMap v a -> IntervalMap v a -> Ordering
compare (IntervalMap FingerTree (IntInterval v) (Node v a)
xs) (IntervalMap FingerTree (IntInterval v) (Node v a)
ys) = forall a. Ord a => a -> a -> Ordering
compare (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList FingerTree (IntInterval v) (Node v a)
xs) (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList FingerTree (IntInterval v) (Node v a)
ys)
instance (Show v, Show a) => Show (IntervalMap v a) where
showsPrec :: Int -> IntervalMap v a -> ShowS
showsPrec Int
p (IntervalMap FingerTree (IntInterval v) (Node v a)
ns)
| forall v a. FingerTree v a -> Bool
FT.null FingerTree (IntInterval v) (Node v a)
ns = String -> ShowS
showString String
"empty"
| Bool
otherwise =
Bool -> ShowS -> ShowS
showParen (Int
p forall a. Ord a => a -> a -> Bool
> Int
0) (forall v a. (Show v, Show a) => [Node v a] -> ShowS
showIntervals (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList FingerTree (IntInterval v) (Node v a)
ns))
where
showIntervals :: [Node v a] -> ShowS
showIntervals [] = String -> ShowS
showString String
"empty"
showIntervals (Node Interval v
i a
x:[Node v a]
ixs) =
String -> ShowS
showString String
"insert " forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Interval v
i forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Char -> ShowS
showChar Char
' ' forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> ShowS
showString String
" $ " forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Node v a] -> ShowS
showIntervals [Node v a]
ixs
#if MIN_VERSION_base(4,9,0)
instance (Ord v) => Semigroup (IntervalMap v a) where
<> :: IntervalMap v a -> IntervalMap v a -> IntervalMap v a
(<>) = forall v a.
Ord v =>
IntervalMap v a -> IntervalMap v a -> IntervalMap v a
union
#endif
instance (Ord v) => Monoid (IntervalMap v a) where
mempty :: IntervalMap v a
mempty = forall v a. Ord v => IntervalMap v a
empty
#if !(MIN_VERSION_base(4,11,0))
mappend = union
#endif
empty :: (Ord v) => IntervalMap v a
empty :: forall v a. Ord v => IntervalMap v a
empty = forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap forall v a. Measured v a => FingerTree v a
FT.empty
singleton :: (Ord v) => Interval v -> a -> IntervalMap v a
singleton :: forall v a. Ord v => Interval v -> a -> IntervalMap v a
singleton Interval v
i a
x = forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap (forall v a. Measured v a => a -> FingerTree v a
FT.singleton (forall v a. Interval v -> a -> Node v a
Node Interval v
i a
x))
insert :: (Ord v) => Interval v -> a -> IntervalMap v a -> IntervalMap v a
insert :: forall v a.
Ord v =>
Interval v -> a -> IntervalMap v a -> IntervalMap v a
insert (Interval v
lo v
hi) a
_ IntervalMap v a
m | v
lo forall a. Ord a => a -> a -> Bool
> v
hi = IntervalMap v a
m
insert Interval v
i a
x (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap (FingerTree (IntInterval v) (Node v a)
l forall v a.
Measured v a =>
FingerTree v a -> FingerTree v a -> FingerTree v a
>< forall v a. Interval v -> a -> Node v a
Node Interval v
i a
x forall v a. Measured v a => a -> FingerTree v a -> FingerTree v a
<| FingerTree (IntInterval v) (Node v a)
r)
where
(FingerTree (IntInterval v) (Node v a)
l, FingerTree (IntInterval v) (Node v a)
r) = forall v a.
Measured v a =>
(v -> Bool) -> FingerTree v a -> (FingerTree v a, FingerTree v a)
FT.split IntInterval v -> Bool
larger FingerTree (IntInterval v) (Node v a)
t
larger :: IntInterval v -> Bool
larger (IntInterval Interval v
k v
_) = Interval v
k forall a. Ord a => a -> a -> Bool
>= Interval v
i
larger IntInterval v
NoInterval = forall a. HasCallStack => String -> a
error String
"larger NoInterval"
union :: (Ord v) => IntervalMap v a -> IntervalMap v a -> IntervalMap v a
union :: forall v a.
Ord v =>
IntervalMap v a -> IntervalMap v a -> IntervalMap v a
union (IntervalMap FingerTree (IntInterval v) (Node v a)
xs) (IntervalMap FingerTree (IntInterval v) (Node v a)
ys) = forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap (forall {v} {a}.
Ord v =>
FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
merge1 FingerTree (IntInterval v) (Node v a)
xs FingerTree (IntInterval v) (Node v a)
ys)
where
merge1 :: FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
merge1 FingerTree (IntInterval v) (Node v a)
as FingerTree (IntInterval v) (Node v a)
bs = case forall v a.
Measured v a =>
FingerTree v a -> ViewL (FingerTree v) a
FT.viewl FingerTree (IntInterval v) (Node v a)
as of
ViewL (FingerTree (IntInterval v)) (Node v a)
EmptyL -> FingerTree (IntInterval v) (Node v a)
bs
a :: Node v a
a@(Node Interval v
i a
_) :< FingerTree (IntInterval v) (Node v a)
as' -> FingerTree (IntInterval v) (Node v a)
l forall v a.
Measured v a =>
FingerTree v a -> FingerTree v a -> FingerTree v a
>< Node v a
a forall v a. Measured v a => a -> FingerTree v a -> FingerTree v a
<| FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
merge2 FingerTree (IntInterval v) (Node v a)
as' FingerTree (IntInterval v) (Node v a)
r
where
(FingerTree (IntInterval v) (Node v a)
l, FingerTree (IntInterval v) (Node v a)
r) = forall v a.
Measured v a =>
(v -> Bool) -> FingerTree v a -> (FingerTree v a, FingerTree v a)
FT.split IntInterval v -> Bool
larger FingerTree (IntInterval v) (Node v a)
bs
larger :: IntInterval v -> Bool
larger (IntInterval Interval v
k v
_) = Interval v
k forall a. Ord a => a -> a -> Bool
>= Interval v
i
larger IntInterval v
NoInterval = forall a. HasCallStack => String -> a
error String
"larger NoInterval"
merge2 :: FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
merge2 FingerTree (IntInterval v) (Node v a)
as FingerTree (IntInterval v) (Node v a)
bs = case forall v a.
Measured v a =>
FingerTree v a -> ViewL (FingerTree v) a
FT.viewl FingerTree (IntInterval v) (Node v a)
bs of
ViewL (FingerTree (IntInterval v)) (Node v a)
EmptyL -> FingerTree (IntInterval v) (Node v a)
as
b :: Node v a
b@(Node Interval v
i a
_) :< FingerTree (IntInterval v) (Node v a)
bs' -> FingerTree (IntInterval v) (Node v a)
l forall v a.
Measured v a =>
FingerTree v a -> FingerTree v a -> FingerTree v a
>< Node v a
b forall v a. Measured v a => a -> FingerTree v a -> FingerTree v a
<| FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
-> FingerTree (IntInterval v) (Node v a)
merge1 FingerTree (IntInterval v) (Node v a)
r FingerTree (IntInterval v) (Node v a)
bs'
where
(FingerTree (IntInterval v) (Node v a)
l, FingerTree (IntInterval v) (Node v a)
r) = forall v a.
Measured v a =>
(v -> Bool) -> FingerTree v a -> (FingerTree v a, FingerTree v a)
FT.split IntInterval v -> Bool
larger FingerTree (IntInterval v) (Node v a)
as
larger :: IntInterval v -> Bool
larger (IntInterval Interval v
k v
_) = Interval v
k forall a. Ord a => a -> a -> Bool
> Interval v
i
larger IntInterval v
NoInterval = forall a. HasCallStack => String -> a
error String
"larger NoInterval"
intersections :: (Ord v) => Interval v -> IntervalMap v a -> [(Interval v, a)]
intersections :: forall v a.
Ord v =>
Interval v -> IntervalMap v a -> [(Interval v, a)]
intersections Interval v
i = forall v a. Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)]
inRange (forall v. Interval v -> v
low Interval v
i) (forall v. Interval v -> v
high Interval v
i)
dominators :: (Ord v) => Interval v -> IntervalMap v a -> [(Interval v, a)]
dominators :: forall v a.
Ord v =>
Interval v -> IntervalMap v a -> [(Interval v, a)]
dominators Interval v
i = forall v a. Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)]
inRange (forall v. Interval v -> v
high Interval v
i) (forall v. Interval v -> v
low Interval v
i)
search :: (Ord v) => v -> IntervalMap v a -> [(Interval v, a)]
search :: forall v a. Ord v => v -> IntervalMap v a -> [(Interval v, a)]
search v
p = forall v a. Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)]
inRange v
p v
p
inRange :: (Ord v) => v -> v -> IntervalMap v a -> [(Interval v, a)]
inRange :: forall v a. Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)]
inRange v
lo v
hi (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = forall {b}.
FingerTree (IntInterval v) (Node v b) -> [(Interval v, b)]
matches (forall v a.
Measured v a =>
(v -> Bool) -> FingerTree v a -> FingerTree v a
FT.takeUntil (forall v. Ord v => v -> IntInterval v -> Bool
greater v
hi) FingerTree (IntInterval v) (Node v a)
t)
where
matches :: FingerTree (IntInterval v) (Node v b) -> [(Interval v, b)]
matches FingerTree (IntInterval v) (Node v b)
xs = case forall v a.
Measured v a =>
FingerTree v a -> ViewL (FingerTree v) a
FT.viewl (forall v a.
Measured v a =>
(v -> Bool) -> FingerTree v a -> FingerTree v a
FT.dropUntil (forall v. Ord v => v -> IntInterval v -> Bool
atleast v
lo) FingerTree (IntInterval v) (Node v b)
xs) of
ViewL (FingerTree (IntInterval v)) (Node v b)
EmptyL -> []
Node Interval v
i b
x :< FingerTree (IntInterval v) (Node v b)
xs' -> (Interval v
i, b
x) forall a. a -> [a] -> [a]
: FingerTree (IntInterval v) (Node v b) -> [(Interval v, b)]
matches FingerTree (IntInterval v) (Node v b)
xs'
bounds :: (Ord v) => IntervalMap v a -> Maybe (Interval v)
bounds :: forall v a. Ord v => IntervalMap v a -> Maybe (Interval v)
bounds (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = case forall v a. Measured v a => a -> v
measure FingerTree (IntInterval v) (Node v a)
t of
IntInterval v
NoInterval -> forall a. Maybe a
Nothing
IntInterval Interval v
_ v
hi -> case forall v a.
Measured v a =>
FingerTree v a -> ViewL (FingerTree v) a
FT.viewl FingerTree (IntInterval v) (Node v a)
t of
ViewL (FingerTree (IntInterval v)) (Node v a)
EmptyL -> forall a. Maybe a
Nothing
Node (Interval v
lo v
_) a
_ FT.:< FingerTree (IntInterval v) (Node v a)
_ -> forall a. a -> Maybe a
Just (forall v. v -> v -> Interval v
Interval v
lo v
hi)
leastView :: Ord v =>
IntervalMap v a -> Maybe ((Interval v, a), IntervalMap v a)
leastView :: forall v a.
Ord v =>
IntervalMap v a -> Maybe ((Interval v, a), IntervalMap v a)
leastView (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = case forall v a.
Measured v a =>
FingerTree v a -> ViewL (FingerTree v) a
FT.viewl FingerTree (IntInterval v) (Node v a)
t of
ViewL (FingerTree (IntInterval v)) (Node v a)
EmptyL -> forall a. Maybe a
Nothing
Node Interval v
i a
a FT.:< FingerTree (IntInterval v) (Node v a)
t' -> forall a. a -> Maybe a
Just ((Interval v
i, a
a), forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap FingerTree (IntInterval v) (Node v a)
t')
splitAfter :: Ord v =>
v -> IntervalMap v a -> (IntervalMap v a, IntervalMap v a)
splitAfter :: forall v a.
Ord v =>
v -> IntervalMap v a -> (IntervalMap v a, IntervalMap v a)
splitAfter v
k (IntervalMap FingerTree (IntInterval v) (Node v a)
t) = (forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap FingerTree (IntInterval v) (Node v a)
before, forall v a.
FingerTree (IntInterval v) (Node v a) -> IntervalMap v a
IntervalMap FingerTree (IntInterval v) (Node v a)
after)
where
(FingerTree (IntInterval v) (Node v a)
before, FingerTree (IntInterval v) (Node v a)
after) = forall v a.
Measured v a =>
(v -> Bool) -> FingerTree v a -> (FingerTree v a, FingerTree v a)
FT.split (forall v. Ord v => v -> IntInterval v -> Bool
greater v
k) FingerTree (IntInterval v) (Node v a)
t
atleast :: (Ord v) => v -> IntInterval v -> Bool
atleast :: forall v. Ord v => v -> IntInterval v -> Bool
atleast v
k (IntInterval Interval v
_ v
hi) = v
k forall a. Ord a => a -> a -> Bool
<= v
hi
atleast v
_ IntInterval v
NoInterval = forall a. HasCallStack => String -> a
error String
"atleast NoInterval"
greater :: (Ord v) => v -> IntInterval v -> Bool
greater :: forall v. Ord v => v -> IntInterval v -> Bool
greater v
k (IntInterval Interval v
i v
_) = forall v. Interval v -> v
low Interval v
i forall a. Ord a => a -> a -> Bool
> v
k
greater v
_ IntInterval v
NoInterval = forall a. HasCallStack => String -> a
error String
"greater NoInterval"