{-|
This module implements the selector expression parser and the arithmetic expression parser.
-}
module Lsql.Csv.Lang.Selector (selectorP, arithmeticExprP) where

import Text.Parsec
import Text.Parsec.Prim
import Text.Parsec.Combinator
import Text.Parsec.Text
import Text.Parsec.Char

import Data.List

import Lsql.Csv.Utils.BracketExpansion

import Lsql.Csv.Core.Functions
import Lsql.Csv.Core.Tables

import System.FilePath.Glob

aggregateFGen :: ([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen :: ([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
fun [Arg]
arg = 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
fun [Arg]
arg

aggregateFP :: ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP :: ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP [Arg] -> Arg
constructor String
name [String]
symbol_list = do
  String -> ParsecT Text () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
name
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
  [Arg]
ret <- [String] -> Parser [Arg]
selectorP [String]
symbol_list
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [Arg] -> Arg
constructor([Arg] -> Arg) -> [Arg] -> Arg
forall a b. (a -> b) -> a -> b
$ [Arg]
ret

catP :: [String] -> Parser Arg
catP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP (([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
Cat) String
"cat" [String]
symbol_list
sumP :: [String] -> Parser Arg
sumP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP (([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
Sum) String
"sum" [String]
symbol_list
avgP :: [String] -> Parser Arg
avgP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP (([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
Avg) String
"avg" [String]
symbol_list
countP :: [String] -> Parser Arg
countP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP (([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
Count) String
"count" [String]
symbol_list
minP :: [String] -> Parser Arg
minP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP (([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
Min) String
"min" [String]
symbol_list
maxP :: [String] -> Parser Arg
maxP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ ([Arg] -> Arg) -> String -> [String] -> Parser Arg
aggregateFP (([Arg] -> AggregateF) -> [Arg] -> Arg
aggregateFGen [Arg] -> AggregateF
Max) String
"max" [String]
symbol_list

aggregateFunctionsP :: [String] -> Parser Arg
aggregateFunctionsP :: [String] -> Parser Arg
aggregateFunctionsP [String]
symbol_list =
  ([String] -> Parser Arg
catP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
sumP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ([String] -> Parser Arg
avgP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
countP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ([String] -> Parser Arg
minP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
maxP [String]
symbol_list)

oneArgFP :: (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP :: (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP Arg -> Arg
constructor String
name [String]
symbol_list = do
  String -> ParsecT Text () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
name
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
  Arg
ret <- [String] -> Parser Arg
arithmeticExprP [String]
symbol_list
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'

  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Arg -> Arg
constructor(Arg -> Arg) -> Arg -> Arg
forall a b. (a -> b) -> a -> b
$ Arg
ret

arithmeticFGen :: (Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen :: (Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
fun Arg
arg = 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 -> AritmeticF
fun Arg
arg

sinP :: [String] -> Parser Arg
sinP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Sin) String
"sin" [String]
symbol_list
cosP :: [String] -> Parser Arg
cosP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Cos) String
"cos" [String]
symbol_list
tanP :: [String] -> Parser Arg
tanP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Tan) String
"tan" [String]
symbol_list
asinP :: [String] -> Parser Arg
asinP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Asin) String
"asin" [String]
symbol_list
acosP :: [String] -> Parser Arg
acosP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Acos) String
"acos" [String]
symbol_list
atanP :: [String] -> Parser Arg
atanP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Atan) String
"atan" [String]
symbol_list

sinhP :: [String] -> Parser Arg
sinhP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Sinh) String
"sinh" [String]
symbol_list
coshP :: [String] -> Parser Arg
coshP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Cosh) String
"cosh" [String]
symbol_list
tanhP :: [String] -> Parser Arg
tanhP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Tanh) String
"tanh" [String]
symbol_list
asinhP :: [String] -> Parser Arg
asinhP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Asinh) String
"asinh" [String]
symbol_list
acoshP :: [String] -> Parser Arg
acoshP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Acosh) String
"acosh" [String]
symbol_list
atanhP :: [String] -> Parser Arg
atanhP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Atanh) String
"atanh" [String]
symbol_list

expP :: [String] -> Parser Arg
expP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Exp) String
"exp" [String]
symbol_list
sqrtP :: [String] -> Parser Arg
sqrtP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Sqrt) String
"sqrt" [String]
symbol_list

sizeP :: [String] -> Parser Arg
sizeP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Size) String
"size" [String]
symbol_list
toStringP :: [String] -> Parser Arg
toStringP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
ToString) String
"to_string" [String]
symbol_list

negateP :: [String] -> Parser Arg
negateP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Negate) String
"negate" [String]
symbol_list
absP :: [String] -> Parser Arg
absP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Abs) String
"abs" [String]
symbol_list
signumP :: [String] -> Parser Arg
signumP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Signum) String
"signum" [String]
symbol_list

roundP :: [String] -> Parser Arg
roundP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Round) String
"round" [String]
symbol_list
truncateP :: [String] -> Parser Arg
truncateP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Truncate) String
"truncate" [String]
symbol_list
ceilingP :: [String] -> Parser Arg
ceilingP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Ceiling) String
"ceiling" [String]
symbol_list
floorP :: [String] -> Parser Arg
floorP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Floor) String
"floor" [String]
symbol_list

