{-# 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)
import Phladiprelio.General.Datatype (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 -> ShowS
[Read0] -> ShowS
Read0 -> String
(Int -> Read0 -> ShowS)
-> (Read0 -> String) -> ([Read0] -> ShowS) -> Show Read0
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Read0 -> ShowS
showsPrec :: Int -> Read0 -> ShowS
$cshow :: Read0 -> String
show :: Read0 -> String
$cshowList :: [Read0] -> ShowS
showList :: [Read0] -> ShowS
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) -- ^ A special function to check whether the 'String' contains needed information. Must return 'True' for the 'String' that contains the needed for usual processment information, otherwise — 'False'.
  -> 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]
qqs [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (Double
xl Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
: (String -> Bool)
-> Double -> (String -> [Double]) -> [Read0] -> [Double]
readSimple3 String -> Bool
p Double
xl String -> [Double]
fConvA [Read0]
ts)
  where qs :: [Double]
qs 
          | String -> Bool
p String
xs = String -> [Double]
fConvA String
xs
          | Bool
otherwise = []
        (Double
ql, [Double]
qqs) 
          | [Double] -> Bool
forall a. [a] -> Bool
null [Double]
qs = (Double
0.0,[])
          | Bool
otherwise = let ([Double]
q1,[Double]
q2s) = Int -> [Double] -> ([Double], [Double])
forall a. Int -> [a] -> ([a], [a])
splitAtEnd Int
1 [Double]
qs in ([Double] -> Double
forall a. HasCallStack => [a] -> a
head [Double]
q1, [Double]
q2s)
        xl :: Double
xl = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
ql
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) -- ^ A special function to check whether the 'String' contains needed information. Must return 'True' for the 'String' that contains the needed for usual processment information, otherwise — 'False'.
 -> 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)

-- | Is a specialized version of 'Data.SubG.dropFromEndG' function variant from the @subG@ package. Is taken from there to
-- reduce the dependencies. Is not intended to be exported at all.
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) -- ^ A special function to check whether the 'String' contains needed information. Must return 'True' for the 'String' that contains the needed for usual processment information, otherwise — 'False'.
 -> (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 -> ShowS
forall a. Monoid a => a -> a -> a
`mappend` (if String -> Bool
forall a. [a] -> Bool
null String
ql then [] else Char
'='Char -> ShowS
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 #-}

-- | Is intended to be used in the "music" mode for PhLADiPreLiO.
readEq4G 
 :: (String -> Bool) -- ^ A special function to check whether the 'String' contains needed information. Must return 'True' for the 'String' that contains the needed for usual processment information, otherwise — 'False'.
 -> (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) -> ShowS -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> ShowS
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 -> ShowS
forall a. a -> [a] -> [a]
:((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'.') ShowS -> (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 -> ShowS
forall a. a -> [a] -> [a]
:((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'.') ShowS -> (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 #-}