{-# OPTIONS_GHC -funbox-strict-fields #-}
{-# LANGUAGE NoImplicitPrelude, BangPatterns #-}
module Phladiprelio.General.Datatype3 (
Read0
, isA
, isB
, isC
, readSimple3
, basicSplit
, line2Strings
, read3
, readEq4G
, readEq4
) where
import GHC.Base
import GHC.List
import Data.List (groupBy)
import Data.Char (isDigit, isSpace,isLetter)
import Text.Read (readMaybe)
import Text.Show (Show(..))
import GHC.Num ((*),(+))
import Data.Maybe (fromMaybe)
import Data.Tuple (snd)
readU2 :: String -> Double
readU2 :: String -> Double
readU2 xs :: String
xs@(Char
y:String
ys) = Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
1.0 (String -> Maybe Double
forall a. Read a => String -> Maybe a
readMaybe (Char
yChar -> String -> String
forall a. a -> [a] -> [a]
:Char
'.'Char -> String -> String
forall a. a -> [a] -> [a]
:(if String -> Bool
forall a. [a] -> Bool
null String
ys then String
"0" else String
ys))::Maybe Double)
readU2 String
_ = Double
1.0
{-# INLINE readU2 #-}
splitL0 :: String -> [String]
splitL0 :: String -> [String]
splitL0 = (Char -> Char -> Bool) -> String -> [String]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy (\Char
x Char
y -> (Char -> Bool
isDigit Char
x Bool -> Bool -> Bool
&& Char -> Bool
isDigit Char
y) Bool -> Bool -> Bool
|| (Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'_' Bool -> Bool -> Bool
&& Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'=' Bool -> Bool -> Bool
&& Bool -> Bool
not (Char -> Bool
isDigit Char
x) Bool -> Bool -> Bool
&& Char
y Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'_' Bool -> Bool -> Bool
&& Char
y Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'=' Bool -> Bool -> Bool
&& Bool -> Bool
not (Char -> Bool
isDigit Char
y)) Bool -> Bool -> Bool
|| ((Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'=' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_') Bool -> Bool -> Bool
&& Char -> Bool
isDigit Char
y))
{-# INLINE splitL0 #-}
data Read0 = A {-# UNPACK #-} !Double | B {-# UNPACK #-} !Double | C String deriving (Read0 -> Read0 -> Bool
(Read0 -> Read0 -> Bool) -> (Read0 -> Read0 -> Bool) -> Eq Read0
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Read0 -> Read0 -> Bool
== :: Read0 -> Read0 -> Bool
$c/= :: Read0 -> Read0 -> Bool
/= :: Read0 -> Read0 -> Bool
Eq, Int -> Read0 -> String -> String
[Read0] -> String -> String
Read0 -> String
(Int -> Read0 -> String -> String)
-> (Read0 -> String) -> ([Read0] -> String -> String) -> Show Read0
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> Read0 -> String -> String
showsPrec :: Int -> Read0 -> String -> String
$cshow :: Read0 -> String
show :: Read0 -> String
$cshowList :: [Read0] -> String -> String
showList :: [Read0] -> String -> String
Show)
reRead3 :: String -> Read0
reRead3 :: String -> Read0
reRead3 String
xs =
case Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 String
xs of
(String
"=",String
ts) -> Double -> Read0
A (String -> Double
readU2 String
ts)
(String
"_",String
ts) -> Double -> Read0
B (String -> Double
readU2 String
ts)
(String, String)
_ -> String -> Read0
C String
xs
isA :: Read0 -> Bool
isA :: Read0 -> Bool
isA (A Double
_) = Bool
True
isA Read0
_ = Bool
False
isB :: Read0 -> Bool
isB :: Read0 -> Bool
isB (B Double
_) = Bool
True
isB Read0
_ = Bool
False
isC :: Read0 -> Bool
isC :: Read0 -> Bool
isC (C String
_) = Bool
True
isC Read0
_ = Bool
False
filterReads :: [Read0] -> [Read0]
filterReads :: [Read0] -> [Read0]
filterReads xs :: [Read0]
xs@(B Double
y:A Double
t:[Read0]
us) = Double -> Read0
B Double
y Read0 -> [Read0] -> [Read0]
forall a. a -> [a] -> [a]
: [Read0] -> [Read0]
filterReads ((Read0 -> Bool) -> [Read0] -> [Read0]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Read0 -> Bool
isA [Read0]
us)
filterReads xs :: [Read0]
xs@(A Double
y:A Double
t:[Read0]
us) = Double -> Read0
A Double
y Read0 -> [Read0] -> [Read0]
forall a. a -> [a] -> [a]
: [Read0] -> [Read0]
filterReads ((Read0 -> Bool) -> [Read0] -> [Read0]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Read0 -> Bool
isA [Read0]
us)
filterReads xs :: [Read0]
xs@(Read0
t:[Read0]
ts) = Read0
tRead0 -> [Read0] -> [Read0]
forall a. a -> [a] -> [a]
:[Read0] -> [Read0]
filterReads [Read0]
ts
filterReads [Read0]
_ = []
basicSplit :: String -> [Read0]
basicSplit :: String -> [Read0]
basicSplit = [Read0] -> [Read0]
filterReads ([Read0] -> [Read0]) -> (String -> [Read0]) -> String -> [Read0]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Read0) -> [String] -> [Read0]
forall a b. (a -> b) -> [a] -> [b]
map String -> Read0
reRead3 ([String] -> [Read0]) -> (String -> [String]) -> String -> [Read0]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
splitL0
{-# INLINE basicSplit #-}
readSimple3
:: (String -> Bool)
-> Double
-> (String -> [Double])
-> [Read0]
-> [Double]
readSimple3 :: (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA rs :: [Read0]
rs@(C String
xs:A Double
x:[Read0]
ts)
| [Double] -> Bool
forall a. [a] -> Bool
null [Double]
qs = (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA [Read0]
ts
| [Double] -> Bool
forall a. [a] -> Bool
null [Double]
q1 = Double
xl1 Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
: (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
xl1 String -> [Double]
fConvA [Read0]
ts
| Bool
otherwise = [Double]
q1 [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (Double
xl1 Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
: (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
xl1 String -> [Double]
fConvA [Read0]
ts)
where qs :: [Double]
qs
| String -> Bool
p String
xs = String -> [Double]
fConvA String
xs
| Bool
otherwise = []
([Double]
q1,[Double]
q2s) = Int -> [Double] -> ([Double], [Double])
forall a. Int -> [a] -> ([a], [a])
splitAtEnd Int
1 [Double]
qs
ql1 :: Double
ql1 = [Double] -> Double
forall a. HasCallStack => [a] -> a
head [Double]
q2s
xl1 :: Double
xl1=Double
xDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
ql1
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA rs :: [Read0]
rs@(C String
xs:ys :: [Read0]
ys@(B Double
x:[Read0]
ts)) = [Double]
qs [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` [Double]
qqs [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
ql String -> [Double]
fConvA [Read0]
ws
where ([Read0]
ks, [Read0]
ws) = (Read0 -> Bool) -> [Read0] -> ([Read0], [Read0])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Read0 -> Bool
isB [Read0]
ys
qs :: [Double]
qs
| String -> Bool
p String
xs = String -> [Double]
fConvA String
xs
| Bool
otherwise = []
ql :: Double
ql
| [Double] -> Bool
forall a. [a] -> Bool
null [Double]
qs = Double
0.0
| Bool
otherwise = [Double] -> Double
forall a. HasCallStack => [a] -> a
last [Double]
qs
qqs :: [Double]
qqs = (Read0 -> Double) -> [Read0] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (\(B Double
k) -> Double
k Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
ql) [Read0]
ks
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA rs :: [Read0]
rs@(B Double
x:[Read0]
ts) = [Double]
qqs [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA [Read0]
ws
where ([Read0]
ks, [Read0]
ws) = (Read0 -> Bool) -> [Read0] -> ([Read0], [Read0])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Read0 -> Bool
isB [Read0]
rs
qqs :: [Double]
qqs = (Read0 -> Double) -> [Read0] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (\(B Double
k) -> Double
k Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
temp) [Read0]
ks
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA [C String
xs] = [Double]
qs
where qs :: [Double]
qs
| String -> Bool
p String
xs = String -> [Double]
fConvA String
xs
| Bool
otherwise = []
readSimple3 String -> Bool
_ Double
_ String -> [Double]
_ [Read0]
_ = []
{-# INLiNABLE readSimple3 #-}
read3
:: (String -> Bool)
-> Double
-> (String -> [Double])
-> String
-> [Double]
read3 :: (String -> Bool)
-> Double -> (String -> [Double]) -> String -> [Double]
read3 String -> Bool
p Double
temp String -> [Double]
fConvA = (Double -> Bool) -> [Double] -> [Double]
forall a. (a -> Bool) -> [a] -> [a]
filter (Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
/= Double
0.0) ([Double] -> [Double])
-> (String -> [Double]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
temp String -> [Double]
fConvA ([Read0] -> [Double]) -> (String -> [Read0]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [Read0]
basicSplit
{-# INLINE read3 #-}
splitAtEnd :: Int -> [a] -> ([a], [a])
splitAtEnd :: forall a. Int -> [a] -> ([a], [a])
splitAtEnd Int
n = (\([a]
x,[a]
y,Int
_,Int
_) -> ([a]
y,[a]
x)) (([a], [a], Int, Int) -> ([a], [a]))
-> ([a] -> ([a], [a], Int, Int)) -> [a] -> ([a], [a])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> ([a], [a], Int, Int) -> ([a], [a], Int, Int))
-> ([a], [a], Int, Int) -> [a] -> ([a], [a], Int, Int)
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr a -> ([a], [a], Int, Int) -> ([a], [a], Int, Int)
forall {d} {a}.
(Ord d, Num d) =>
a -> ([a], [a], d, d) -> ([a], [a], d, d)
f ([a], [a], Int, Int)
forall {a} {a}. ([a], [a], Int, Int)
v
where v :: ([a], [a], Int, Int)
v = ([],[],Int
0,Int
n)
f :: a -> ([a], [a], d, d) -> ([a], [a], d, d)
f a
x ([a]
zs,[a]
ts,d
k,d
n)
| d
k d -> d -> Bool
forall a. Ord a => a -> a -> Bool
< d
n = (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
zs,[],d
k d -> d -> d
forall a. Num a => a -> a -> a
+ d
1,d
n)
| Bool
otherwise = ([a]
zs,a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ts,d
k d -> d -> d
forall a. Num a => a -> a -> a
+ d
1,d
n)
dropFromEnd :: Int -> [a] -> [a]
dropFromEnd :: forall a. Int -> [a] -> [a]
dropFromEnd Int
n = (\([a]
xs,Int
_,Int
_) -> [a]
xs) (([a], Int, Int) -> [a]) -> ([a] -> ([a], Int, Int)) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> ([a], Int, Int) -> ([a], Int, Int))
-> ([a], Int, Int) -> [a] -> ([a], Int, Int)
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr a -> ([a], Int, Int) -> ([a], Int, Int)
forall {c} {a}. (Ord c, Num c) => a -> ([a], c, c) -> ([a], c, c)
f ([a], Int, Int)
forall {a}. ([a], Int, Int)
v
where v :: ([a], Int, Int)
v = ([],Int
0,Int
n)
f :: a -> ([a], c, c) -> ([a], c, c)
f a
x ([a]
zs,c
k,c
n)
| c
k c -> c -> Bool
forall a. Ord a => a -> a -> Bool
< c
n = ([],c
k c -> c -> c
forall a. Num a => a -> a -> a
+ c
1,c
n)
| Bool
otherwise = (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
zs,c
k,c
n)
line2Strings
:: (String -> Bool)
-> (String -> [String])
-> [Read0]
-> [String]
line2Strings :: (String -> Bool) -> (String -> [String]) -> [Read0] -> [String]
line2Strings String -> Bool
p String -> [String]
gConvC xs :: [Read0]
xs@(C String
ts:tt :: Read0
tt@(A Double
x):[Read0]
ys) = [String]
ks [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` ((String
ql String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (if String -> Bool
forall a. [a] -> Bool
null String
ql then [] else Char
'='Char -> String -> String
forall a. a -> [a] -> [a]
:Read0 -> String
showRead0AsInsert Read0
tt)) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> Bool) -> (String -> [String]) -> [Read0] -> [String]
line2Strings String -> Bool
p String -> [String]
gConvC [Read0]
ys)
where ([String]
ks, [String]
qs)
| String -> Bool
p String
ts = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAtEnd Int
1 ([String] -> ([String], [String]))
-> (String -> [String]) -> String -> ([String], [String])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
gConvC (String -> ([String], [String])) -> String -> ([String], [String])
forall a b. (a -> b) -> a -> b
$ String
ts
| Bool
otherwise = ([],[])
ql :: String
ql
| [String] -> Bool
forall a. [a] -> Bool
null [String]
qs = []
| Bool
otherwise = [String] -> String
forall a. HasCallStack => [a] -> a
head [String]
qs
line2Strings String -> Bool
p String -> [String]
gConvC xs :: [Read0]
xs@(C String
ys:[Read0]
ts) = String -> [String]
gConvC String
ys [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool) -> (String -> [String]) -> [Read0] -> [String]
line2Strings String -> Bool
p String -> [String]
gConvC [Read0]
ts
line2Strings String -> Bool
p String -> [String]
gConvC xs :: [Read0]
xs@(y :: Read0
y@(B Double
x):[Read0]
ts) = Read0 -> String
showRead0AsInsert Read0
y String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> Bool) -> (String -> [String]) -> [Read0] -> [String]
line2Strings String -> Bool
p String -> [String]
gConvC [Read0]
ts
line2Strings String -> Bool
_ String -> [String]
_ [Read0]
_ = []
{-# INLINABLE line2Strings #-}
readEq4G
:: (String -> Bool)
-> (String -> [Double])
-> (String -> [String])
-> [Read0]
-> [(String, Double)]
readEq4G :: (String -> Bool)
-> (String -> [Double])
-> (String -> [String])
-> [Read0]
-> [(String, Double)]
readEq4G String -> Bool
p String -> [Double]
fConvA String -> [String]
gConvC [Read0]
xs = [String] -> [Double] -> [(String, Double)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
ks [Double]
rs
where ks :: [String]
ks = (String -> Bool) -> (String -> [String]) -> [Read0] -> [String]
line2Strings String -> Bool
p String -> [String]
gConvC [Read0]
xs
rs :: [Double]
rs = (Double -> Bool) -> [Double] -> [Double]
forall a. (a -> Bool) -> [a] -> [a]
filter (Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
/= Double
0.0) ([Double] -> [Double])
-> ([Read0] -> [Double]) -> [Read0] -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
1.0 String -> [Double]
fConvA ([Read0] -> [Double]) -> [Read0] -> [Double]
forall a b. (a -> b) -> a -> b
$ [Read0]
xs
{-# INLINABLE readEq4G #-}
readEq4
:: (String -> [Double])
-> (String -> [String])
-> [Read0]
-> [(String, Double)]
readEq4 :: (String -> [Double])
-> (String -> [String]) -> [Read0] -> [(String, Double)]
readEq4 = (String -> Bool)
-> (String -> [Double])
-> (String -> [String])
-> [Read0]
-> [(String, Double)]
readEq4G (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall a. [a] -> Bool
null (String -> Bool) -> (String -> String) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isSpace))
{-# INLINE readEq4 #-}
showRead0AsInsert :: Read0 -> String
showRead0AsInsert :: Read0 -> String
showRead0AsInsert d :: Read0
d@(A Double
t) = Char
'='Char -> String -> String
forall a. a -> [a] -> [a]
:((Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'.') (String -> String) -> (Double -> String) -> Double -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> String
forall a. Show a => a -> String
show (Double -> String) -> Double -> String
forall a b. (a -> b) -> a -> b
$ Double
t)
showRead0AsInsert d :: Read0
d@(B Double
t) = Char
'_'Char -> String -> String
forall a. a -> [a] -> [a]
:((Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'.') (String -> String) -> (Double -> String) -> Double -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> String
forall a. Show a => a -> String
show (Double -> String) -> Double -> String
forall a b. (a -> b) -> a -> b
$ Double
t)
showRead0AsInsert d :: Read0
d@(C String
ts) = String
ts
{-# INLINE showRead0AsInsert #-}