evenP :: [String] -> Parser Arg
evenP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Even) String
"even" [String]
symbol_list
oddP :: [String] -> Parser Arg
oddP [String]
symbol_list = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ (Arg -> Arg) -> String -> [String] -> Parser Arg
oneArgFP ((Arg -> AritmeticF) -> Arg -> Arg
arithmeticFGen Arg -> AritmeticF
Odd) String
"odd" [String]
symbol_list


oneArgFunctionsP :: [String] -> Parser Arg
oneArgFunctionsP :: [String] -> Parser Arg
oneArgFunctionsP [String]
symbol_list = 
  ([String] -> Parser Arg
sinP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
cosP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
tanP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ([String] -> Parser Arg
asinP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
acosP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
atanP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>

  ([String] -> Parser Arg
sinhP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
coshP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
tanhP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ([String] -> Parser Arg
asinhP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
acoshP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
atanhP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>

  ([String] -> Parser Arg
expP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
sqrtP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> 

  ([String] -> Parser Arg
sizeP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
toStringP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> 

  ([String] -> Parser Arg
negateP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
absP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
signumP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>

  ([String] -> Parser Arg
roundP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
truncateP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
ceilingP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ([String] -> Parser Arg
floorP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>

  ([String] -> Parser Arg
evenP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Parser Arg
oddP [String]
symbol_list)


notP :: [String] -> Parser Arg
notP :: [String] -> Parser Arg
notP [String]
symbol_list = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'!'
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  Arg
ret <- [String] -> Parser Arg
arithmeticExprP [String]
symbol_list
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ LogicF -> Function
LogicF(LogicF -> Function) -> LogicF -> Function
forall a b. (a -> b) -> a -> b
$ Arg -> LogicF
Not Arg
ret

minusSP :: [String] -> Parser Arg
minusSP :: [String] -> Parser Arg
minusSP [String]
symbol_list = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  Arg
ret <- [String] -> Parser Arg
arithmeticExprP [String]
symbol_list
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser 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 -> AritmeticF
MinusS Arg
ret


arithmeticF2Gen :: (Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen :: (Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
fun Arg
arg1 Arg
arg2 = 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
fun Arg
arg1 Arg
arg2

logicF2Gen :: (Arg -> Arg -> LogicF) -> Arg -> Arg -> Arg
logicF2Gen :: (Arg -> Arg -> LogicF) -> Arg -> Arg -> Arg
logicF2Gen Arg -> Arg -> LogicF
fun Arg
arg1 Arg
arg2 = Function -> Arg
Function(Function -> Arg) -> Function -> Arg
forall a b. (a -> b) -> a -> b
$ LogicF -> Function
LogicF(LogicF -> Function) -> LogicF -> Function
forall a b. (a -> b) -> a -> b
$ Arg -> Arg -> LogicF
fun Arg
arg1 Arg
arg2

twoArgInFP :: Int -> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP :: Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
level Arg -> Arg -> Arg
constructor String
op_name [String]
symbol_list Arg
arg1 = do
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  String -> ParsecT Text () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
op_name
  Arg
arg2 <- Int -> [String] -> Parser Arg
arithmeticExprGenP Int
level [String]
symbol_list

  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Arg -> Arg -> Arg
constructor Arg
arg1 Arg
arg2

inP :: [String] -> Arg -> Parser Arg
inP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
1 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
In) String
"in" [String]
symbol_list Arg
arg

powerP :: [String] -> Arg -> Parser Arg
powerP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
1 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Power) String
"**" [String]
symbol_list Arg
arg

naturalPowerP :: [String] -> Arg -> Parser Arg
naturalPowerP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
1 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
NaturalPower) String
"^" [String]
symbol_list Arg
arg

multiplyP :: [String] -> Arg -> Parser Arg
multiplyP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Multiply) String
"*" [String]
symbol_list Arg
arg
divideP :: [String] -> Arg -> Parser Arg
divideP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Divide) String
"/" [String]
symbol_list Arg
arg

divP :: [String] -> Arg -> Parser Arg
divP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Div) String
"div" [String]
symbol_list Arg
arg

quotP :: [String] -> Arg -> Parser Arg
quotP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Quot) String
"quot" [String]
symbol_list Arg
arg

remP :: [String] -> Arg -> Parser Arg
remP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Rem) String
"rem" [String]
symbol_list Arg
arg

modP :: [String] -> Arg -> Parser Arg
modP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Mod) String
"mod" [String]
symbol_list Arg
arg

gcdP :: [String] -> Arg -> Parser Arg
gcdP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Gcd) String
"gcd" [String]
symbol_list Arg
arg

lcmP :: [String] -> Arg -> Parser Arg
lcmP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
2 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Lcm) String
"lcm" [String]
symbol_list Arg
arg

