{-|
This module contains the syntactic tree definition, and helper functions for its evaluation.
-}
module Lsql.Csv.Core.Functions 
  (
    Arg(Symbol, Function, Value), 
    Function (AritmeticF, AggregateF, LogicF),

    AritmeticF(
      Sin, Cos, Tan, Asin, Acos, Atan,
      Sinh, Cosh, Tanh, Asinh, Acosh, Atanh,
      Exp, Sqrt,

      Size, ToString, Append,

      Round, Truncate, Ceiling, Floor,

      MinusS, Abs, Signum, Negate,

      Plus, Minus, Multiply, Divide, Power,

      Even, Odd,

      NaturalPower, Div, Quot, Rem, Mod, Gcd, Lcm,

      Less, LessOrEqual, More, MoreOrEqual,
      Equal, NotEqual, LeftOuterJoin, In
      ),

    LogicF(And, Or, Not),
    AggregateF(Cat, Sum, Avg, Count, Min, Max),

    Printable (ColumnP, ValueP),
    genStrCols, getCols, getTable, printTable, unionAggCols,

    appendArg, catterate,

    eval, evalAggregateFunctions, containsAggregateF

  ) where

import Lsql.Csv.Core.Tables
import Lsql.Csv.Core.Symbols

import Data.List


-- | A syntax tree element
data Arg = 
    Function Function -- ^ A call of function
  | Symbol String -- ^ A reference to a column
  | Value Value -- ^ A constant

-- | A syntax tree element
data Function = 
  AritmeticF AritmeticF | -- ^ An arithmetic function
  AggregateF AggregateF | -- ^ An aggregate function
  LogicF LogicF -- ^ A logical function

-- | A data type for a single `Column` or a single `Value`
data Printable = ColumnP Column | ValueP Value
  deriving (Printable -> Printable -> Bool
(Printable -> Printable -> Bool)
-> (Printable -> Printable -> Bool) -> Eq Printable
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Printable -> Printable -> Bool
== :: Printable -> Printable -> Bool
$c/= :: Printable -> Printable -> Bool
/= :: Printable -> Printable -> Bool
Eq, Eq Printable
Eq Printable =>
(Printable -> Printable -> Ordering)
-> (Printable -> Printable -> Bool)
-> (Printable -> Printable -> Bool)
-> (Printable -> Printable -> Bool)
-> (Printable -> Printable -> Bool)
-> (Printable -> Printable -> Printable)
-> (Printable -> Printable -> Printable)
-> Ord Printable
Printable -> Printable -> Bool
Printable -> Printable -> Ordering
Printable -> Printable -> Printable
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
$ccompare :: Printable -> Printable -> Ordering
compare :: Printable -> Printable -> Ordering
$c< :: Printable -> Printable -> Bool
< :: Printable -> Printable -> Bool
$c<= :: Printable -> Printable -> Bool
<= :: Printable -> Printable -> Bool
$c> :: Printable -> Printable -> Bool
> :: Printable -> Printable -> Bool
$c>= :: Printable -> Printable -> Bool
>= :: Printable -> Printable -> Bool
$cmax :: Printable -> Printable -> Printable
max :: Printable -> Printable -> Printable
$cmin :: Printable -> Printable -> Printable
min :: Printable -> Printable -> Printable
Ord, Int -> Printable -> ShowS
[Printable] -> ShowS
Printable -> String
(Int -> Printable -> ShowS)
-> (Printable -> String)
-> ([Printable] -> ShowS)
-> Show Printable
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Printable -> ShowS
showsPrec :: Int -> Printable -> ShowS
$cshow :: Printable -> String
show :: Printable -> String
$cshowList :: [Printable] -> ShowS
showList :: [Printable] -> ShowS
Show)

