module HGeometry.Interval.HalfOpen
( HalfOpenInterval(HalfOpenInterval)
) where
import Control.Lens
import HGeometry.Interval.Class
import HGeometry.Interval.Internal
import HGeometry.Point
import HGeometry.Properties
import HGeometry.Intersection
data HalfOpenInterval r = HalfOpenInterval { forall r. HalfOpenInterval r -> EndPoint 'Open r
_left :: !(EndPoint Open r)
, forall r. HalfOpenInterval r -> EndPoint 'Closed r
_right :: !(EndPoint Closed r)
}
deriving (Int -> HalfOpenInterval r -> ShowS
[HalfOpenInterval r] -> ShowS
HalfOpenInterval r -> String
(Int -> HalfOpenInterval r -> ShowS)
-> (HalfOpenInterval r -> String)
-> ([HalfOpenInterval r] -> ShowS)
-> Show (HalfOpenInterval r)
forall r. Show r => Int -> HalfOpenInterval r -> ShowS
forall r. Show r => [HalfOpenInterval r] -> ShowS
forall r. Show r => HalfOpenInterval r -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall r. Show r => Int -> HalfOpenInterval r -> ShowS
showsPrec :: Int -> HalfOpenInterval r -> ShowS
$cshow :: forall r. Show r => HalfOpenInterval r -> String
show :: HalfOpenInterval r -> String
$cshowList :: forall r. Show r => [HalfOpenInterval r] -> ShowS
showList :: [HalfOpenInterval r] -> ShowS
Show,HalfOpenInterval r -> HalfOpenInterval r -> Bool
(HalfOpenInterval r -> HalfOpenInterval r -> Bool)
-> (HalfOpenInterval r -> HalfOpenInterval r -> Bool)
-> Eq (HalfOpenInterval r)
forall r. Eq r => HalfOpenInterval r -> HalfOpenInterval r -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall r. Eq r => HalfOpenInterval r -> HalfOpenInterval r -> Bool
== :: HalfOpenInterval r -> HalfOpenInterval r -> Bool
$c/= :: forall r. Eq r => HalfOpenInterval r -> HalfOpenInterval r -> Bool
/= :: HalfOpenInterval r -> HalfOpenInterval r -> Bool
Eq,(forall a b. (a -> b) -> HalfOpenInterval a -> HalfOpenInterval b)
-> (forall a b. a -> HalfOpenInterval b -> HalfOpenInterval a)
-> Functor HalfOpenInterval
forall a b. a -> HalfOpenInterval b -> HalfOpenInterval a
forall a b. (a -> b) -> HalfOpenInterval a -> HalfOpenInterval 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) -> HalfOpenInterval a -> HalfOpenInterval b
fmap :: forall a b. (a -> b) -> HalfOpenInterval a -> HalfOpenInterval b
$c<$ :: forall a b. a -> HalfOpenInterval b -> HalfOpenInterval a
<$ :: forall a b. a -> HalfOpenInterval b -> HalfOpenInterval a
Functor,(forall m. Monoid m => HalfOpenInterval m -> m)
-> (forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m)
-> (forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m)
-> (forall a b. (a -> b -> b) -> b -> HalfOpenInterval a -> b)
-> (forall a b. (a -> b -> b) -> b -> HalfOpenInterval a -> b)
-> (forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b)
-> (forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b)
-> (forall a. (a -> a -> a) -> HalfOpenInterval a -> a)
-> (forall a. (a -> a -> a) -> HalfOpenInterval a -> a)
-> (forall a. HalfOpenInterval a -> [a])
-> (forall a. HalfOpenInterval a -> Bool)
-> (forall a. HalfOpenInterval a -> Int)
-> (forall a. Eq a => a -> HalfOpenInterval a -> Bool)
-> (forall a. Ord a => HalfOpenInterval a -> a)
-> (forall a. Ord a => HalfOpenInterval a -> a)
-> (forall a. Num a => HalfOpenInterval a -> a)
-> (forall a. Num a => HalfOpenInterval a -> a)
-> Foldable HalfOpenInterval
forall a. Eq a => a -> HalfOpenInterval a -> Bool
forall a. Num a => HalfOpenInterval a -> a
forall a. Ord a => HalfOpenInterval a -> a
forall m. Monoid m => HalfOpenInterval m -> m
forall a. HalfOpenInterval a -> Bool
forall a. HalfOpenInterval a -> Int
forall a. HalfOpenInterval a -> [a]
forall a. (a -> a -> a) -> HalfOpenInterval a -> a
forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m
forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b
forall a b. (a -> b -> b) -> b -> HalfOpenInterval 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 => HalfOpenInterval m -> m
fold :: forall m. Monoid m => HalfOpenInterval m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> HalfOpenInterval a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> HalfOpenInterval a -> b
foldr :: forall a b. (a -> b -> b) -> b -> HalfOpenInterval a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> HalfOpenInterval a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> HalfOpenInterval a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b
foldl :: forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> HalfOpenInterval a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> HalfOpenInterval a -> a
foldr1 :: forall a. (a -> a -> a) -> HalfOpenInterval a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> HalfOpenInterval a -> a
foldl1 :: forall a. (a -> a -> a) -> HalfOpenInterval a -> a
$ctoList :: forall a. HalfOpenInterval a -> [a]
toList :: forall a. HalfOpenInterval a -> [a]
$cnull :: forall a. HalfOpenInterval a -> Bool
null :: forall a. HalfOpenInterval a -> Bool
$clength :: forall a. HalfOpenInterval a -> Int
length :: forall a. HalfOpenInterval a -> Int
$celem :: forall a. Eq a => a -> HalfOpenInterval a -> Bool
elem :: forall a. Eq a => a -> HalfOpenInterval a -> Bool
$cmaximum :: forall a. Ord a => HalfOpenInterval a -> a
maximum :: forall a. Ord a => HalfOpenInterval a -> a
$cminimum :: forall a. Ord a => HalfOpenInterval a -> a
minimum :: forall a. Ord a => HalfOpenInterval a -> a
$csum :: forall a. Num a => HalfOpenInterval a -> a
sum :: forall a. Num a => HalfOpenInterval a -> a
$cproduct :: forall a. Num a => HalfOpenInterval a -> a
product :: forall a. Num a => HalfOpenInterval a -> a
Foldable,Functor HalfOpenInterval
Foldable HalfOpenInterval
(Functor HalfOpenInterval, Foldable HalfOpenInterval) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HalfOpenInterval a -> f (HalfOpenInterval b))
-> (forall (f :: * -> *) a.
Applicative f =>
HalfOpenInterval (f a) -> f (HalfOpenInterval a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HalfOpenInterval a -> m (HalfOpenInterval b))
-> (forall (m :: * -> *) a.
Monad m =>
HalfOpenInterval (m a) -> m (HalfOpenInterval a))
-> Traversable HalfOpenInterval
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 =>
HalfOpenInterval (m a) -> m (HalfOpenInterval a)
forall (f :: * -> *) a.
Applicative f =>
HalfOpenInterval (f a) -> f (HalfOpenInterval a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HalfOpenInterval a -> m (HalfOpenInterval b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HalfOpenInterval a -> f (HalfOpenInterval b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HalfOpenInterval a -> f (HalfOpenInterval b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> HalfOpenInterval a -> f (HalfOpenInterval b)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
HalfOpenInterval (f a) -> f (HalfOpenInterval a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
HalfOpenInterval (f a) -> f (HalfOpenInterval a)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HalfOpenInterval a -> m (HalfOpenInterval b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> HalfOpenInterval a -> m (HalfOpenInterval b)
$csequence :: forall (m :: * -> *) a.
Monad m =>
HalfOpenInterval (m a) -> m (HalfOpenInterval a)
sequence :: forall (m :: * -> *) a.
Monad m =>
HalfOpenInterval (m a) -> m (HalfOpenInterval a)
Traversable)
type instance NumType (HalfOpenInterval r) = r
type instance StartPointOf (HalfOpenInterval r) = EndPoint Open r
type instance EndPointOf (HalfOpenInterval r) = EndPoint Closed r
instance HasStart (HalfOpenInterval r) r where
start :: Lens' (HalfOpenInterval r) r
start = (EndPoint 'Open r -> f (EndPoint 'Open r))
-> HalfOpenInterval r -> f (HalfOpenInterval r)
forall seg p. HasStartPoint seg p => Lens' seg p
Lens' (HalfOpenInterval r) (EndPoint 'Open r)
startPoint((EndPoint 'Open r -> f (EndPoint 'Open r))
-> HalfOpenInterval r -> f (HalfOpenInterval r))
-> ((r -> f r) -> EndPoint 'Open r -> f (EndPoint 'Open r))
-> (r -> f r)
-> HalfOpenInterval r
-> f (HalfOpenInterval r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(r -> f r) -> EndPoint 'Open r -> f (EndPoint 'Open r)
(IxValue (EndPoint 'Open r) -> f (IxValue (EndPoint 'Open r)))
-> EndPoint 'Open r -> f (EndPoint 'Open r)
forall endPoint endPoint'.
IsEndPoint endPoint endPoint' =>
Lens endPoint endPoint' (IxValue endPoint) (IxValue endPoint')
Lens
(EndPoint 'Open r)
(EndPoint 'Open r)
(IxValue (EndPoint 'Open r))
(IxValue (EndPoint 'Open r))
_endPoint
instance HasEnd (HalfOpenInterval r) r where
end :: Lens' (HalfOpenInterval r) r
end = (EndPoint 'Closed r -> f (EndPoint 'Closed r))
-> HalfOpenInterval r -> f (HalfOpenInterval r)
forall seg p. HasEndPoint seg p => Lens' seg p
Lens' (HalfOpenInterval r) (EndPoint 'Closed r)
endPoint((EndPoint 'Closed r -> f (EndPoint 'Closed r))
-> HalfOpenInterval r -> f (HalfOpenInterval r))
-> ((r -> f r) -> EndPoint 'Closed r -> f (EndPoint 'Closed r))
-> (r -> f r)
-> HalfOpenInterval r
-> f (HalfOpenInterval r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(r -> f r) -> EndPoint 'Closed r -> f (EndPoint 'Closed r)
(IxValue (EndPoint 'Closed r) -> f (IxValue (EndPoint 'Closed r)))
-> EndPoint 'Closed r -> f (EndPoint 'Closed r)
forall endPoint endPoint'.
IsEndPoint endPoint endPoint' =>
Lens endPoint endPoint' (IxValue endPoint) (IxValue endPoint')
Lens
(EndPoint 'Closed r)
(EndPoint 'Closed r)
(IxValue (EndPoint 'Closed r))
(IxValue (EndPoint 'Closed r))
_endPoint
instance HasStartPoint (HalfOpenInterval r) (EndPoint Open r) where
startPoint :: Lens' (HalfOpenInterval r) (EndPoint 'Open r)
startPoint = (HalfOpenInterval r -> EndPoint 'Open r)
-> (HalfOpenInterval r -> EndPoint 'Open r -> HalfOpenInterval r)
-> Lens' (HalfOpenInterval r) (EndPoint 'Open r)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens HalfOpenInterval r -> EndPoint 'Open r
forall r. HalfOpenInterval r -> EndPoint 'Open r
_left (\HalfOpenInterval r
ai EndPoint 'Open r
x -> HalfOpenInterval r
ai { _left = x})
instance HasEndPoint (HalfOpenInterval r) (EndPoint Closed r) where
endPoint :: Lens' (HalfOpenInterval r) (EndPoint 'Closed r)
endPoint = (HalfOpenInterval r -> EndPoint 'Closed r)
-> (HalfOpenInterval r -> EndPoint 'Closed r -> HalfOpenInterval r)
-> Lens' (HalfOpenInterval r) (EndPoint 'Closed r)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens HalfOpenInterval r -> EndPoint 'Closed r
forall r. HalfOpenInterval r -> EndPoint 'Closed r
_right (\HalfOpenInterval r
ai EndPoint 'Closed r
x -> HalfOpenInterval r
ai { _right = x})
instance IntervalLike_ (HalfOpenInterval r) r where
instance Interval_ (HalfOpenInterval r) r where
instance ConstructableInterval_ (HalfOpenInterval r) r where
mkInterval :: StartPointOf (HalfOpenInterval r)
-> EndPointOf (HalfOpenInterval r) -> HalfOpenInterval r
mkInterval = EndPoint 'Open r -> EndPoint 'Closed r -> HalfOpenInterval r
StartPointOf (HalfOpenInterval r)
-> EndPointOf (HalfOpenInterval r) -> HalfOpenInterval r
forall r.
EndPoint 'Open r -> EndPoint 'Closed r -> HalfOpenInterval r
HalfOpenInterval
instance (Ord r) => Point 1 r `HasIntersectionWith` HalfOpenInterval r where
(Point1 r
q) intersects :: Point 1 r -> HalfOpenInterval r -> Bool
`intersects` HalfOpenInterval r
i = r
q r -> HalfOpenInterval r -> Bool
forall interval r.
(Ord r, Interval_ interval r) =>
r -> interval -> Bool
`stabsInterval` HalfOpenInterval r
i
instance (Ord r) => ClosedInterval r `HasIntersectionWith` HalfOpenInterval r where
ClosedInterval r
closedInt intersects :: ClosedInterval r -> HalfOpenInterval r -> Bool
`intersects` HalfOpenInterval r
hoInt = case (ClosedInterval r
closedIntClosedInterval r -> Getting r (ClosedInterval r) r -> r
forall s a. s -> Getting a s a -> a
^.Getting r (ClosedInterval r) r
forall seg p. HasStart seg p => Lens' seg p
Lens' (ClosedInterval r) r
start) r -> HalfOpenInterval r -> Ordering
forall r interval.
(Ord r, Interval_ interval r) =>
r -> interval -> Ordering
`compareInterval` HalfOpenInterval r
hoInt of
Ordering
LT -> case (ClosedInterval r
closedIntClosedInterval r -> Getting r (ClosedInterval r) r -> r
forall s a. s -> Getting a s a -> a
^.Getting r (ClosedInterval r) r
forall seg p. HasEnd seg p => Lens' seg p
Lens' (ClosedInterval r) r
end) r -> HalfOpenInterval r -> Ordering
forall r interval.
(Ord r, Interval_ interval r) =>
r -> interval -> Ordering
`compareInterval` HalfOpenInterval r
hoInt of
Ordering
LT -> Bool
False
Ordering
EQ -> Bool
True
Ordering
GT -> Bool
True
Ordering
EQ -> Bool
True
Ordering
GT -> Bool
False