appendP :: [String] -> Arg -> Parser Arg
appendP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
3 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Append) String
"++" [String]
symbol_list Arg
arg
plusP :: [String] -> Arg -> Parser Arg
plusP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
3 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Plus) String
"+" [String]
symbol_list Arg
arg
minusP :: [String] -> Arg -> Parser Arg
minusP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
3 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Minus) String
"-" [String]
symbol_list Arg
arg

lessOrEqualP :: [String] -> Arg -> Parser Arg
lessOrEqualP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
4 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
LessOrEqual) String
"<=" [String]
symbol_list Arg
arg

moreOrEqualP :: [String] -> Arg -> Parser Arg
moreOrEqualP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
4 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
MoreOrEqual) String
">=" [String]
symbol_list Arg
arg

lessP :: [String] -> Arg -> Parser Arg
lessP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
4 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Less) String
"<" [String]
symbol_list Arg
arg
moreP :: [String] -> Arg -> Parser Arg
moreP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
4 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
More) String
">" [String]
symbol_list Arg
arg
notEqualP :: [String] -> Arg -> Parser Arg
notEqualP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
4 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
NotEqual) String
"!=" [String]
symbol_list Arg
arg
equalP :: [String] -> Arg -> Parser Arg
equalP [String]
symbol_list Arg
arg = 
  Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
4 ((Arg -> Arg -> AritmeticF) -> Arg -> Arg -> Arg
arithmeticF2Gen Arg -> Arg -> AritmeticF
Equal) String
"==" [String]
symbol_list Arg
arg

orP :: [String] -> Arg -> Parser Arg
orP [String]
symbol_list Arg
arg = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
5 ((Arg -> Arg -> LogicF) -> Arg -> Arg -> Arg
logicF2Gen Arg -> Arg -> LogicF
Or) String
"||" [String]
symbol_list Arg
arg
andP :: [String] -> Arg -> Parser Arg
andP [String]
symbol_list Arg
arg = Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Int
-> (Arg -> Arg -> Arg) -> String -> [String] -> Arg -> Parser Arg
twoArgInFP Int
5 ((Arg -> Arg -> LogicF) -> Arg -> Arg -> Arg
logicF2Gen Arg -> Arg -> LogicF
And) String
"&&" [String]
symbol_list Arg
arg