-- | A syntax tree element 
data AritmeticF = 
  Sin Arg | Cos Arg | Tan Arg | Asin Arg | Acos Arg | Atan Arg|
  Sinh Arg | Cosh Arg | Tanh Arg | Asinh Arg | Acosh Arg | Atanh Arg|
  Exp Arg | Sqrt Arg |

  Size Arg | ToString Arg | Append Arg Arg | 

  Round Arg | Truncate Arg | Ceiling Arg | Floor Arg |

  MinusS Arg | Abs Arg | Signum Arg | Negate Arg |

  Plus Arg Arg | Minus Arg Arg | Multiply Arg Arg | Divide Arg Arg | 
  Power Arg Arg |
  
  Even Arg | Odd Arg | 

  NaturalPower Arg Arg | Div Arg Arg | Quot Arg Arg | Rem Arg Arg |
  Mod Arg Arg | Gcd Arg Arg | Lcm Arg Arg |

  Less Arg Arg | LessOrEqual Arg Arg | More Arg Arg | MoreOrEqual Arg Arg |
  Equal Arg Arg | NotEqual Arg Arg | LeftOuterJoin Arg Arg |
  In Arg Arg

-- | A syntax tree element 
data LogicF = And Arg Arg | Or Arg Arg | Not Arg
  
-- | A syntax tree element 
data AggregateF = Cat [Arg] | Sum [Arg] | Avg [Arg] | Count [Arg] | 
  Min [Arg] | Max [Arg]

