module DataSketches.Quantiles.RelativeErrorQuantile.Types where
import Control.Monad.Primitive
import qualified DataSketches.Quantiles.RelativeErrorQuantile.Internal.InequalitySearch as IS

data Criterion = (:<) | (:<=)
  deriving (Int -> Criterion -> ShowS
[Criterion] -> ShowS
Criterion -> String
(Int -> Criterion -> ShowS)
-> (Criterion -> String)
-> ([Criterion] -> ShowS)
-> Show Criterion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Criterion] -> ShowS
$cshowList :: [Criterion] -> ShowS
show :: Criterion -> String
$cshow :: Criterion -> String
showsPrec :: Int -> Criterion -> ShowS
$cshowsPrec :: Int -> Criterion -> ShowS
Show, Criterion -> Criterion -> Bool
(Criterion -> Criterion -> Bool)
-> (Criterion -> Criterion -> Bool) -> Eq Criterion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Criterion -> Criterion -> Bool
$c/= :: Criterion -> Criterion -> Bool
== :: Criterion -> Criterion -> Bool
$c== :: Criterion -> Criterion -> Bool
Eq)

instance IS.InequalitySearch Criterion where
  inequalityCompare :: Criterion -> a -> a -> a -> Ordering
inequalityCompare Criterion
c = case Criterion
c of
    Criterion
(:<) -> (:<) -> a -> a -> a -> Ordering
forall s a.
(InequalitySearch s, Ord a) =>
s -> a -> a -> a -> Ordering
IS.inequalityCompare (:<)
(IS.:<)
    Criterion
(:<=) -> (:<=) -> a -> a -> a -> Ordering
forall s a.
(InequalitySearch s, Ord a) =>
s -> a -> a -> a -> Ordering
IS.inequalityCompare(:<=)
(IS.:<=)
  resolve :: Criterion -> Int -> (Int, Int) -> (Int, Int) -> Int
resolve Criterion
c = case Criterion
c of
    Criterion
(:<) -> (:<) -> Int -> (Int, Int) -> (Int, Int) -> Int
forall s.
InequalitySearch s =>
s -> Int -> (Int, Int) -> (Int, Int) -> Int
IS.resolve (:<)
(IS.:<)
    Criterion
(:<=) -> (:<=) -> Int -> (Int, Int) -> (Int, Int) -> Int
forall s.
InequalitySearch s =>
s -> Int -> (Int, Int) -> (Int, Int) -> Int
IS.resolve (:<=)
(IS.:<=)
  getIndex :: Criterion -> v (PrimState m) a -> Int -> Int -> a -> m Int
getIndex Criterion
c = case Criterion
c of
    Criterion
(:<) -> (:<) -> v (PrimState m) a -> Int -> Int -> a -> m Int
forall s (m :: * -> *) (v :: * -> * -> *) a.
(InequalitySearch s, PrimMonad m, MVector v a, Ord a) =>
s -> v (PrimState m) a -> Int -> Int -> a -> m Int
IS.getIndex (:<)
(IS.:<)
    Criterion
(:<=) -> (:<=) -> v (PrimState m) a -> Int -> Int -> a -> m Int
forall s (m :: * -> *) (v :: * -> * -> *) a.
(InequalitySearch s, PrimMonad m, MVector v a, Ord a) =>
s -> v (PrimState m) a -> Int -> Int -> a -> m Int
IS.getIndex (:<=)
(IS.:<=)


data RankAccuracy 
  = HighRanksAreAccurate 
  -- ^ High ranks are prioritized for better accuracy.
  | LowRanksAreAccurate
  -- ^ Low ranks are prioritized for better accuracy
  deriving (Int -> RankAccuracy -> ShowS
[RankAccuracy] -> ShowS
RankAccuracy -> String
(Int -> RankAccuracy -> ShowS)
-> (RankAccuracy -> String)
-> ([RankAccuracy] -> ShowS)
-> Show RankAccuracy
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RankAccuracy] -> ShowS
$cshowList :: [RankAccuracy] -> ShowS
show :: RankAccuracy -> String
$cshow :: RankAccuracy -> String
showsPrec :: Int -> RankAccuracy -> ShowS
$cshowsPrec :: Int -> RankAccuracy -> ShowS
Show, RankAccuracy -> RankAccuracy -> Bool
(RankAccuracy -> RankAccuracy -> Bool)
-> (RankAccuracy -> RankAccuracy -> Bool) -> Eq RankAccuracy
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RankAccuracy -> RankAccuracy -> Bool
$c/= :: RankAccuracy -> RankAccuracy -> Bool
== :: RankAccuracy -> RankAccuracy -> Bool
$c== :: RankAccuracy -> RankAccuracy -> Bool
Eq)