twoArgInFunctions1P :: [String] -> Arg -> Parser Arg
twoArgInFunctions1P :: [String] -> Arg -> Parser Arg
twoArgInFunctions1P [String]
symbol_list Arg
arg = 
  ([String] -> Arg -> Parser Arg
inP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
powerP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> 
    ([String] -> Arg -> Parser Arg
naturalPowerP [String]
symbol_list Arg
arg)

twoArgInFunctions2P :: [String] -> Arg -> Parser Arg
twoArgInFunctions2P :: [String] -> Arg -> Parser Arg
twoArgInFunctions2P [String]
symbol_list Arg
arg = 
  ([String] -> Arg -> Parser Arg
multiplyP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
divideP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    ([String] -> Arg -> Parser Arg
divP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
quotP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    ([String] -> Arg -> Parser Arg
remP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
modP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    ([String] -> Arg -> Parser Arg
gcdP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
lcmP [String]
symbol_list Arg
arg)


twoArgInFunctions3P :: [String] -> Arg -> Parser Arg
twoArgInFunctions3P :: [String] -> Arg -> Parser Arg
twoArgInFunctions3P [String]
symbol_list Arg
arg = 
  ([String] -> Arg -> Parser Arg
appendP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    ([String] -> Arg -> Parser Arg
plusP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
minusP [String]
symbol_list Arg
arg)

twoArgInFunctions4P :: [String] -> Arg -> Parser Arg
twoArgInFunctions4P :: [String] -> Arg -> Parser Arg
twoArgInFunctions4P [String]
symbol_list Arg
arg = 
    ([String] -> Arg -> Parser Arg
lessOrEqualP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
moreOrEqualP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    ([String] -> Arg -> Parser Arg
lessP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
moreP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    ([String] -> Arg -> Parser Arg
notEqualP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
equalP [String]
symbol_list Arg
arg)

twoArgInFunctions5P :: [String] -> Arg -> Parser Arg
twoArgInFunctions5P :: [String] -> Arg -> Parser Arg
twoArgInFunctions5P [String]
symbol_list Arg
arg = 
  ([String] -> Arg -> Parser Arg
orP [String]
symbol_list Arg
arg) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ([String] -> Arg -> Parser Arg
andP [String]
symbol_list Arg
arg) 

bracketAritmeticExprP :: [String] -> Parser Arg
bracketAritmeticExprP :: [String] -> Parser Arg
bracketAritmeticExprP [String]
symbol_list = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
  Arg
ret <- [String] -> Parser Arg
arithmeticExprP [String]
symbol_list
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Arg
ret

dolarAritmeticExprP :: [String] -> Parser Arg
dolarAritmeticExprP :: [String] -> Parser Arg
dolarAritmeticExprP [String]
symbol_list = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'$'
  Arg
ret <- [String] -> Parser Arg
bracketAritmeticExprP [String]
symbol_list
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Arg
ret

nonRecAritmeticExpr :: [String] -> Parser Arg
nonRecAritmeticExpr :: [String] -> Parser Arg
nonRecAritmeticExpr [String]
symbol_list = do 
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  Arg
ret <-([String] -> Parser Arg
bracketAritmeticExprP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [String] -> Parser Arg
dolarAritmeticExprP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> 
    (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [String] -> Parser Arg
oneArgFunctionsP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [String] -> Parser Arg
aggregateFunctionsP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [String] -> Parser Arg
notP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [String] -> Parser Arg
minusSP [String]
symbol_list) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    Parser Arg
oneAtomP
  
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Arg
ret

arithmeticExprNP :: [[String] -> Arg -> Parser Arg] -> [String] -> Parser Arg
arithmeticExprNP :: [[String] -> Arg -> Parser Arg] -> [String] -> Parser Arg
arithmeticExprNP [] [String]
symbol_list = [String] -> Parser Arg
nonRecAritmeticExpr [String]
symbol_list

arithmeticExprNP ([String] -> Arg -> Parser Arg
funGen : [[String] -> Arg -> Parser Arg]
rest) [String]
symbol_list = do 
  Arg
pre <- [[String] -> Arg -> Parser Arg] -> [String] -> Parser Arg
arithmeticExprNP [[String] -> Arg -> Parser Arg]
rest [String]
symbol_list
  Arg
ret <- Arg -> Parser Arg
recP Arg
pre
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Arg
ret

  where
    recP :: Arg -> Parser Arg
    recP :: Arg -> Parser Arg
recP Arg
accu = do
      Maybe Arg
next <- Parser Arg -> ParsecT Text () Identity (Maybe Arg)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ [String] -> Arg -> Parser Arg
funGen [String]
symbol_list Arg
accu)

      case Maybe Arg
next of
        Just Arg
jnext -> do
          Arg
rec_ret <- Arg -> Parser Arg
recP Arg
jnext
          Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Arg
rec_ret
        Maybe Arg
Nothing -> Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Arg
accu

arithmeticExprGenFP :: [[String] -> Arg -> Parser Arg]
arithmeticExprGenFP =  [[String] -> Arg -> Parser Arg
twoArgInFunctions5P, [String] -> Arg -> Parser Arg
twoArgInFunctions4P,
    [String] -> Arg -> Parser Arg
twoArgInFunctions3P, [String] -> Arg -> Parser Arg
twoArgInFunctions2P, [String] -> Arg -> Parser Arg
twoArgInFunctions1P]

arithmeticExprGenP :: Int -> [String] -> Parser Arg
arithmeticExprGenP :: Int -> [String] -> Parser Arg
arithmeticExprGenP Int
n [String]
symbol_list =
  [[String] -> Arg -> Parser Arg] -> [String] -> Parser Arg
arithmeticExprNP (Int
-> [[String] -> Arg -> Parser Arg]
-> [[String] -> Arg -> Parser Arg]
forall a. Int -> [a] -> [a]
drop ([[String] -> Arg -> Parser Arg] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[String] -> Arg -> Parser Arg]
arithmeticExprGenFP Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) [[String] -> Arg -> Parser Arg]
arithmeticExprGenFP)
    [String]
symbol_list

-- | The arithmetic expression parser
arithmeticExprP :: [String] -> Parser Arg
arithmeticExprP :: [String] -> Parser Arg
arithmeticExprP [String]
symbol_list = Int -> [String] -> Parser Arg
arithmeticExprGenP Int
5 [String]
symbol_list

globMatching :: [String] -> String -> [String]
globMatching :: [String] -> String -> [String]
globMatching [String]
symbols String
expr = 
  let p :: Pattern
p = String -> Pattern
compile String
expr in
  let ret :: [String]
ret = (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Pattern -> String -> Bool
match Pattern
p) [String]
symbols in

  if [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
ret then
    [String
expr]
  else 
    [String]
ret

exoticAtomP :: Parser Arg
exoticAtomP :: Parser Arg
exoticAtomP = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'`'
  String
ret <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"`"
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'`'
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ String -> Arg
Symbol String
ret

nonAtomChars :: String
nonAtomChars = String
"\n `\"'$()<>="

oneRegularAtomP :: Parser Arg
oneRegularAtomP :: Parser Arg
oneRegularAtomP = do
  String
atom <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf(String -> ParsecT Text () Identity Char)
-> String -> ParsecT Text () Identity Char
forall a b. (a -> b) -> a -> b
$ String
nonAtomChars String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"[]*,{}^+-!/|"
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ String -> Arg
atomParse String
atom

atomParse :: String -> Arg
atomParse :: String -> Arg
atomParse String
"e" = Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Double -> Value
DoubleValue(Double -> Value) -> Double -> Value
forall a b. (a -> b) -> a -> b
$ Double -> Double
forall a. Floating a => a -> a
exp Double
1
atomParse String
"pi" = Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Double -> Value
DoubleValue Double
forall a. Floating a => a
pi
atomParse String
"true" = Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Bool
True
atomParse String
"false" = Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Bool -> Value
BoolValue(Bool -> Value) -> Bool -> Value
forall a b. (a -> b) -> a -> b
$ Bool
False
atomParse String
x = String -> Arg
Symbol String
x

constantP :: Parser Arg
constantP :: Parser Arg
constantP = Parser Arg
stringConstantP Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Parser Arg
doubleConstantP) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Parser Arg
intConstantP) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> 
 (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Parser Arg
minusDoubleConstantP) Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Parser Arg -> Parser Arg
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser Arg -> Parser Arg) -> Parser Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Parser Arg
minusIntConstantP) 

oneAtomP :: Parser Arg
oneAtomP :: Parser Arg
oneAtomP = do
  Arg
ret <- Parser Arg
exoticAtomP Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Arg
constantP Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Arg
oneRegularAtomP
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Arg
ret

selectAtomP :: [String] -> Parser [Arg]
selectAtomP :: [String] -> Parser [Arg]
selectAtomP [String]
symbol_list = do 
  String
expr <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
nonAtomChars
  let symbols :: [String]
symbols = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat([[String]] -> [String]) -> [[String]] -> [String]
forall a b. (a -> b) -> a -> b
$ (String -> [String]) -> [String] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map ([String] -> String -> [String]
globMatching [String]
symbol_list)([String] -> [[String]]) -> [String] -> [[String]]
forall a b. (a -> b) -> a -> b
$ String -> [String]
bracketExpand String
expr

  [Arg] -> Parser [Arg]
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return([Arg] -> Parser [Arg]) -> [Arg] -> Parser [Arg]
forall a b. (a -> b) -> a -> b
$ (String -> Arg) -> [String] -> [Arg]
forall a b. (a -> b) -> [a] -> [b]
map String -> Arg
atomParse [String]
symbols

minusIntConstantP :: Parser Arg
minusIntConstantP :: Parser Arg
minusIntConstantP = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'
  String
ret <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Int -> Value
IntValue(Int -> Value) -> Int -> Value
forall a b. (a -> b) -> a -> b
$ Int -> Int
forall a. Num a => a -> a
negate(Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ String -> Int
forall a. Read a => String -> a
read String
ret

intConstantP :: Parser Arg
intConstantP :: Parser Arg
intConstantP = do
  String
ret <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Int -> Value
IntValue(Int -> Value) -> Int -> Value
forall a b. (a -> b) -> a -> b
$ String -> Int
forall a. Read a => String -> a
read String
ret

minusDoubleConstantP :: Parser Arg
minusDoubleConstantP :: Parser Arg
minusDoubleConstantP = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'-'
  String
ret1 <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
  String
ret2 <- String -> ParsecT Text () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"."
  String
ret3 <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit

  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Double -> Value
DoubleValue(Double -> Value) -> Double -> Value
forall a b. (a -> b) -> a -> b
$ Double -> Double
forall a. Num a => a -> a
negate(Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ String -> Double
forall a. Read a => String -> a
read(String -> Double) -> String -> Double
forall a b. (a -> b) -> a -> b
$ String
ret1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ret2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ret3

doubleConstantP :: Parser Arg
doubleConstantP :: Parser Arg
doubleConstantP = do
  String
ret1 <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
  String
ret2 <- String -> ParsecT Text () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"."
  String
ret3 <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit

  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ Double -> Value
DoubleValue(Double -> Value) -> Double -> Value
forall a b. (a -> b) -> a -> b
$ String -> Double
forall a. Read a => String -> a
read(String -> Double) -> String -> Double
forall a b. (a -> b) -> a -> b
$ String
ret1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ret2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ret3

stringConstantP :: Parser Arg
stringConstantP :: Parser Arg
stringConstantP = do
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"'
  String
ret <- ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many(ParsecT Text () Identity Char -> ParsecT Text () Identity String)
-> ParsecT Text () Identity Char -> ParsecT Text () Identity String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf String
"\""
  Char -> ParsecT Text () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'"'
  
  Arg -> Parser Arg
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return(Arg -> Parser Arg) -> Arg -> Parser Arg
forall a b. (a -> b) -> a -> b
$ Value -> Arg
Value(Value -> Arg) -> Value -> Arg
forall a b. (a -> b) -> a -> b
$ String -> Value
StringValue String
ret

atomP :: [String] -> Parser [Arg]
atomP :: [String] -> Parser [Arg]
atomP [String]
symbol_list = do
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  [Arg]
ret <- (Parser [Arg] -> Parser [Arg]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser [Arg]
neutronP) Parser [Arg] -> Parser [Arg] -> Parser [Arg]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser [Arg]
protonP
  [Arg] -> Parser [Arg]
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return [Arg]
ret

  where
    nucleonP :: Parser [Arg]
    nucleonP :: Parser [Arg]
nucleonP = do
      Maybe [Arg]
nucM <- Parser [Arg] -> ParsecT Text () Identity (Maybe [Arg])
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe(Parser [Arg] -> ParsecT Text () Identity (Maybe [Arg]))
-> Parser [Arg] -> ParsecT Text () Identity (Maybe [Arg])
forall a b. (a -> b) -> a -> b
$ (Parser [Arg] -> Parser [Arg]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser [Arg]
neutronP) Parser [Arg] -> Parser [Arg] -> Parser [Arg]
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> (Parser [Arg] -> Parser [Arg]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try Parser [Arg]
protonP)

      [Arg] -> Parser [Arg]
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return([Arg] -> Parser [Arg]) -> [Arg] -> Parser [Arg]
forall a b. (a -> b) -> a -> b
$ case Maybe [Arg]
nucM of
        Just [Arg]
args -> [Arg]
args
        Maybe [Arg]
Nothing -> []

    protonP :: Parser [Arg]
    protonP :: Parser [Arg]
protonP = do
      [Arg]
selected <- [String] -> Parser [Arg]
selectAtomP [String]
symbol_list
      [Arg]
next <- Parser [Arg]
nucleonP
      
      [Arg] -> Parser [Arg]
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return([Arg] -> Parser [Arg]) -> [Arg] -> Parser [Arg]
forall a b. (a -> b) -> a -> b
$ case [Arg]
next of
        [] -> [Arg]
selected

        [Arg]
otherwise -> 
          [Arg
in_sel Arg -> Arg -> Arg
`appendArg` Arg
suffix | 
            Arg
in_sel <- [Arg]
selected, Arg
suffix <- [Arg]
next]
   
    neutronP :: Parser [Arg]
    neutronP :: Parser [Arg]
neutronP = do
      Arg
selected <- Parser Arg
constantP Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Parser Arg
exoticAtomP Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
        [String] -> Parser Arg
dolarAritmeticExprP [String]
symbol_list Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
        [String] -> Parser Arg
oneArgFunctionsP [String]
symbol_list Parser Arg -> Parser Arg -> Parser Arg
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
        [String] -> Parser Arg
aggregateFunctionsP [String]
symbol_list

      [Arg]
next <- Parser [Arg]
nucleonP

      [Arg] -> Parser [Arg]
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return([Arg] -> Parser [Arg]) -> [Arg] -> Parser [Arg]
forall a b. (a -> b) -> a -> b
$ case [Arg]
next of
        [] -> [Arg
selected]

        [Arg]
otherwise -> do 
          [Arg
selected Arg -> Arg -> Arg
`appendArg` Arg
suffix | Arg
suffix <- [Arg]
next]
      
  
-- | The selector expression parser
selectorP :: [String] -> Parser [Arg]
selectorP :: [String] -> Parser [Arg]
selectorP [String]
symbol_list = do
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  [[Arg]]
ret <- Parser [Arg] -> ParsecT Text () Identity [[Arg]]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many1(Parser [Arg] -> ParsecT Text () Identity [[Arg]])
-> Parser [Arg] -> ParsecT Text () Identity [[Arg]]
forall a b. (a -> b) -> a -> b
$ Parser [Arg] -> Parser [Arg]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try(Parser [Arg] -> Parser [Arg]) -> Parser [Arg] -> Parser [Arg]
forall a b. (a -> b) -> a -> b
$ [String] -> Parser [Arg]
atomP [String]
symbol_list
  ParsecT Text () Identity Char -> ParsecT Text () Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany ParsecT Text () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
space
  [Arg] -> Parser [Arg]
forall a. a -> ParsecT Text () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return([Arg] -> Parser [Arg]) -> [Arg] -> Parser [Arg]
forall a b. (a -> b) -> a -> b
$ [[Arg]] -> [Arg]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Arg]]
ret