{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Monoid.Statistics.Class
(
StatMonoid(..)
, reduceSample
, reduceSampleVec
, CalcCount(..)
, CalcNEvt(..)
, CalcMean(..)
, HasMean(..)
, CalcVariance(..)
, HasVariance(..)
, CalcViaHas(..)
, Partial(..)
, partial
, SampleError(..)
, Pair(..)
) where
import Control.Exception
import Control.Monad.Catch (MonadThrow(..))
import Data.Data (Typeable,Data)
import Data.Monoid
import Data.Int
import Data.Word
import Data.Vector.Unboxed (Unbox)
import Data.Vector.Unboxed.Deriving (derivingUnbox)
import qualified Data.Foldable as F
import qualified Data.Vector.Generic as G
import Numeric.Sum
import GHC.Stack (HasCallStack)
import GHC.Generics (Generic)
class Monoid m => StatMonoid m a where
addValue :: m -> a -> m
addValue m
m a
a = m
m forall a. Semigroup a => a -> a -> a
<> forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
{-# INLINE addValue #-}
singletonMonoid :: a -> m
singletonMonoid = forall m a. StatMonoid m a => m -> a -> m
addValue forall a. Monoid a => a
mempty
{-# INLINE singletonMonoid #-}
{-# MINIMAL addValue | singletonMonoid #-}
reduceSample :: forall m a f. (StatMonoid m a, F.Foldable f) => f a -> m
reduceSample :: forall m a (f :: * -> *). (StatMonoid m a, Foldable f) => f a -> m
reduceSample = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
F.foldl' forall m a. StatMonoid m a => m -> a -> m
addValue forall a. Monoid a => a
mempty
reduceSampleVec :: forall m a v. (StatMonoid m a, G.Vector v a) => v a -> m
reduceSampleVec :: forall m a (v :: * -> *). (StatMonoid m a, Vector v a) => v a -> m
reduceSampleVec = forall (v :: * -> *) b a.
Vector v b =>
(a -> b -> a) -> a -> v b -> a
G.foldl' forall m a. StatMonoid m a => m -> a -> m
addValue forall a. Monoid a => a
mempty
{-# INLINE reduceSampleVec #-}
instance ( StatMonoid m1 a
, StatMonoid m2 a
) => StatMonoid (m1,m2) a where
addValue :: (m1, m2) -> a -> (m1, m2)
addValue (!m1
m1, !m2
m2) a
a =
let !m1' :: m1
m1' = forall m a. StatMonoid m a => m -> a -> m
addValue m1
m1 a
a
!m2' :: m2
m2' = forall m a. StatMonoid m a => m -> a -> m
addValue m2
m2 a
a
in (m1
m1', m2
m2')
singletonMonoid :: a -> (m1, m2)
singletonMonoid a
a = ( forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
, forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
)
instance ( StatMonoid m1 a
, StatMonoid m2 a
, StatMonoid m3 a
) => StatMonoid (m1,m2,m3) a where
addValue :: (m1, m2, m3) -> a -> (m1, m2, m3)
addValue (!m1
m1, !m2
m2, !m3
m3) a
a =
let !m1' :: m1
m1' = forall m a. StatMonoid m a => m -> a -> m
addValue m1
m1 a
a
!m2' :: m2
m2' = forall m a. StatMonoid m a => m -> a -> m
addValue m2
m2 a
a
!m3' :: m3
m3' = forall m a. StatMonoid m a => m -> a -> m
addValue m3
m3 a
a
in (m1
m1', m2
m2', m3
m3')
singletonMonoid :: a -> (m1, m2, m3)
singletonMonoid a
a = ( forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
, forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
, forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
)
instance ( StatMonoid m1 a
, StatMonoid m2 a
, StatMonoid m3 a
, StatMonoid m4 a
) => StatMonoid (m1,m2,m3,m4) a where
addValue :: (m1, m2, m3, m4) -> a -> (m1, m2, m3, m4)
addValue (!m1
m1, !m2
m2, !m3
m3, !m4
m4) a
a =
let !m1' :: m1
m1' = forall m a. StatMonoid m a => m -> a -> m
addValue m1
m1 a
a
!m2' :: m2
m2' = forall m a. StatMonoid m a => m -> a -> m
addValue m2
m2 a
a
!m3' :: m3
m3' = forall m a. StatMonoid m a => m -> a -> m
addValue m3
m3 a
a
!m4' :: m4
m4' = forall m a. StatMonoid m a => m -> a -> m
addValue m4
m4 a
a
in (m1
m1', m2
m2', m3
m3', m4
m4')
singletonMonoid :: a -> (m1, m2, m3, m4)
singletonMonoid a
a = ( forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
, forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
, forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
, forall m a. StatMonoid m a => a -> m
singletonMonoid a
a
)
instance (Num a, a ~ a') => StatMonoid (Sum a) a' where
singletonMonoid :: a' -> Sum a
singletonMonoid = forall a. a -> Sum a
Sum
instance (Num a, a ~ a') => StatMonoid (Product a) a' where
singletonMonoid :: a' -> Product a
singletonMonoid = forall a. a -> Product a
Product
instance Real a => StatMonoid KahanSum a where
addValue :: KahanSum -> a -> KahanSum
addValue KahanSum
m a
x = forall s. Summation s => s -> Double -> s
add KahanSum
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac a
x)
{-# INLINE addValue #-}
instance Real a => StatMonoid KBNSum a where
addValue :: KBNSum -> a -> KBNSum
addValue KBNSum
m a
x = forall s. Summation s => s -> Double -> s
add KBNSum
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac a
x)
{-# INLINE addValue #-}
instance Real a => StatMonoid KB2Sum a where
addValue :: KB2Sum -> a -> KB2Sum
addValue KB2Sum
m a
x = forall s. Summation s => s -> Double -> s
add KB2Sum
m (forall a b. (Real a, Fractional b) => a -> b
realToFrac a
x)
{-# INLINE addValue #-}
class CalcCount a where
calcCount :: a -> Int
class CalcMean a where
calcMean :: MonadThrow m => a -> m Double
class CalcMean a => HasMean a where
getMean :: a -> Double
class CalcVariance a where
calcVariance :: MonadThrow m => a -> m Double
calcVariance = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x->Double
xforall a. Num a => a -> a -> a
*Double
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *).
(CalcVariance a, MonadThrow m) =>
a -> m Double
calcStddev
calcVarianceML :: MonadThrow m => a -> m Double
calcVarianceML = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Double
x->Double
xforall a. Num a => a -> a -> a
*Double
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *).
(CalcVariance a, MonadThrow m) =>
a -> m Double
calcStddevML
calcStddev :: MonadThrow m => a -> m Double
calcStddev = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *).
(CalcVariance a, MonadThrow m) =>
a -> m Double
calcVariance
calcStddevML :: (MonadThrow m) => a -> m Double
calcStddevML = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a (m :: * -> *).
(CalcVariance a, MonadThrow m) =>
a -> m Double
calcVarianceML
{-# MINIMAL (calcVariance,calcVarianceML) | (calcStddev,calcStddevML) #-}
class CalcVariance a => HasVariance a where
getVariance :: a -> Double
getVariance = (\Double
x -> Double
xforall a. Num a => a -> a -> a
*Double
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasVariance a => a -> Double
getStddev
getVarianceML :: a -> Double
getVarianceML = (\Double
x -> Double
xforall a. Num a => a -> a -> a
*Double
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasVariance a => a -> Double
getStddevML
getStddev :: a -> Double
getStddev = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasVariance a => a -> Double
getVariance
getStddevML :: a -> Double
getStddevML = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasVariance a => a -> Double
getVarianceML
{-# MINIMAL (getVariance,getVarianceML) | (getStddev,getStddevML) #-}
class CalcNEvt a where
calcEvtsW :: a -> Double
calcEvtsWErr :: a -> Double
calcEffNEvt :: a -> Double
calcEffNEvt = forall a. CalcNEvt a => a -> Double
calcEvtsW
instance CalcNEvt Int where
calcEvtsW :: Int -> Double
calcEvtsW = forall a b. (Integral a, Num b) => a -> b
fromIntegral
calcEvtsWErr :: Int -> Double
calcEvtsWErr = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CalcNEvt a => a -> Double
calcEvtsW
instance CalcNEvt Int32 where
calcEvtsW :: Int32 -> Double
calcEvtsW = forall a b. (Integral a, Num b) => a -> b
fromIntegral
calcEvtsWErr :: Int32 -> Double
calcEvtsWErr = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CalcNEvt a => a -> Double
calcEvtsW
instance CalcNEvt Int64 where
calcEvtsW :: Int64 -> Double
calcEvtsW = forall a b. (Integral a, Num b) => a -> b
fromIntegral
calcEvtsWErr :: Int64 -> Double
calcEvtsWErr = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CalcNEvt a => a -> Double
calcEvtsW
instance CalcNEvt Word where
calcEvtsW :: Word -> Double
calcEvtsW = forall a b. (Integral a, Num b) => a -> b
fromIntegral
calcEvtsWErr :: Word -> Double
calcEvtsWErr = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CalcNEvt a => a -> Double
calcEvtsW
instance CalcNEvt Word32 where
calcEvtsW :: Word32 -> Double
calcEvtsW = forall a b. (Integral a, Num b) => a -> b
fromIntegral
calcEvtsWErr :: Word32 -> Double
calcEvtsWErr = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CalcNEvt a => a -> Double
calcEvtsW
instance CalcNEvt Word64 where
calcEvtsW :: Word64 -> Double
calcEvtsW = forall a b. (Integral a, Num b) => a -> b
fromIntegral
calcEvtsWErr :: Word64 -> Double
calcEvtsWErr = forall a. Floating a => a -> a
sqrt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CalcNEvt a => a -> Double
calcEvtsW
newtype CalcViaHas a = CalcViaHas a
deriving newtype (CalcViaHas a -> Double
forall {a}. HasMean a => CalcMean (CalcViaHas a)
forall a. HasMean a => CalcViaHas a -> Double
forall a. CalcMean a -> (a -> Double) -> HasMean a
getMean :: CalcViaHas a -> Double
$cgetMean :: forall a. HasMean a => CalcViaHas a -> Double
HasMean, CalcViaHas a -> Double
forall {a}. HasVariance a => CalcVariance (CalcViaHas a)
forall a. HasVariance a => CalcViaHas a -> Double
forall a.
CalcVariance a
-> (a -> Double)
-> (a -> Double)
-> (a -> Double)
-> (a -> Double)
-> HasVariance a
getStddevML :: CalcViaHas a -> Double
$cgetStddevML :: forall a. HasVariance a => CalcViaHas a -> Double
getStddev :: CalcViaHas a -> Double
$cgetStddev :: forall a. HasVariance a => CalcViaHas a -> Double
getVarianceML :: CalcViaHas a -> Double
$cgetVarianceML :: forall a. HasVariance a => CalcViaHas a -> Double
getVariance :: CalcViaHas a -> Double
$cgetVariance :: forall a. HasVariance a => CalcViaHas a -> Double
HasVariance)
instance HasMean a => CalcMean (CalcViaHas a) where
calcMean :: forall (m :: * -> *). MonadThrow m => CalcViaHas a -> m Double
calcMean = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasMean a => a -> Double
getMean
instance HasVariance a => CalcVariance (CalcViaHas a) where
calcVariance :: forall (m :: * -> *). MonadThrow m => CalcViaHas a -> m Double
calcVariance = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasVariance a => a -> Double
getVariance
calcVarianceML :: forall (m :: * -> *). MonadThrow m => CalcViaHas a -> m Double
calcVarianceML = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasVariance a => a -> Double
getVarianceML
newtype Partial a = Partial a
deriving (Int -> Partial a -> ShowS
forall a. Show a => Int -> Partial a -> ShowS
forall a. Show a => [Partial a] -> ShowS
forall a. Show a => Partial a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Partial a] -> ShowS
$cshowList :: forall a. Show a => [Partial a] -> ShowS
show :: Partial a -> String
$cshow :: forall a. Show a => Partial a -> String
showsPrec :: Int -> Partial a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Partial a -> ShowS
Show, ReadPrec [Partial a]
ReadPrec (Partial a)
ReadS [Partial a]
forall a. Read a => ReadPrec [Partial a]
forall a. Read a => ReadPrec (Partial a)
forall a. Read a => Int -> ReadS (Partial a)
forall a. Read a => ReadS [Partial a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Partial a]
$creadListPrec :: forall a. Read a => ReadPrec [Partial a]
readPrec :: ReadPrec (Partial a)
$creadPrec :: forall a. Read a => ReadPrec (Partial a)
readList :: ReadS [Partial a]
$creadList :: forall a. Read a => ReadS [Partial a]
readsPrec :: Int -> ReadS (Partial a)
$creadsPrec :: forall a. Read a => Int -> ReadS (Partial a)
Read, Partial a -> Partial a -> Bool
forall a. Eq a => Partial a -> Partial a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Partial a -> Partial a -> Bool
$c/= :: forall a. Eq a => Partial a -> Partial a -> Bool
== :: Partial a -> Partial a -> Bool
$c== :: forall a. Eq a => Partial a -> Partial a -> Bool
Eq, Partial a -> Partial a -> Bool
Partial a -> Partial a -> Ordering
Partial a -> Partial a -> Partial a
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 {a}. Ord a => Eq (Partial a)
forall a. Ord a => Partial a -> Partial a -> Bool
forall a. Ord a => Partial a -> Partial a -> Ordering
forall a. Ord a => Partial a -> Partial a -> Partial a
min :: Partial a -> Partial a -> Partial a
$cmin :: forall a. Ord a => Partial a -> Partial a -> Partial a
max :: Partial a -> Partial a -> Partial a
$cmax :: forall a. Ord a => Partial a -> Partial a -> Partial a
>= :: Partial a -> Partial a -> Bool
$c>= :: forall a. Ord a => Partial a -> Partial a -> Bool
> :: Partial a -> Partial a -> Bool
$c> :: forall a. Ord a => Partial a -> Partial a -> Bool
<= :: Partial a -> Partial a -> Bool
$c<= :: forall a. Ord a => Partial a -> Partial a -> Bool
< :: Partial a -> Partial a -> Bool
$c< :: forall a. Ord a => Partial a -> Partial a -> Bool
compare :: Partial a -> Partial a -> Ordering
$ccompare :: forall a. Ord a => Partial a -> Partial a -> Ordering
Ord, Typeable, Partial a -> DataType
Partial a -> Constr
forall {a}. Data a => Typeable (Partial a)
forall a. Data a => Partial a -> DataType
forall a. Data a => Partial a -> Constr
forall a.
Data a =>
(forall b. Data b => b -> b) -> Partial a -> Partial a
forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> Partial a -> u
forall a u.
Data a =>
(forall d. Data d => d -> u) -> Partial a -> [u]
forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Partial a -> r
forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Partial a -> r
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Partial a)
forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Partial a -> c (Partial a)
forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Partial a))
forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Partial a))
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Partial a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Partial a -> c (Partial a)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Partial a))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
$cgmapMo :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
$cgmapMp :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
$cgmapM :: forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Partial a -> m (Partial a)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Partial a -> u
$cgmapQi :: forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> Partial a -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Partial a -> [u]
$cgmapQ :: forall a u.
Data a =>
(forall d. Data d => d -> u) -> Partial a -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Partial a -> r
$cgmapQr :: forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Partial a -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Partial a -> r
$cgmapQl :: forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Partial a -> r
gmapT :: (forall b. Data b => b -> b) -> Partial a -> Partial a
$cgmapT :: forall a.
Data a =>
(forall b. Data b => b -> b) -> Partial a -> Partial a
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Partial a))
$cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Partial a))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Partial a))
$cdataCast1 :: forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Partial a))
dataTypeOf :: Partial a -> DataType
$cdataTypeOf :: forall a. Data a => Partial a -> DataType
toConstr :: Partial a -> Constr
$ctoConstr :: forall a. Data a => Partial a -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Partial a)
$cgunfold :: forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Partial a)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Partial a -> c (Partial a)
$cgfoldl :: forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Partial a -> c (Partial a)
Data, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Partial a) x -> Partial a
forall a x. Partial a -> Rep (Partial a) x
$cto :: forall a x. Rep (Partial a) x -> Partial a
$cfrom :: forall a x. Partial a -> Rep (Partial a) x
Generic)
partial :: HasCallStack => Partial a -> a
partial :: forall a. HasCallStack => Partial a -> a
partial (Partial a
x) = a
x
instance Functor Partial where
fmap :: forall a b. (a -> b) -> Partial a -> Partial b
fmap a -> b
f (Partial a
a) = forall a. a -> Partial a
Partial (a -> b
f a
a)
instance Applicative Partial where
pure :: forall a. a -> Partial a
pure = forall a. a -> Partial a
Partial
Partial a -> b
f <*> :: forall a b. Partial (a -> b) -> Partial a -> Partial b
<*> Partial a
a = forall a. a -> Partial a
Partial (a -> b
f a
a)
(!Partial a
_) *> :: forall a b. Partial a -> Partial b -> Partial b
*> Partial b
a = Partial b
a
Partial a
a <* :: forall a b. Partial a -> Partial b -> Partial a
<* (!Partial b
_) = Partial a
a
instance Monad Partial where
return :: forall a. a -> Partial a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
Partial a
a >>= :: forall a b. Partial a -> (a -> Partial b) -> Partial b
>>= a -> Partial b
f = a -> Partial b
f a
a
>> :: forall a b. Partial a -> Partial b -> Partial b
(>>) = forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
instance MonadThrow Partial where
throwM :: forall e a. Exception e => e -> Partial a
throwM = forall a e. Exception e => e -> a
throw
data SampleError
= EmptySample String
| InvalidSample String String
deriving Int -> SampleError -> ShowS
[SampleError] -> ShowS
SampleError -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SampleError] -> ShowS
$cshowList :: [SampleError] -> ShowS
show :: SampleError -> String
$cshow :: SampleError -> String
showsPrec :: Int -> SampleError -> ShowS
$cshowsPrec :: Int -> SampleError -> ShowS
Show
instance Exception SampleError
data Pair a b = Pair !a !b
deriving (Int -> Pair a b -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a b. (Show a, Show b) => Int -> Pair a b -> ShowS
forall a b. (Show a, Show b) => [Pair a b] -> ShowS
forall a b. (Show a, Show b) => Pair a b -> String
showList :: [Pair a b] -> ShowS
$cshowList :: forall a b. (Show a, Show b) => [Pair a b] -> ShowS
show :: Pair a b -> String
$cshow :: forall a b. (Show a, Show b) => Pair a b -> String
showsPrec :: Int -> Pair a b -> ShowS
$cshowsPrec :: forall a b. (Show a, Show b) => Int -> Pair a b -> ShowS
Show,Pair a b -> Pair a b -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => Pair a b -> Pair a b -> Bool
/= :: Pair a b -> Pair a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => Pair a b -> Pair a b -> Bool
== :: Pair a b -> Pair a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => Pair a b -> Pair a b -> Bool
Eq,Pair a b -> Pair a b -> Bool
Pair a b -> Pair a b -> 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 {a} {b}. (Ord a, Ord b) => Eq (Pair a b)
forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Bool
forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Ordering
forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Pair a b
min :: Pair a b -> Pair a b -> Pair a b
$cmin :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Pair a b
max :: Pair a b -> Pair a b -> Pair a b
$cmax :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Pair a b
>= :: Pair a b -> Pair a b -> Bool
$c>= :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Bool
> :: Pair a b -> Pair a b -> Bool
$c> :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Bool
<= :: Pair a b -> Pair a b -> Bool
$c<= :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Bool
< :: Pair a b -> Pair a b -> Bool
$c< :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Bool
compare :: Pair a b -> Pair a b -> Ordering
$ccompare :: forall a b. (Ord a, Ord b) => Pair a b -> Pair a b -> Ordering
Ord,Typeable,Pair a b -> DataType
Pair a b -> Constr
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall {a} {b}. (Data a, Data b) => Typeable (Pair a b)
forall a b. (Data a, Data b) => Pair a b -> DataType
forall a b. (Data a, Data b) => Pair a b -> Constr
forall a b.
(Data a, Data b) =>
(forall b. Data b => b -> b) -> Pair a b -> Pair a b
forall a b u.
(Data a, Data b) =>
Int -> (forall d. Data d => d -> u) -> Pair a b -> u
forall a b u.
(Data a, Data b) =>
(forall d. Data d => d -> u) -> Pair a b -> [u]
forall a b r r'.
(Data a, Data b) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Pair a b -> r
forall a b r r'.
(Data a, Data b) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Pair a b -> r
forall a b (m :: * -> *).
(Data a, Data b, Monad m) =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
forall a b (m :: * -> *).
(Data a, Data b, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
forall a b (c :: * -> *).
(Data a, Data b) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Pair a b)
forall a b (c :: * -> *).
(Data a, Data b) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pair a b -> c (Pair a b)
forall a b (t :: * -> *) (c :: * -> *).
(Data a, Data b, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Pair a b))
forall a b (t :: * -> * -> *) (c :: * -> *).
(Data a, Data b, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Pair a b))
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Pair a b)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pair a b -> c (Pair a b)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Pair a b))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
$cgmapMo :: forall a b (m :: * -> *).
(Data a, Data b, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
$cgmapMp :: forall a b (m :: * -> *).
(Data a, Data b, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
$cgmapM :: forall a b (m :: * -> *).
(Data a, Data b, Monad m) =>
(forall d. Data d => d -> m d) -> Pair a b -> m (Pair a b)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Pair a b -> u
$cgmapQi :: forall a b u.
(Data a, Data b) =>
Int -> (forall d. Data d => d -> u) -> Pair a b -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Pair a b -> [u]
$cgmapQ :: forall a b u.
(Data a, Data b) =>
(forall d. Data d => d -> u) -> Pair a b -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Pair a b -> r
$cgmapQr :: forall a b r r'.
(Data a, Data b) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Pair a b -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Pair a b -> r
$cgmapQl :: forall a b r r'.
(Data a, Data b) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Pair a b -> r
gmapT :: (forall b. Data b => b -> b) -> Pair a b -> Pair a b
$cgmapT :: forall a b.
(Data a, Data b) =>
(forall b. Data b => b -> b) -> Pair a b -> Pair a b
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Pair a b))
$cdataCast2 :: forall a b (t :: * -> * -> *) (c :: * -> *).
(Data a, Data b, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Pair a b))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Pair a b))
$cdataCast1 :: forall a b (t :: * -> *) (c :: * -> *).
(Data a, Data b, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Pair a b))
dataTypeOf :: Pair a b -> DataType
$cdataTypeOf :: forall a b. (Data a, Data b) => Pair a b -> DataType
toConstr :: Pair a b -> Constr
$ctoConstr :: forall a b. (Data a, Data b) => Pair a b -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Pair a b)
$cgunfold :: forall a b (c :: * -> *).
(Data a, Data b) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Pair a b)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pair a b -> c (Pair a b)
$cgfoldl :: forall a b (c :: * -> *).
(Data a, Data b) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Pair a b -> c (Pair a b)
Data,forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a b x. Rep (Pair a b) x -> Pair a b
forall a b x. Pair a b -> Rep (Pair a b) x
$cto :: forall a b x. Rep (Pair a b) x -> Pair a b
$cfrom :: forall a b x. Pair a b -> Rep (Pair a b) x
Generic)
instance (Semigroup a, Semigroup b) => Semigroup (Pair a b) where
Pair a
x b
y <> :: Pair a b -> Pair a b -> Pair a b
<> Pair a
x' b
y' = forall a b. a -> b -> Pair a b
Pair (a
x forall a. Semigroup a => a -> a -> a
<> a
x') (b
y forall a. Semigroup a => a -> a -> a
<> b
y')
{-# INLINABLE (<>) #-}
instance (Monoid a, Monoid b) => Monoid (Pair a b) where
mempty :: Pair a b
mempty = forall a b. a -> b -> Pair a b
Pair forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty
mappend :: Pair a b -> Pair a b -> Pair a b
mappend = forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINABLE mempty #-}
{-# INLINABLE mappend #-}
instance (StatMonoid a x, StatMonoid b x) => StatMonoid (Pair a b) x where
addValue :: Pair a b -> x -> Pair a b
addValue (Pair a
a b
b) !x
x = forall a b. a -> b -> Pair a b
Pair (forall m a. StatMonoid m a => m -> a -> m
addValue a
a x
x) (forall m a. StatMonoid m a => m -> a -> m
addValue b
b x
x)
singletonMonoid :: x -> Pair a b
singletonMonoid x
x = forall a b. a -> b -> Pair a b
Pair (forall m a. StatMonoid m a => a -> m
singletonMonoid x
x) (forall m a. StatMonoid m a => a -> m
singletonMonoid x
x)
{-# INLINE addValue #-}
{-# INLINE singletonMonoid #-}
data PPair a b = PPair !a !b
instance (Semigroup a, Semigroup b) => Semigroup (PPair a b) where
PPair a
x b
y <> :: PPair a b -> PPair a b -> PPair a b
<> PPair a
x' b
y' = forall a b. a -> b -> PPair a b
PPair (a
x forall a. Semigroup a => a -> a -> a
<> a
x') (b
y forall a. Semigroup a => a -> a -> a
<> b
y')
{-# INLINABLE (<>) #-}
instance (Monoid a, Monoid b) => Monoid (PPair a b) where
mempty :: PPair a b
mempty = forall a b. a -> b -> PPair a b
PPair forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty
mappend :: PPair a b -> PPair a b -> PPair a b
mappend = forall a. Semigroup a => a -> a -> a
(<>)
{-# INLINABLE mempty #-}
{-# INLINABLE mappend #-}
instance (StatMonoid a x, StatMonoid b y) => StatMonoid (PPair a b) (x,y) where
addValue :: PPair a b -> (x, y) -> PPair a b
addValue (PPair a
a b
b) (!x
x,!y
y) = forall a b. a -> b -> PPair a b
PPair (forall m a. StatMonoid m a => m -> a -> m
addValue a
a x
x) (forall m a. StatMonoid m a => m -> a -> m
addValue b
b y
y)
singletonMonoid :: (x, y) -> PPair a b
singletonMonoid (!x
x,!y
y) = forall a b. a -> b -> PPair a b
PPair (forall m a. StatMonoid m a => a -> m
singletonMonoid x
x) (forall m a. StatMonoid m a => a -> m
singletonMonoid y
y)
{-# INLINE addValue #-}
{-# INLINE singletonMonoid #-}
derivingUnbox "Pair"
[t| forall a b. (Unbox a, Unbox b) => Pair a b -> (a,b) |]
[| \(Pair a b) -> (a,b) |]
[| \(a,b) -> Pair a b |]