{-# LANGUAGE DeriveAnyClass        #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module HaskellWorks.Data.Segment.Strict where

import Control.DeepSeq                     (NFData)
import GHC.Generics                        (Generic)
import HaskellWorks.Data.FingerTree.Strict

-- | A closed segment.  The lower bound should be less than or equal
-- to the higher bound.
data Segment k = Segment { Segment k -> k
low :: !k, Segment k -> k
high :: !k }
    deriving (Segment k -> Segment k -> Bool
(Segment k -> Segment k -> Bool)
-> (Segment k -> Segment k -> Bool) -> Eq (Segment k)
forall k. Eq k => Segment k -> Segment k -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Segment k -> Segment k -> Bool
$c/= :: forall k. Eq k => Segment k -> Segment k -> Bool
== :: Segment k -> Segment k -> Bool
$c== :: forall k. Eq k => Segment k -> Segment k -> Bool
Eq, Eq (Segment k)
Eq (Segment k)
-> (Segment k -> Segment k -> Ordering)
-> (Segment k -> Segment k -> Bool)
-> (Segment k -> Segment k -> Bool)
-> (Segment k -> Segment k -> Bool)
-> (Segment k -> Segment k -> Bool)
-> (Segment k -> Segment k -> Segment k)
-> (Segment k -> Segment k -> Segment k)
-> Ord (Segment k)
Segment k -> Segment k -> Bool
Segment k -> Segment k -> Ordering
Segment k -> Segment k -> Segment k
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 k. Ord k => Eq (Segment k)
forall k. Ord k => Segment k -> Segment k -> Bool
forall k. Ord k => Segment k -> Segment k -> Ordering
forall k. Ord k => Segment k -> Segment k -> Segment k
min :: Segment k -> Segment k -> Segment k
$cmin :: forall k. Ord k => Segment k -> Segment k -> Segment k
max :: Segment k -> Segment k -> Segment k
$cmax :: forall k. Ord k => Segment k -> Segment k -> Segment k
>= :: Segment k -> Segment k -> Bool
$c>= :: forall k. Ord k => Segment k -> Segment k -> Bool
> :: Segment k -> Segment k -> Bool
$c> :: forall k. Ord k => Segment k -> Segment k -> Bool
<= :: Segment k -> Segment k -> Bool
$c<= :: forall k. Ord k => Segment k -> Segment k -> Bool
< :: Segment k -> Segment k -> Bool
$c< :: forall k. Ord k => Segment k -> Segment k -> Bool
compare :: Segment k -> Segment k -> Ordering
$ccompare :: forall k. Ord k => Segment k -> Segment k -> Ordering
$cp1Ord :: forall k. Ord k => Eq (Segment k)
Ord, Int -> Segment k -> ShowS
[Segment k] -> ShowS
Segment k -> String
(Int -> Segment k -> ShowS)
-> (Segment k -> String)
-> ([Segment k] -> ShowS)
-> Show (Segment k)
forall k. Show k => Int -> Segment k -> ShowS
forall k. Show k => [Segment k] -> ShowS
forall k. Show k => Segment k -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Segment k] -> ShowS
$cshowList :: forall k. Show k => [Segment k] -> ShowS
show :: Segment k -> String
$cshow :: forall k. Show k => Segment k -> String
showsPrec :: Int -> Segment k -> ShowS
$cshowsPrec :: forall k. Show k => Int -> Segment k -> ShowS
Show, (forall x. Segment k -> Rep (Segment k) x)
-> (forall x. Rep (Segment k) x -> Segment k)
-> Generic (Segment k)
forall x. Rep (Segment k) x -> Segment k
forall x. Segment k -> Rep (Segment k) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k x. Rep (Segment k) x -> Segment k
forall k x. Segment k -> Rep (Segment k) x
$cto :: forall k x. Rep (Segment k) x -> Segment k
$cfrom :: forall k x. Segment k -> Rep (Segment k) x
Generic, Segment k -> ()
(Segment k -> ()) -> NFData (Segment k)
forall k. NFData k => Segment k -> ()
forall a. (a -> ()) -> NFData a
rnf :: Segment k -> ()
$crnf :: forall k. NFData k => Segment k -> ()
NFData)

-- | A segment in which the lower and upper bounds are equal.
point :: k -> Segment k
point :: k -> Segment k
point k
k = k -> k -> Segment k
forall k. k -> k -> Segment k
Segment k
k k
k

instance (Monoid k) => Measured k (Segment k) where
  measure :: Segment k -> k
measure = Segment k -> k
forall k. Segment k -> k
low