module RaskellCore
(
Token,
Sequence,
Keys,
Queries,
Values,
Predicate,
Selector,
BoolSequence,
Aggregator,
AggregationType (..),
kqv,
maxKQV,
minKQV,
selectCausal,
filledWith,
indicesOf,
aggregate,
aggrMax,
aggrMean,
aggrMin,
selWidth,
fromBool,
tokMap,
seqMap,
full,
indices,
aggr,
select,
)
where
import Data.Int (Int8)
import Data.Maybe (fromMaybe)
type Token = Int8
type Sequence = [Token]
type Keys = Sequence
type Queries = Sequence
type Values = Sequence
type Predicate = Token -> Token -> Bool
type Selector = [BoolSequence]
type BoolSequence = [Bool]
data AggregationType
= Min
| Mean
| Max
kqv ::
Token ->
AggregationType ->
Keys ->
Queries ->
Predicate ->
Values ->
Sequence
kqv :: Token
-> AggregationType -> Keys -> Keys -> Predicate -> Keys -> Keys
kqv Token
filler AggregationType
agg Keys
keys Keys
queries Predicate
predicate = AggregationType -> Token -> Aggregator
aggregate AggregationType
agg Token
filler Aggregator -> Aggregator
forall a b. (a -> b) -> a -> b
$ Keys -> Keys -> Predicate -> Selector
selectCausal Keys
keys Keys
queries Predicate
predicate
maxKQV :: Keys -> Queries -> Predicate -> Values -> Sequence
maxKQV :: Keys -> Keys -> Predicate -> Keys -> Keys
maxKQV = Token
-> AggregationType -> Keys -> Keys -> Predicate -> Keys -> Keys
kqv Token
minInt8 AggregationType
Max
where
minInt8 :: Token
minInt8 = Token
forall a. Bounded a => a
minBound :: Int8
minKQV :: Keys -> Queries -> Predicate -> Values -> Sequence
minKQV :: Keys -> Keys -> Predicate -> Keys -> Keys
minKQV = Token
-> AggregationType -> Keys -> Keys -> Predicate -> Keys -> Keys
kqv Token
maxInt8 AggregationType
Min
where
maxInt8 :: Token
maxInt8 = Token
forall a. Bounded a => a
maxBound :: Int8
selectCausal :: Keys -> Queries -> Predicate -> Selector
selectCausal :: Keys -> Keys -> Predicate -> Selector
selectCausal Keys
keys Keys
queries Predicate
predicate =
[ [ (Int
keyIndex Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
queryIndex) Bool -> Bool -> Bool
&& Predicate
predicate (Keys
keys Keys -> Int -> Token
forall a. HasCallStack => [a] -> Int -> a
!! Int
keyIndex) (Keys
queries Keys -> Int -> Token
forall a. HasCallStack => [a] -> Int -> a
!! Int
queryIndex)
| Int
keyIndex <- [Int
0 .. Keys -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Keys
keys Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
]
| Int
queryIndex <- [Int
0 .. Keys -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Keys
queries Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
]
filledWith :: Sequence -> Token -> Sequence
filledWith :: Keys -> Token -> Keys
filledWith = Int -> Token -> Keys
forall a. Int -> a -> [a]
replicate (Int -> Token -> Keys) -> (Keys -> Int) -> Keys -> Token -> Keys
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Keys -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length
indicesOf :: Sequence -> Sequence
indicesOf :: Keys -> Keys
indicesOf Keys
x = [Token
0 .. (Int -> Token
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Keys -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Keys
x) Token -> Token -> Token
forall a. Num a => a -> a -> a
- Token
1)]
type Aggregator = Selector -> Values -> Sequence
aggregate :: AggregationType -> Token -> Aggregator
aggregate :: AggregationType -> Token -> Aggregator
aggregate AggregationType
Max = Token -> Aggregator
aggrMax
aggregate AggregationType
Mean = Token -> Aggregator
aggrMean
aggregate AggregationType
Min = Token -> Aggregator
aggrMin
aggrMax :: Token -> Aggregator
aggrMax :: Token -> Aggregator
aggrMax Token
filler Selector
a Keys
v = ([Bool] -> Token) -> Selector -> Keys
forall a b. (a -> b) -> [a] -> [b]
map (Token -> Keys -> [Bool] -> Token
aggrMaxByRow Token
filler Keys
v) Selector
a
aggrMean :: Token -> Aggregator
aggrMean :: Token -> Aggregator
aggrMean Token
filler Selector
a Keys
v = ([Bool] -> Token) -> Selector -> Keys
forall a b. (a -> b) -> [a] -> [b]
map (Token -> Keys -> [Bool] -> Token
aggrMeanByRow Token
filler Keys
v) Selector
a
aggrMin :: Token -> Aggregator
aggrMin :: Token -> Aggregator
aggrMin Token
filler Selector
a Keys
v = ([Bool] -> Token) -> Selector -> Keys
forall a b. (a -> b) -> [a] -> [b]
map (Token -> Keys -> [Bool] -> Token
aggrMinByRow Token
filler Keys
v) Selector
a
aggrMaxByRow :: Token -> Sequence -> BoolSequence -> Token
aggrMaxByRow :: Token -> Keys -> [Bool] -> Token
aggrMaxByRow Token
filler Keys
v [Bool]
a = Token -> Maybe Token -> Token
forall a. a -> Maybe a -> a
fromMaybe Token
filler Maybe Token
maybeMax
where
maybeMax :: Maybe Token
maybeMax = Keys -> Maybe Token
forall a. Ord a => [a] -> Maybe a
safeMaximum ([Bool] -> Keys -> Keys
forall a. [Bool] -> [a] -> [a]
filterByList [Bool]
a Keys
v)
aggrMeanByRow :: Token -> Sequence -> BoolSequence -> Token
aggrMeanByRow :: Token -> Keys -> [Bool] -> Token
aggrMeanByRow Token
filler Keys
v [Bool]
a = Token -> Maybe Token -> Token
forall a. a -> Maybe a -> a
fromMaybe Token
filler Maybe Token
maybeMean
where
maybeMean :: Maybe Token
maybeMean = Keys -> Maybe Token
safeInt8Mean ([Bool] -> Keys -> Keys
forall a. [Bool] -> [a] -> [a]
filterByList [Bool]
a Keys
v)
aggrMinByRow :: Token -> Sequence -> BoolSequence -> Token
aggrMinByRow :: Token -> Keys -> [Bool] -> Token
aggrMinByRow Token
filler Keys
v [Bool]
a = Token -> Maybe Token -> Token
forall a. a -> Maybe a -> a
fromMaybe Token
filler Maybe Token
maybeMin
where
maybeMin :: Maybe Token
maybeMin = Keys -> Maybe Token
forall a. Ord a => [a] -> Maybe a
safeMinimum ([Bool] -> Keys -> Keys
forall a. [Bool] -> [a] -> [a]
filterByList [Bool]
a Keys
v)
filterByList :: [Bool] -> [a] -> [a]
filterByList :: forall a. [Bool] -> [a] -> [a]
filterByList (Bool
True : [Bool]
bs) (a
x : [a]
xs) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [Bool] -> [a] -> [a]
forall a. [Bool] -> [a] -> [a]
filterByList [Bool]
bs [a]
xs
filterByList (Bool
False : [Bool]
bs) (a
_ : [a]
xs) = [Bool] -> [a] -> [a]
forall a. [Bool] -> [a] -> [a]
filterByList [Bool]
bs [a]
xs
filterByList [Bool]
_ [a]
_ = []
safeMaximum :: (Ord a) => [a] -> Maybe a
safeMaximum :: forall a. Ord a => [a] -> Maybe a
safeMaximum [] = Maybe a
forall a. Maybe a
Nothing
safeMaximum [a]
xs = a -> Maybe a
forall a. a -> Maybe a
Just ([a] -> a
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [a]
xs)
safeMinimum :: (Ord a) => [a] -> Maybe a
safeMinimum :: forall a. Ord a => [a] -> Maybe a
safeMinimum [] = Maybe a
forall a. Maybe a
Nothing
safeMinimum [a]
xs = a -> Maybe a
forall a. a -> Maybe a
Just ([a] -> a
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [a]
xs)
safeInt8Mean :: Sequence -> Maybe Token
safeInt8Mean :: Keys -> Maybe Token
safeInt8Mean [] = Maybe Token
forall a. Maybe a
Nothing
safeInt8Mean Keys
xs = Token -> Maybe Token
forall a. a -> Maybe a
Just (Keys -> Token
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum Keys
xs Token -> Token -> Token
forall a. Integral a => a -> a -> a
`div` Int -> Token
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Keys -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Keys
xs))
selWidth :: Selector -> Sequence
selWidth :: Selector -> Keys
selWidth = ([Bool] -> Token) -> Selector -> Keys
forall a b. (a -> b) -> [a] -> [b]
map (Keys -> Token
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (Keys -> Token) -> ([Bool] -> Keys) -> [Bool] -> Token
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool -> Token) -> [Bool] -> Keys
forall a b. (a -> b) -> [a] -> [b]
map Bool -> Token
fromBool)
fromBool :: Bool -> Token
fromBool :: Bool -> Token
fromBool Bool
True = Token
1
fromBool Bool
_ = Token
0
tokMap :: (Token -> Token) -> Sequence -> Sequence
tokMap :: (Token -> Token) -> Keys -> Keys
tokMap = (Token -> Token) -> Keys -> Keys
forall a b. (a -> b) -> [a] -> [b]
map
seqMap :: (Token -> Token -> Token) -> Sequence -> Sequence -> Sequence
seqMap :: (Token -> Token -> Token) -> Keys -> Keys -> Keys
seqMap = (Token -> Token -> Token) -> Keys -> Keys -> Keys
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
full :: Sequence -> Token -> Sequence
full :: Keys -> Token -> Keys
full = Keys -> Token -> Keys
filledWith
indices :: Sequence -> Sequence
indices :: Keys -> Keys
indices = Keys -> Keys
indicesOf
aggr :: AggregationType -> Token -> Aggregator
aggr :: AggregationType -> Token -> Aggregator
aggr = AggregationType -> Token -> Aggregator
aggregate
select ::
Bool ->
Keys ->
Queries ->
Predicate ->
Selector
select :: Bool -> Keys -> Keys -> Predicate -> Selector
select Bool
True = Keys -> Keys -> Predicate -> Selector
selectCausal
select Bool
False = Keys -> Keys -> Predicate -> Selector
selectAcausal
selectAcausal :: Keys -> Queries -> Predicate -> Selector
selectAcausal :: Keys -> Keys -> Predicate -> Selector
selectAcausal Keys
keys Keys
queries Predicate
predicate = [[Predicate
predicate Token
keyIndex Token
queryIndex | Token
keyIndex <- Keys
keys] | Token
queryIndex <- Keys
queries]