pShow :: Int -> Printable -> [String]
pShow :: Int -> Printable -> [String]
pShow Int
n (ValueP Value
v) = Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
n([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ String -> [String]
forall a. a -> [a]
repeat(String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ Value -> String
forall a. Show a => a -> String
show Value
v 
pShow Int
n (ColumnP Column
c) = Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
n([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ Column -> [String]
showColumn Column
c

-- | Converts a list of `Printable` to a list of `String` columns.
-- Useful for generating CSV output.
genStrCols :: [Printable] -> [[String]]
genStrCols :: [Printable] -> [[String]]
genStrCols [Printable]
cols = (Printable -> [String]) -> [Printable] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Printable -> [String]
pShow Int
n) [Printable]
cols
  where
    n :: Int
n = [Printable] -> Int
getPrintableLength [Printable]
cols


-- | Converts a list of `Printable` to a list of `Column`.
getCols :: [Printable] -> [Column]
getCols :: [Printable] -> [Column]
getCols [Printable]
printables =
  [Printable] -> [Column]
toCols [Printable]
printables

  where
    n :: Int
n = [Printable] -> Int
getPrintableLength [Printable]
printables
    
    toCols :: [Printable] -> [Column]
    toCols :: [Printable] -> [Column]
toCols [] = []
    toCols ((ColumnP Column
c) : [Printable]
rest) = Column
c Column -> [Column] -> [Column]
forall a. a -> [a] -> [a]
: ([Printable] -> [Column]
toCols [Printable]
rest)
    toCols ((ValueP Value
v) : [Printable]
rest) = ([String] -> [Value] -> Column
Column [] (Int -> [Value] -> [Value]
forall a. Int -> [a] -> [a]
take Int
n([Value] -> [Value]) -> [Value] -> [Value]
forall a b. (a -> b) -> a -> b
$ Value -> [Value]
forall a. a -> [a]
repeat Value
v)) Column -> [Column] -> [Column]
forall a. a -> [a] -> [a]
: ([Printable] -> [Column]
toCols [Printable]
rest)

-- | Converts a list of `Printable` to a `Table`.
getTable :: [String] -- ^ The names of the table
         -> [Printable] -- ^ The columns of the table
         -> Table
getTable :: [String] -> [Printable] -> Table
getTable [String]
names [Printable]
printables = [String] -> [Column] -> Table
Table [String]
names ([Printable] -> [Column]
getCols [Printable]
printables)

-- | Converts a `Table` to a list of `ColumnP` `Printable`s.
printTable :: Table -> [Printable]
printTable :: Table -> [Printable]
printTable (Table [String]
_ [Column]
cols) = (Column -> Printable) -> [Column] -> [Printable]
forall a b. (a -> b) -> [a] -> [b]
map Column -> Printable
ColumnP [Column]
cols


genOnelineCols :: [Printable] -> [Printable]
genOnelineCols :: [Printable] -> [Printable]
genOnelineCols [] = []

genOnelineCols (ColumnP (Column [String]
_ (Value
val : [Value]
_)) : [Printable]
rest) = 
  (Value -> Printable
ValueP Value
val) Printable -> [Printable] -> [Printable]
forall a. a -> [a] -> [a]
: ([Printable] -> [Printable]
genOnelineCols [Printable]
rest)

genOnelineCols ((ValueP Value
val) : [Printable]
rest) = (Value -> Printable
ValueP Value
val) Printable -> [Printable] -> [Printable]
forall a. a -> [a] -> [a]
: ([Printable] -> [Printable]
genOnelineCols [Printable]
rest)


printableColumnnide :: Printable -> Printable
printableColumnnide :: Printable -> Printable
printableColumnnide (ValueP Value
p) = Column -> Printable
ColumnP(Column -> Printable) -> Column -> Printable
forall a b. (a -> b) -> a -> b
$ [String] -> [Value] -> Column
Column [] [Value
p]
printableColumnnide Printable
p = Printable
p


appendPrintable :: Printable -> Printable -> Printable
appendPrintable :: Printable -> Printable -> Printable
appendPrintable Printable
a0 Printable
b0 =
  let a :: Printable
a = Printable -> Printable
printableColumnnide Printable
a0 in
  let b :: Printable
b = Printable -> Printable
printableColumnnide Printable
b0 in

  Printable -> Printable -> Printable
doAppend Printable
a Printable
b

  where
    doAppend :: Printable -> Printable -> Printable
    doAppend :: Printable -> Printable -> Printable
doAppend (ColumnP (Column [String]
ns [Value]
a)) (ColumnP (Column [String]
_ [Value]
b)) =
      Column -> Printable
ColumnP ([String] -> [Value] -> Column
Column [String]
ns ([Value]
a [Value] -> [Value] -> [Value]
forall a. [a] -> [a] -> [a]
++ [Value]
b))


unionCols :: [[Printable]] -> [Printable]
unionCols :: [[Printable]] -> [Printable]
unionCols [[Printable]]
cols 
  | [[Printable]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Printable]]
cols = []
  | Bool
otherwise = ([Printable] -> [Printable] -> [Printable])
-> [[Printable]] -> [Printable]
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 [Printable] -> [Printable] -> [Printable]
col2union [[Printable]]
cols

  where 
    col2union :: [Printable] -> [Printable] -> [Printable]
    col2union :: [Printable] -> [Printable] -> [Printable]
col2union [] [] = []
    col2union (Printable
a : [Printable]
rest_a) (Printable
b : [Printable]
rest_b) = 
      (Printable
a Printable -> Printable -> Printable
`appendPrintable` Printable
b) Printable -> [Printable] -> [Printable]
forall a. a -> [a] -> [a]
: ([Printable] -> [Printable] -> [Printable]
col2union [Printable]
rest_a [Printable]
rest_b)


-- | Unions multiple first lines of lists of [`Printable`]
-- into one `Printable`.
unionAggCols :: [[Printable]] -> [Printable]
unionAggCols :: [[Printable]] -> [Printable]
unionAggCols [[Printable]]
cols =
  [[Printable]] -> [Printable]
unionCols([[Printable]] -> [Printable]) -> [[Printable]] -> [Printable]
forall a b. (a -> b) -> a -> b
$ ([Printable] -> [Printable]) -> [[Printable]] -> [[Printable]]
forall a b. (a -> b) -> [a] -> [b]
map [Printable] -> [Printable]
genOnelineCols [[Printable]]
cols


-- | Function for applying two argument function to two `Printable`s
applyInOpP :: (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP :: (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP Value -> Value -> Value
op (ColumnP Column
c1) (ColumnP Column
c2) = 
  Column -> Printable
ColumnP(Column -> Printable) -> Column -> Printable
forall a b. (a -> b) -> a -> b
$ (Value -> Value -> Value) -> Column -> Column -> Column
applyInOp Value -> Value -> Value
op Column
c1 Column
c2

applyInOpP Value -> Value -> Value
op (ColumnP Column
c1) (ValueP Value
c2) = 
  Column -> Printable
ColumnP(Column -> Printable) -> Column -> Printable
forall a b. (a -> b) -> a -> b
$ (Value -> Value -> Value) -> Column -> Column -> Column
applyInOp Value -> Value -> Value
op Column
c1 ([String] -> [Value] -> Column
Column [String
"gen"]([Value] -> Column) -> [Value] -> Column
forall a b. (a -> b) -> a -> b
$ Value -> [Value]
forall a. a -> [a]
repeat Value
c2)

applyInOpP Value -> Value -> Value
op (ValueP Value
c1) (ColumnP Column
c2) =
  Column -> Printable
ColumnP(Column -> Printable) -> Column -> Printable
forall a b. (a -> b) -> a -> b
$ (Value -> Value -> Value) -> Column -> Column -> Column
applyInOp Value -> Value -> Value
op ([String] -> [Value] -> Column
Column [String
"gen"]([Value] -> Column) -> [Value] -> Column
forall a b. (a -> b) -> a -> b
$ Value -> [Value]
forall a. a -> [a]
repeat Value
c1) Column
c2

applyInOpP Value -> Value -> Value
op (ValueP Value
c1) (ValueP Value
c2) = Value -> Printable
ValueP(Value -> Printable) -> Value -> Printable
forall a b. (a -> b) -> a -> b
$ Value -> Value -> Value
op Value
c1 Value
c2

-- | Function for applying single argument function to `Printable`
applyOpP :: (Value -> Value) -> Printable -> Printable
applyOpP :: (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
op (ColumnP Column
c) = Column -> Printable
ColumnP(Column -> Printable) -> Column -> Printable
forall a b. (a -> b) -> a -> b
$ (Value -> Value) -> Column -> Column
applyOp Value -> Value
op Column
c
applyOpP Value -> Value
op (ValueP Value
c) = Value -> Printable
ValueP(Value -> Printable) -> Value -> Printable
forall a b. (a -> b) -> a -> b
$ Value -> Value
op Value
c


-- | Appends a list of arguments together.
catterate :: [Arg] -> Arg
catterate :: [Arg] -> Arg
catterate [Arg]
args = (Arg -> Arg -> Arg) -> [Arg] -> Arg
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 Arg -> Arg -> Arg
appendArg [Arg]
args

-- | Appends two arguments together.
appendArg :: Arg -> Arg -> Arg
appendArg :: Arg -> Arg -> Arg
appendArg Arg
a Arg
b = Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ AritmeticF -> Function
AritmeticF(AritmeticF -> Function) -> AritmeticF -> Function
forall a b. (a -> b) -> a -> b
$ Arg -> Arg -> AritmeticF
Append Arg
a Arg
b


getPrintableLength :: [Printable] -> Int
getPrintableLength :: [Printable] -> Int
getPrintableLength [] = Int
1
getPrintableLength ((ValueP Value
p) : [Printable]
rest) = [Printable] -> Int
getPrintableLength [Printable]
rest
getPrintableLength ((ColumnP Column
c) : [Printable]
_ ) = [String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length([String] -> Int) -> [String] -> Int
forall a b. (a -> b) -> a -> b
$ Column -> [String]
showColumn Column
c

-- | Evaluates all nonagregate functions to `Printable`. Fails on an aggregate function.
eval :: SymbolMap -> Arg -> Printable
eval :: SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map (Symbol String
name) = Column -> Printable
ColumnP(Column -> Printable) -> Column -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap
symbol_map SymbolMap -> String -> Column
==> String
name
eval SymbolMap
_ (Value Value
val) = Value -> Printable
ValueP(Value -> Printable) -> Value -> Printable
forall a b. (a -> b) -> a -> b
$ Value
val
eval SymbolMap
symbol_map (Function Function
f) = SymbolMap -> Function -> Printable
evalFunction SymbolMap
symbol_map Function
f

evalFunction :: SymbolMap -> Function -> Printable

evalFunction :: SymbolMap -> Function -> Printable
evalFunction SymbolMap
sm (AritmeticF (Sin Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
sin(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Cos Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
cos(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Tan Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
tan(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Asin Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
asin(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Acos Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
acos(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Atan Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
atan(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (AritmeticF (Sinh Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
sinh(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Cosh Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
cosh(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Tanh Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
tanh(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Asinh Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
asinh(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Acosh Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
acosh(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Atanh Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
atanh(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (AritmeticF (Exp Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
exp(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Sqrt Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Floating a => a -> a
sqrt(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (AritmeticF (Size Arg
arg)) = 
  (Value -> Value) -> Printable -> Printable
applyOpP (Int -> Value
IntValue(Int -> Value) -> (Value -> Int) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length(String -> Int) -> (Value -> String) -> Value -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> String
forall a. Show a => a -> String
show)(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (AritmeticF (ToString Arg
arg)) = 
  (Value -> Value) -> Printable -> Printable
applyOpP (String -> Value
StringValue(String -> Value) -> (Value -> String) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> String
forall a. Show a => a -> String
show)(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg


evalFunction SymbolMap
sm (AritmeticF (Round Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall b. Integral b => Value -> b
forall a b. (RealFrac a, Integral b) => a -> b
round(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Truncate Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall b. Integral b => Value -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Ceiling Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall b. Integral b => Value -> b
forall a b. (RealFrac a, Integral b) => a -> b
ceiling(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Floor Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall b. Integral b => Value -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (AritmeticF (MinusS Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Num a => a -> a
negate(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Negate Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Num a => a -> a
negate(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Abs Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Num a => a -> a
abs(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Signum Arg
arg)) = (Value -> Value) -> Printable -> Printable
applyOpP Value -> Value
forall a. Num a => a -> a
signum(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (AritmeticF (Even Arg
arg)) = 
  (Value -> Value) -> Printable -> Printable
applyOpP (Bool -> Value
BoolValue(Bool -> Value) -> (Value -> Bool) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Bool
forall a. Integral a => a -> Bool
even)(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg
evalFunction SymbolMap
sm (AritmeticF (Odd Arg
arg)) = 
  (Value -> Value) -> Printable -> Printable
applyOpP (Bool -> Value
BoolValue(Bool -> Value) -> (Value -> Bool) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Bool
forall a. Integral a => a -> Bool
odd)(Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg


evalFunction SymbolMap
sm (LogicF (Not Arg
arg)) = 
  (Value -> Value) -> Printable -> Printable
applyOpP (Bool -> Value
BoolValue(Bool -> Value) -> (Value -> Bool) -> Value -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Bool
not(Bool -> Bool) -> (Value -> Bool) -> Value -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Bool
forall a. Boolable a => a -> Bool
getBool) (Printable -> Printable) -> Printable -> Printable
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg

evalFunction SymbolMap
sm (LogicF (And Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value -> Bool
forall a. Boolable a => a -> Bool
getBool Value
x Bool -> Bool -> Bool
&& Value -> Bool
forall a. Boolable a => a -> Bool
getBool Value
y) 
    (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (LogicF (Or Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value -> Bool
forall a. Boolable a => a -> Bool
getBool Value
x Bool -> Bool -> Bool
|| Value -> Bool
forall a. Boolable a => a -> Bool
getBool Value
y) 
    (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)


evalFunction SymbolMap
sm (AritmeticF (Plus Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP Value -> Value -> Value
forall a. Num a => a -> a -> a
(+) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Minus Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (-) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Multiply Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP Value -> Value -> Value
forall a. Num a => a -> a -> a
(*) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Divide Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP Value -> Value -> Value
forall a. Fractional a => a -> a -> a
(/) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Power Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP Value -> Value -> Value
forall a. Floating a => a -> a -> a
(**) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)


evalFunction SymbolMap
sm (AritmeticF (NaturalPower Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP Value -> Value -> Value
forall a b. (Fractional a, Integral b) => a -> b -> a
(^^) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Div Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (Value -> Value -> Value
forall a. Integral a => a -> a -> a
div) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Quot Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (Value -> Value -> Value
forall a. Integral a => a -> a -> a
quot) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Rem Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (Value -> Value -> Value
forall a. Integral a => a -> a -> a
rem) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Mod Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (Value -> Value -> Value
forall a. Integral a => a -> a -> a
mod) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Gcd Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (Value -> Value -> Value
forall a. Integral a => a -> a -> a
gcd) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Lcm Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (Value -> Value -> Value
forall a. Integral a => a -> a -> a
lcm) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Append Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> String -> Value
StringValue(String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ Value -> String
forall a. Show a => a -> String
show Value
x String -> ShowS
forall a. [a] -> [a] -> [a]
++ Value -> String
forall a. Show a => a -> String
show Value
y)
    (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)


evalFunction SymbolMap
sm (AritmeticF (Less Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value
x Value -> Value -> Bool
forall a. Ord a => a -> a -> Bool
< Value
y) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (LessOrEqual Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value
x Value -> Value -> Bool
forall a. Ord a => a -> a -> Bool
<= Value
y) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (More Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value
x Value -> Value -> Bool
forall a. Ord a => a -> a -> Bool
> Value
y) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (MoreOrEqual Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value
x Value -> Value -> Bool
forall a. Ord a => a -> a -> Bool
>= Value
y) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (NotEqual Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value
x Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
/= Value
y) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (Equal Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Value
x Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
== Value
y) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

evalFunction SymbolMap
sm (AritmeticF (In Arg
arg1 Arg
arg2)) = 
  (Value -> Value -> Value) -> Printable -> Printable -> Printable
applyInOpP (\Value
x Value
y -> Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ (Value -> String
forall a. Show a => a -> String
show Value
x) String -> String -> Bool
`is_in` (Value -> String
forall a. Show a => a -> String
show Value
y)) 
    (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg1) (SymbolMap -> Arg -> Printable
eval SymbolMap
sm Arg
arg2)

  where
    cq_in :: String -> String -> Bool
    cq_in :: String -> String -> Bool
cq_in [] [] = Bool
True
    cq_in String
_ [] = Bool
False
    cq_in [] String
_ = Bool
True

    cq_in (Char
a : String
rest_a) (Char
b : String
rest_b)
      | Char
a Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
b = String -> String -> Bool
cq_in String
rest_a String
rest_b
      | Bool
otherwise = Bool
False

    is_in :: String -> String -> Bool
    is_in :: String -> String -> Bool
is_in String
_ [] = Bool
False
    is_in [] String
_ = Bool
False
    is_in String
a String
b 
      | String -> String -> Bool
cq_in String
a String
b Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
True = Bool
True
      | Bool
otherwise = 
          let (Char
_ : String
rest_b) = String
b in 
          String -> String -> Bool
is_in String
a String
rest_b


evalFunction SymbolMap
sm (AggregateF AggregateF
_) =
  String -> Printable
forall a. HasCallStack => String -> a
error(String -> Printable) -> String -> Printable
forall a b. (a -> b) -> a -> b
$ String
"Aggregate functions can't be evaluated before grouping. " String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
"This usually happens, when you call aggregate function from condition."
  
-- | Evaluates all aggregate functions. Normal functions are not evaluated
-- if not called under other aggregate function.
evalAggregateFunctions :: SymbolMap -> Arg -> Arg

evalAggregateFunctions :: SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map (Value Value
val) =
  Value -> Arg
Value Value
val

evalAggregateFunctions SymbolMap
symbol_map (Symbol String
val) =
  String -> Arg
Symbol String
val


evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Sin Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Sin(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Cos Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Cos(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Tan Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Tan(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Asin Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Asin(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Acos Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Acos(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Atan Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Atan(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Sinh Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Sinh(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Cosh Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Cosh(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Tanh Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Tanh(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Asinh Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Asinh(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Acosh Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Acosh(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Atanh Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Atanh(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Exp Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Exp(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Sqrt Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Sqrt(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Size Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Size(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (ToString Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
ToString(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))


evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Append Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Append 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))


evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Round Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Round(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Truncate Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Truncate(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Ceiling Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Ceiling(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Floor Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Floor(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (MinusS Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
MinusS(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Abs Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Abs(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Signum Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Signum(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Negate Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Negate(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))


evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Plus Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Plus 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Minus Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Minus 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Multiply Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Multiply 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Divide Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Divide 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Power Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Power 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))


evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Even Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Even(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Odd Arg
arg))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> AritmeticF
Odd(Arg -> AritmeticF) -> Arg -> AritmeticF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))


evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (NaturalPower Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
NaturalPower 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Div Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Div 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Quot Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Quot 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Rem Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Rem 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Mod Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Mod 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Gcd Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Gcd 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Lcm Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Lcm 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Less Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Less 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (LessOrEqual Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
LessOrEqual 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (More Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
More 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (MoreOrEqual Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
MoreOrEqual 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (Equal Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
Equal 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (NotEqual Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
NotEqual 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (LeftOuterJoin Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
LeftOuterJoin 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (AritmeticF (In Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (AritmeticF -> Function
AritmeticF (Arg -> Arg -> AritmeticF
In 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))



evalAggregateFunctions SymbolMap
symbol_map (Function (LogicF (And Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (LogicF -> Function
LogicF (Arg -> Arg -> LogicF
And 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (LogicF (Or Arg
arg1 Arg
arg2))) =
  Function -> Arg
Function (LogicF -> Function
LogicF (Arg -> Arg -> LogicF
Or 
    (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg1) (SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg2)))

evalAggregateFunctions SymbolMap
symbol_map (Function (LogicF (Not Arg
arg))) =
  Function -> Arg
Function (LogicF -> Function
LogicF (Arg -> LogicF
Not(Arg -> LogicF) -> Arg -> LogicF
forall a b. (a -> b) -> a -> b
$ SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map Arg
arg))


evalAggregateFunctions SymbolMap
symbol_map (Function (AggregateF (Cat [Arg]
args))) =
  Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Printable -> Value
doCat Printable
evaled

  where 
    evaled :: Printable
    evaled :: Printable
evaled = SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map ([Arg] -> Arg
catterate [Arg]
args)

    doCat :: Printable -> Value
    doCat :: Printable -> Value
doCat (ValueP Value
value) = Value
value
    doCat (ColumnP (Column [String]
_ [Value]
vals)) = String -> Value
StringValue(String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (Value -> String) -> [Value] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Value -> String
forall a. Show a => a -> String
show [Value]
vals

evalAggregateFunctions SymbolMap
symbol_map (Function (AggregateF (Sum [Arg]
args))) =
  Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Printable -> Value
doSum Printable
evaled

  where 
    evaled :: Printable
    evaled :: Printable
evaled = SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map(Arg -> Printable) -> Arg -> Printable
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg -> Arg) -> [Arg] -> Arg
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 
      (\Arg
x Arg
y -> Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ AritmeticF -> Function
AritmeticF(AritmeticF -> Function) -> AritmeticF -> Function
forall a b. (a -> b) -> a -> b
$ Arg -> Arg -> AritmeticF
Plus Arg
x Arg
y)([Arg] -> Arg) -> [Arg] -> Arg
forall a b. (a -> b) -> a -> b
$ [Arg]
args

    doSum :: Printable -> Value
    doSum :: Printable -> Value
doSum (ValueP Value
value) = String -> Value
forall a. HasCallStack => String -> a
error String
"You cannot sum constant."
    doSum (ColumnP (Column [String]
_ [Value]
vals)) 
      | [Value] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Value]
vals = Value
0
      | Bool
otherwise = (Value -> Value -> Value) -> [Value] -> Value
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 Value -> Value -> Value
forall a. Num a => a -> a -> a
(+) [Value]
vals

evalAggregateFunctions SymbolMap
symbol_map (Function (AggregateF (Count [Arg]
args))) 
  | [Printable] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Printable]
evaled = Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Int -> Value
IntValue Int
0
  | Bool
otherwise = Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ (Value -> Value -> Value) -> [Value] -> Value
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldl1 Value -> Value -> Value
forall a. Num a => a -> a -> a
(+)([Value] -> Value) -> [Value] -> Value
forall a b. (a -> b) -> a -> b
$ (Printable -> Value) -> [Printable] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map Printable -> Value
doCount [Printable]
evaled

  where 
    evaled :: [Printable]
    evaled :: [Printable]
evaled = (Arg -> Printable) -> [Arg] -> [Printable]
forall a b. (a -> b) -> [a] -> [b]
map (SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map) [Arg]
args

    doCount :: Printable -> Value
    doCount :: Printable -> Value
doCount (ValueP Value
value) = String -> Value
forall a. HasCallStack => String -> a
error String
"You cannot count constant"
    doCount (ColumnP (Column [String]
_ [Value]
vals)) = Int -> Value
IntValue(Int -> Value) -> Int -> Value
forall a b. (a -> b) -> a -> b
$ [Value] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Value]
vals

evalAggregateFunctions SymbolMap
symbol_map (Function (AggregateF (Avg [Arg]
args))) =
  Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Printable -> Value
doAvg Printable
evaled

  where 
    evaled :: Printable
    evaled :: Printable
evaled = SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map(Arg -> Printable) -> Arg -> Printable
forall a b. (a -> b) -> a -> b
$
      SymbolMap -> Arg -> Arg
evalAggregateFunctions SymbolMap
symbol_map(Arg -> Arg) -> Arg -> Arg
forall a b. (a -> b) -> a -> b
$ Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ AritmeticF -> Function
AritmeticF(AritmeticF -> Function) -> AritmeticF -> Function
forall a b. (a -> b) -> a -> b
$ 
      Arg -> Arg -> AritmeticF
Divide (Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ AggregateF -> Function
AggregateF(AggregateF -> Function) -> AggregateF -> Function
forall a b. (a -> b) -> a -> b
$ [Arg] -> AggregateF
Sum([Arg] -> AggregateF) -> [Arg] -> AggregateF
forall a b. (a -> b) -> a -> b
$ [Arg]
args) (Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ AggregateF -> Function
AggregateF(AggregateF -> Function) -> AggregateF -> Function
forall a b. (a -> b) -> a -> b
$ [Arg] -> AggregateF
Count([Arg] -> AggregateF) -> [Arg] -> AggregateF
forall a b. (a -> b) -> a -> b
$ [Arg]
args)

    doAvg :: Printable -> Value
    doAvg :: Printable -> Value
doAvg (ValueP Value
value) = Value
value

evalAggregateFunctions SymbolMap
symbol_map (Function (AggregateF (Min [Arg]
args))) =
  Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ [Value] -> Value
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum([Value] -> Value) -> [Value] -> Value
forall a b. (a -> b) -> a -> b
$ (Printable -> Value) -> [Printable] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map Printable -> Value
doMin [Printable]
evaled

  where 
    evaled :: [Printable]
    evaled :: [Printable]
evaled = (Arg -> Printable) -> [Arg] -> [Printable]
forall a b. (a -> b) -> [a] -> [b]
map (SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map) [Arg]
args

    doMin :: Printable -> Value
    doMin :: Printable -> Value
doMin (ValueP Value
value) = Value
value
    doMin (ColumnP (Column [String]
_ [Value]
vals)) = [Value] -> Value
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [Value]
vals


evalAggregateFunctions SymbolMap
symbol_map (Function (AggregateF (Max [Arg]
args))) =
  Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ [Value] -> Value
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum([Value] -> Value) -> [Value] -> Value
forall a b. (a -> b) -> a -> b
$ (Printable -> Value) -> [Printable] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
map Printable -> Value
doMax [Printable]
evaled

  where 
    evaled :: [Printable]
    evaled :: [Printable]
evaled = (Arg -> Printable) -> [Arg] -> [Printable]
forall a b. (a -> b) -> [a] -> [b]
map (SymbolMap -> Arg -> Printable
eval SymbolMap
symbol_map) [Arg]
args

    doMax :: Printable -> Value
    doMax :: Printable -> Value
doMax (ValueP Value
value) = Value
value
    doMax (ColumnP (Column [String]
_ [Value]
vals)) = [Value] -> Value
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum [Value]
vals
   

--evalAggregateFunctions _ x = x

-- | Runs through the syntactic tree and checks, whether it contains 
-- an aggregate function.
containsAggregateF :: Arg -> Bool
containsAggregateF :: Arg -> Bool
containsAggregateF (Function (AritmeticF (Sin Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Cos Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Tan Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Asin Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Acos Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Atan Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AritmeticF (Sinh Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Cosh Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Tanh Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Asinh Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Acosh Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Atanh Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AritmeticF (Exp Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Sqrt Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AritmeticF (Size Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (ToString Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Append Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2

containsAggregateF (Function (AritmeticF (Round Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Truncate Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Ceiling Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Floor Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AritmeticF (MinusS Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Abs Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Signum Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Negate Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AritmeticF (Plus Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Minus Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Multiply Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Divide Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Power Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2

containsAggregateF (Function (AritmeticF (Even Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg
containsAggregateF (Function (AritmeticF (Odd Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AritmeticF (NaturalPower Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Div Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Quot Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Rem Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Mod Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Gcd Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Lcm Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2

containsAggregateF (Function (AritmeticF (Less Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (LessOrEqual Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (More Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (MoreOrEqual Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (Equal Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (NotEqual Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (LeftOuterJoin Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (AritmeticF (In Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2

containsAggregateF (Function (LogicF (And Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (LogicF (Or Arg
arg1 Arg
arg2))) = Arg -> Bool
containsAggregateF Arg
arg1 Bool -> Bool -> Bool
|| Arg -> Bool
containsAggregateF Arg
arg2
containsAggregateF (Function (LogicF (Not Arg
arg))) = Arg -> Bool
containsAggregateF Arg
arg

containsAggregateF (Function (AggregateF AggregateF
_)) = Bool
True

containsAggregateF Arg
_ = Bool
False