{-# LANGUAGE BangPatterns #-}
module Languages.UniquenessPeriods.Vector.Properties where
import qualified Data.Vector as V
import String.Languages.UniquenessPeriods.Vector
diverse ::
Eq a => UniquenessGeneral2 a
-> Int
diverse :: UniquenessGeneral2 a -> Int
diverse UniquenessGeneral2 a
v
| UniquenessGeneral2 a -> Bool
forall a. Vector a -> Bool
V.null UniquenessGeneral2 a
v = Int
0
| Bool
otherwise = Vector Int -> Int
forall a. Num a => Vector a -> a
V.sum (Vector Int -> Int)
-> (UniquenessGeneral2 a -> Vector Int)
-> UniquenessGeneral2 a
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([Int], a) -> Int) -> UniquenessGeneral2 a -> Vector Int
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\([Int]
xs,a
_) -> if [Int] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Int]
xs then Int
0::Int else [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [Int]
xs) (UniquenessGeneral2 a -> Int) -> UniquenessGeneral2 a -> Int
forall a b. (a -> b) -> a -> b
$ UniquenessGeneral2 a
v
diverse1 ::
Eq a => UniquenessGeneral2 a
-> Int
diverse1 :: UniquenessGeneral2 a -> Int
diverse1 UniquenessGeneral2 a
v
| UniquenessGeneral2 a -> Bool
forall a. Vector a -> Bool
V.null UniquenessGeneral2 a
v = Int
0
| Bool
otherwise = Vector Int -> Int
forall a. Num a => Vector a -> a
V.sum (Vector Int -> Int)
-> (UniquenessGeneral2 a -> Vector Int)
-> UniquenessGeneral2 a
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([Int], a) -> Int) -> UniquenessGeneral2 a -> Vector Int
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\([Int]
xs,a
_) -> if [Int] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
1) [Int]
xs) then Int
0::Int else [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
1) [Int]
xs)) (UniquenessGeneral2 a -> Int) -> UniquenessGeneral2 a -> Int
forall a b. (a -> b) -> a -> b
$ UniquenessGeneral2 a
v
diverse1s ::
Eq a => UniquenessGeneral2 a
-> Int
diverse1s :: UniquenessGeneral2 a -> Int
diverse1s UniquenessGeneral2 a
v
| UniquenessGeneral2 a -> Bool
forall a. Vector a -> Bool
V.null UniquenessGeneral2 a
v = Int
0
| Bool
otherwise = Vector Int -> Int
forall a. Num a => Vector a -> a
V.sum (Vector Int -> Int)
-> (UniquenessGeneral2 a -> Vector Int)
-> UniquenessGeneral2 a
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([Int], a) -> Int) -> UniquenessGeneral2 a -> Vector Int
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\([Int]
xs,a
_) -> if [Int] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
1) [Int]
xs) then Int
0::Int else [Int] -> Int
forall a. (Num a, Ord a) => [a] -> a
sumPositiveWithoutMax ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
1) [Int]
xs)) (UniquenessGeneral2 a -> Int) -> UniquenessGeneral2 a -> Int
forall a b. (a -> b) -> a -> b
$ UniquenessGeneral2 a
v
sumPositiveAndMaxTuple :: (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple :: (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple (a
x1,a
x2) (a
x:[a]
xs)
| a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
x2 a
x Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = (a, a) -> [a] -> (a, a)
forall a. (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple (a
x1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
x, a
x2) [a]
xs
| Bool
otherwise = (a, a) -> [a] -> (a, a)
forall a. (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple (a
x1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
x, a
x) [a]
xs
sumPositiveAndMaxTuple (a
x1, a
x2) [] = (a
x1, a
x2)
sumPositiveAndMaxTuple' :: (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple' :: (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple' (!a
x1,!a
x2) (a
x:[a]
xs)
| a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
x2 a
x Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = (a, a) -> [a] -> (a, a)
forall a. (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple' (a
x1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
x, a
x2) [a]
xs
| Bool
otherwise = (a, a) -> [a] -> (a, a)
forall a. (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple' (a
x1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
x, a
x) [a]
xs
sumPositiveAndMaxTuple' (!a
x1, !a
x2) [] = (a
x1, a
x2)
sumPositiveWithoutMax :: (Num a, Ord a) => [a] -> a
sumPositiveWithoutMax :: [a] -> a
sumPositiveWithoutMax = (a -> a -> a) -> (a, a) -> a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (-) ((a, a) -> a) -> ([a] -> (a, a)) -> [a] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> [a] -> (a, a)
forall a. (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple (a
0, a
0)
sumPositiveWithoutMax' :: (Num a, Ord a) => [a] -> a
sumPositiveWithoutMax' :: [a] -> a
sumPositiveWithoutMax' = (a -> a -> a) -> (a, a) -> a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (-) ((a, a) -> a) -> ([a] -> (a, a)) -> [a] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, a) -> [a] -> (a, a)
forall a. (Num a, Ord a) => (a, a) -> [a] -> (a, a)
sumPositiveAndMaxTuple' (a
0, a
0)
diverse2 ::
Eq a => UniquenessGeneral2 a
-> Int
diverse2 :: UniquenessGeneral2 a -> Int
diverse2 UniquenessGeneral2 a
v
| UniquenessGeneral2 a -> Bool
forall a. Vector a -> Bool
V.null UniquenessGeneral2 a
v = Int
0
| Bool
otherwise = Vector Int -> Int
forall a. Num a => Vector a -> a
V.sum (Vector Int -> Int)
-> (UniquenessGeneral2 a -> Vector Int)
-> UniquenessGeneral2 a
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([Int], a) -> Int) -> UniquenessGeneral2 a -> Vector Int
forall a b. (a -> b) -> Vector a -> Vector b
V.map ([Int] -> Int
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> (([Int], a) -> [Int]) -> ([Int], a) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Int], a) -> [Int]
forall a b. (a, b) -> a
fst) (UniquenessGeneral2 a -> Int) -> UniquenessGeneral2 a -> Int
forall a b. (a -> b) -> a -> b
$ UniquenessGeneral2 a
v
{-# INLINE diverse2 #-}
oneProperty :: Ord b => [b] -> b
oneProperty :: [b] -> b
oneProperty [b]
xs
| [b] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [b]
xs = [Char] -> b
forall a. HasCallStack => [Char] -> a
error [Char]
"Languages.UniquenessPeriods.Vector.Properties.oneProperty: empty list. "
| Bool
otherwise = [b] -> b
forall a. [a] -> a
head [b]
xs
{-# INLINE oneProperty #-}
justOneValue2Property :: Ord b => b -> [b]
justOneValue2Property :: b -> [b]
justOneValue2Property = (b -> [b] -> [b]
forall a. a -> [a] -> [a]
:[])
{-# INLINE justOneValue2Property #-}