-- | Encode the number of hits to expect. This is typically dependent on
-- some "database size". Evalues are bounded by @[0,infinity)@.
--
-- TODO Evalues close to zero are more interesting. We should strongly
-- consider log-conversion here.

module Biobase.Types.Evalue where

import           Control.DeepSeq
import           Control.Lens
import           Data.Aeson
import           Data.Binary
import           Data.Default
import           Data.Hashable (Hashable)
import           Data.Primitive.Types
import           Data.Serialize
import           Data.Vector.Unboxed.Base
import           Data.Vector.Unboxed.Deriving
import           GHC.Generics (Generic)
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Generic.Mutable as VGM
import qualified Data.Vector.Unboxed as VU

import           Numeric.Limits



-- | Type-safe wrapper for e-values.

newtype Evalue = Evalue { Evalue -> Double
getEvalue :: Double }
  deriving (Evalue -> Evalue -> Bool
(Evalue -> Evalue -> Bool)
-> (Evalue -> Evalue -> Bool) -> Eq Evalue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Evalue -> Evalue -> Bool
$c/= :: Evalue -> Evalue -> Bool
== :: Evalue -> Evalue -> Bool
$c== :: Evalue -> Evalue -> Bool
Eq,Eq Evalue
Eq Evalue
-> (Evalue -> Evalue -> Ordering)
-> (Evalue -> Evalue -> Bool)
-> (Evalue -> Evalue -> Bool)
-> (Evalue -> Evalue -> Bool)
-> (Evalue -> Evalue -> Bool)
-> (Evalue -> Evalue -> Evalue)
-> (Evalue -> Evalue -> Evalue)
-> Ord Evalue
Evalue -> Evalue -> Bool
Evalue -> Evalue -> Ordering
Evalue -> Evalue -> Evalue
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
min :: Evalue -> Evalue -> Evalue
$cmin :: Evalue -> Evalue -> Evalue
max :: Evalue -> Evalue -> Evalue
$cmax :: Evalue -> Evalue -> Evalue
>= :: Evalue -> Evalue -> Bool
$c>= :: Evalue -> Evalue -> Bool
> :: Evalue -> Evalue -> Bool
$c> :: Evalue -> Evalue -> Bool
<= :: Evalue -> Evalue -> Bool
$c<= :: Evalue -> Evalue -> Bool
< :: Evalue -> Evalue -> Bool
$c< :: Evalue -> Evalue -> Bool
compare :: Evalue -> Evalue -> Ordering
$ccompare :: Evalue -> Evalue -> Ordering
$cp1Ord :: Eq Evalue
Ord,ReadPrec [Evalue]
ReadPrec Evalue
Int -> ReadS Evalue
ReadS [Evalue]
(Int -> ReadS Evalue)
-> ReadS [Evalue]
-> ReadPrec Evalue
-> ReadPrec [Evalue]
-> Read Evalue
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Evalue]
$creadListPrec :: ReadPrec [Evalue]
readPrec :: ReadPrec Evalue
$creadPrec :: ReadPrec Evalue
readList :: ReadS [Evalue]
$creadList :: ReadS [Evalue]
readsPrec :: Int -> ReadS Evalue
$creadsPrec :: Int -> ReadS Evalue
Read,Int -> Evalue -> ShowS
[Evalue] -> ShowS
Evalue -> String
(Int -> Evalue -> ShowS)
-> (Evalue -> String) -> ([Evalue] -> ShowS) -> Show Evalue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Evalue] -> ShowS
$cshowList :: [Evalue] -> ShowS
show :: Evalue -> String
$cshow :: Evalue -> String
showsPrec :: Int -> Evalue -> ShowS
$cshowsPrec :: Int -> Evalue -> ShowS
Show,Integer -> Evalue
Evalue -> Evalue
Evalue -> Evalue -> Evalue
(Evalue -> Evalue -> Evalue)
-> (Evalue -> Evalue -> Evalue)
-> (Evalue -> Evalue -> Evalue)
-> (Evalue -> Evalue)
-> (Evalue -> Evalue)
-> (Evalue -> Evalue)
-> (Integer -> Evalue)
-> Num Evalue
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> Evalue
$cfromInteger :: Integer -> Evalue
signum :: Evalue -> Evalue
$csignum :: Evalue -> Evalue
abs :: Evalue -> Evalue
$cabs :: Evalue -> Evalue
negate :: Evalue -> Evalue
$cnegate :: Evalue -> Evalue
* :: Evalue -> Evalue -> Evalue
$c* :: Evalue -> Evalue -> Evalue
- :: Evalue -> Evalue -> Evalue
$c- :: Evalue -> Evalue -> Evalue
+ :: Evalue -> Evalue -> Evalue
$c+ :: Evalue -> Evalue -> Evalue
Num,(forall x. Evalue -> Rep Evalue x)
-> (forall x. Rep Evalue x -> Evalue) -> Generic Evalue
forall x. Rep Evalue x -> Evalue
forall x. Evalue -> Rep Evalue x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Evalue x -> Evalue
$cfrom :: forall x. Evalue -> Rep Evalue x
Generic)
makeWrapped ''Evalue

instance Binary    Evalue
instance FromJSON  Evalue
instance Hashable  Evalue
instance Serialize Evalue
instance ToJSON    Evalue
instance NFData    Evalue

derivingUnbox "Evalue"
  [t| Evalue -> Double |] [| getEvalue |] [| Evalue |]

-- | By default, we expect no hits.

instance Default Evalue where
  def :: Evalue
def = Double -> Evalue
Evalue Double
0
  {-# Inline def #-}

instance NumericLimits Evalue where
  maxFinite :: Evalue
maxFinite   = Double -> Evalue
Evalue Double
forall x. NumericLimits x => x
maxFinite
  minFinite :: Evalue
minFinite   = Double -> Evalue
Evalue Double
0
  {-# Inline maxFinite  #-}
  {-# Inline minFinite  #-}