{-# OPTIONS_GHC -funbox-strict-fields #-}
{-# LANGUAGE NoImplicitPrelude, BangPatterns #-}

module Phladiprelio.General.Datatype where

import GHC.Base
import GHC.List
import Data.List (groupBy)
import Data.Char (isDigit, isSpace)
import Text.Read (readMaybe)
import Text.Show (Show(..))
import GHC.Num ((*))
import Data.Maybe (fromMaybe)
import Data.Tuple (snd)

data Phladiprelio t a b = Phl {
  forall (t :: * -> *) a b. Phladiprelio t a b -> t a
inputData :: t a,
  forall (t :: * -> *) a b. Phladiprelio t a b -> t a -> t b
convF :: t a -> t b
}

-- | Universal data, can be used e. g. for phladiprelio-general series of packages.
data BasicLan a = L1 !a | L2 !Double deriving (BasicLan a -> BasicLan a -> Bool
(BasicLan a -> BasicLan a -> Bool)
-> (BasicLan a -> BasicLan a -> Bool) -> Eq (BasicLan a)
forall a. Eq a => BasicLan a -> BasicLan a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => BasicLan a -> BasicLan a -> Bool
== :: BasicLan a -> BasicLan a -> Bool
$c/= :: forall a. Eq a => BasicLan a -> BasicLan a -> Bool
/= :: BasicLan a -> BasicLan a -> Bool
Eq, Eq (BasicLan a)
Eq (BasicLan a) =>
(BasicLan a -> BasicLan a -> Ordering)
-> (BasicLan a -> BasicLan a -> Bool)
-> (BasicLan a -> BasicLan a -> Bool)
-> (BasicLan a -> BasicLan a -> Bool)
-> (BasicLan a -> BasicLan a -> Bool)
-> (BasicLan a -> BasicLan a -> BasicLan a)
-> (BasicLan a -> BasicLan a -> BasicLan a)
-> Ord (BasicLan a)
BasicLan a -> BasicLan a -> Bool
BasicLan a -> BasicLan a -> Ordering
BasicLan a -> BasicLan a -> BasicLan a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (BasicLan a)
forall a. Ord a => BasicLan a -> BasicLan a -> Bool
forall a. Ord a => BasicLan a -> BasicLan a -> Ordering
forall a. Ord a => BasicLan a -> BasicLan a -> BasicLan a
$ccompare :: forall a. Ord a => BasicLan a -> BasicLan a -> Ordering
compare :: BasicLan a -> BasicLan a -> Ordering
$c< :: forall a. Ord a => BasicLan a -> BasicLan a -> Bool
< :: BasicLan a -> BasicLan a -> Bool
$c<= :: forall a. Ord a => BasicLan a -> BasicLan a -> Bool
<= :: BasicLan a -> BasicLan a -> Bool
$c> :: forall a. Ord a => BasicLan a -> BasicLan a -> Bool
> :: BasicLan a -> BasicLan a -> Bool
$c>= :: forall a. Ord a => BasicLan a -> BasicLan a -> Bool
>= :: BasicLan a -> BasicLan a -> Bool
$cmax :: forall a. Ord a => BasicLan a -> BasicLan a -> BasicLan a
max :: BasicLan a -> BasicLan a -> BasicLan a
$cmin :: forall a. Ord a => BasicLan a -> BasicLan a -> BasicLan a
min :: BasicLan a -> BasicLan a -> BasicLan a
Ord)

-- | Specific for Ukranian data type for phladiprelio-ukrainian series of packages.
data BasicUkr = U1 {-# UNPACK #-} !Char | U2 !Double deriving (BasicUkr -> BasicUkr -> Bool
(BasicUkr -> BasicUkr -> Bool)
-> (BasicUkr -> BasicUkr -> Bool) -> Eq BasicUkr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BasicUkr -> BasicUkr -> Bool
== :: BasicUkr -> BasicUkr -> Bool
$c/= :: BasicUkr -> BasicUkr -> Bool
/= :: BasicUkr -> BasicUkr -> Bool
Eq, Eq BasicUkr
Eq BasicUkr =>
(BasicUkr -> BasicUkr -> Ordering)
-> (BasicUkr -> BasicUkr -> Bool)
-> (BasicUkr -> BasicUkr -> Bool)
-> (BasicUkr -> BasicUkr -> Bool)
-> (BasicUkr -> BasicUkr -> Bool)
-> (BasicUkr -> BasicUkr -> BasicUkr)
-> (BasicUkr -> BasicUkr -> BasicUkr)
-> Ord BasicUkr
BasicUkr -> BasicUkr -> Bool
BasicUkr -> BasicUkr -> Ordering
BasicUkr -> BasicUkr -> BasicUkr
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BasicUkr -> BasicUkr -> Ordering
compare :: BasicUkr -> BasicUkr -> Ordering
$c< :: BasicUkr -> BasicUkr -> Bool
< :: BasicUkr -> BasicUkr -> Bool
$c<= :: BasicUkr -> BasicUkr -> Bool
<= :: BasicUkr -> BasicUkr -> Bool
$c> :: BasicUkr -> BasicUkr -> Bool
> :: BasicUkr -> BasicUkr -> Bool
$c>= :: BasicUkr -> BasicUkr -> Bool
>= :: BasicUkr -> BasicUkr -> Bool
$cmax :: BasicUkr -> BasicUkr -> BasicUkr
max :: BasicUkr -> BasicUkr -> BasicUkr
$cmin :: BasicUkr -> BasicUkr -> BasicUkr
min :: BasicUkr -> BasicUkr -> BasicUkr
Ord)

readBasic0 
 :: Double
 -> (String -> [a])
 -> ([a] -> [Double])
 -> String 
 -> [Double]
readBasic0 :: forall a.
Double
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasic0 = (String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
forall a.
(String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
readBasic0G (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))

readBasic :: (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasic = Double
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
forall a.
Double
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasic0 Double
1.0
{-# INLINE readBasic #-}

readBasic0G 
 :: (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 -> [a])
 -> ([a] -> [Double])
 -> String 
 -> [Double]
readBasic0G :: forall a.
(String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
readBasic0G String -> Bool
p Double
temp String -> [a]
fConvA [a] -> [Double]
fConvD xs :: String
xs@(Char
'_':String
ys) = (String -> Double
readU2 String
ws Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
temp) Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
: (String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
forall a.
(String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
readBasic0G String -> Bool
p Double
temp String -> [a]
fConvA [a] -> [Double]
fConvD String
qs
   where (String
ws, String
qs) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isDigit String
ys
readBasic0G String -> Bool
p Double
temp String -> [a]
fConvA [a] -> [Double]
fConvD xs :: String
xs@(Char
_:String
_) 
 | String -> Bool
forall a. [a] -> Bool
null String
us = [Double]
dc
 | Bool
otherwise = [Double]
dc [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` ((String -> Double
readU2 String
ws Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
d) Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
: (String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
forall a.
(String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
readBasic0G String -> Bool
p Double
d String -> [a]
fConvA [a] -> [Double]
fConvD String
qs)
   where (String
ts, String
us) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_') String
xs
         dc :: [Double]
dc 
           | String -> Bool
forall a. [a] -> Bool
null String
ts Bool -> Bool -> Bool
|| Bool -> Bool
not (String -> Bool
p String
ts) = [Double
temp]
           | Bool
otherwise = [a] -> [Double]
fConvD ([a] -> [Double]) -> (String -> [a]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [a]
fConvA (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
ts
         d :: Double
d = [Double] -> Double
forall a. HasCallStack => [a] -> a
last [Double]
dc
         vs :: String
vs = Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
us
         (String
ws, String
qs) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isDigit String
vs
readBasic0G String -> Bool
_ Double
_ String -> [a]
_ [a] -> [Double]
_ String
_ = []

readBasicG :: (String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasicG String -> Bool
p = (String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
forall a.
(String -> Bool)
-> Double
-> (String -> [a])
-> ([a] -> [Double])
-> String
-> [Double]
readBasic0G String -> Bool
p Double
1.0
{-# INLINE readBasicG #-}

readHead
 :: (String -> [a])
 -> ([a] -> [Double])
 -> String 
 -> Double
readHead :: forall a. (String -> [a]) -> ([a] -> [Double]) -> String -> Double
readHead String -> [a]
fConvA [a] -> [Double]
fConvD String
xs = Double
h  
   where hs :: [Double]
hs = [a] -> [Double]
fConvD ([a] -> [Double]) -> (String -> [a]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [a]
fConvA (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
xs
         h :: Double
h 
           | [Double] -> Bool
forall a. [a] -> Bool
null [Double]
hs = Double
1.0
           | Bool
otherwise = [Double] -> Double
forall a. HasCallStack => [a] -> a
head [Double]
hs

splF :: String -> [String]
splF js :: String
js@(Char
_:String
_) 
  = case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_') String
js of
      (~String
is,[]) -> []
      ~(String
is, String
rs) -> let (String
bs, String
ds) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isDigit String
rs in String
bs String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
splF String
ds
splF [] = []

data Read2 = D [Double] | S [Char] deriving (Read2 -> Read2 -> Bool
(Read2 -> Read2 -> Bool) -> (Read2 -> Read2 -> Bool) -> Eq Read2
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Read2 -> Read2 -> Bool
== :: Read2 -> Read2 -> Bool
$c/= :: Read2 -> Read2 -> Bool
/= :: Read2 -> Read2 -> Bool
Eq, Int -> Read2 -> String -> String
[Read2] -> String -> String
Read2 -> String
(Int -> Read2 -> String -> String)
-> (Read2 -> String) -> ([Read2] -> String -> String) -> Show Read2
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> Read2 -> String -> String
showsPrec :: Int -> Read2 -> String -> String
$cshow :: Read2 -> String
show :: Read2 -> String
$cshowList :: [Read2] -> String -> String
showList :: [Read2] -> String -> String
Show)

readBasic1G 
 :: String 
 -> [Read2]
readBasic1G :: String -> [Read2]
readBasic1G String
xs = [Read2]
xss
   where f :: String -> Read2
f xs :: String
xs@(Char
'_':String
ys) = [Double] -> Read2
D ((String -> Double) -> [String] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map String -> Double
readU2 ([String] -> [Double])
-> (String -> [String]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
splF (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
ys)
         f String
xs = String -> Read2
S String
xs
         xss :: [Read2]
xss = (String -> Read2) -> [String] -> [Read2]
forall a b. (a -> b) -> [a] -> [b]
map String -> Read2
f ([String] -> [Read2]) -> (String -> [String]) -> String -> [Read2]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char -> Bool) -> String -> [String]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy (\Char
x Char
y -> (Char -> Bool
isDigit Char
y Bool -> Bool -> Bool
|| Char
y Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_') Bool -> Bool -> Bool
&& (Char -> Bool
isDigit Char
x Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_') Bool -> Bool -> Bool
|| Bool -> Bool
not ([Bool] -> Bool
or [Char -> Bool
isDigit Char
x, Char -> Bool
isDigit Char
y, Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_', Char
y Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_'])) (String -> [Read2]) -> String -> [Read2]
forall a b. (a -> b) -> a -> b
$ String
xs

showDoubleAsInsert :: Double -> String
showDoubleAsInsert :: Double -> String
showDoubleAsInsert Double
d
  | Double
d Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0 = []
  | Bool
otherwise = 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
d)
{-# INLINE showDoubleAsInsert #-}

readBasic2G 
 :: (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 -> [a])
 -> ([a] -> [Double])
 -> [Read2]
 -> [Double]
readBasic2G :: forall a.
(String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
readBasic2G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD xs :: [Read2]
xs@(D [Double]
ys:S String
t:[Read2]
ts) = (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
h) [Double]
ys [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
forall a.
(String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
readBasic2G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD (String -> Read2
S String
tRead2 -> [Read2] -> [Read2]
forall a. a -> [a] -> [a]
:[Read2]
ts)
   where h :: Double
h = (String -> [a]) -> ([a] -> [Double]) -> String -> Double
forall a. (String -> [a]) -> ([a] -> [Double]) -> String -> Double
readHead String -> [a]
fConvA [a] -> [Double]
fConvD String
t
readBasic2G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD xs :: [Read2]
xs@(S String
ys:D [Double]
ts:[Read2]
ks) = [Double]
dc [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (Double -> Double) -> [Double] -> [Double]
forall a b. (a -> b) -> [a] -> [b]
map (Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
l) [Double]
ts [Double] -> [Double] -> [Double]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
forall a.
(String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
readBasic2G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD [Read2]
ks
   where dc :: [Double]
dc = [a] -> [Double]
fConvD ([a] -> [Double]) -> (String -> [a]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [a]
fConvA (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
ys
         l :: Double
l = [Double] -> Double
forall a. HasCallStack => [a] -> a
last [Double]
dc
readBasic2G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD [S String
ys] = [a] -> [Double]
fConvD ([a] -> [Double]) -> (String -> [a]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [a]
fConvA (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
ys
readBasic2G String -> Bool
_ String -> [a]
_ [a] -> [Double]
_ [Read2]
_ = []

readBasic3G :: (String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasic3G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD = (String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
forall a.
(String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> [Read2] -> [Double]
readBasic2G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD ([Read2] -> [Double]) -> (String -> [Read2]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.  String -> [Read2]
readBasic1G
{-# INLINABLE readBasic3G #-}

readBasic3 :: (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasic3 = (String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
forall {a}.
(String -> Bool)
-> (String -> [a]) -> ([a] -> [Double]) -> String -> [Double]
readBasic3G (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))
{-# INLINABLE readBasic3 #-}

-- | Is intended to be used in the "music" mode for PhLADiPreLiO.
readBasic4G 
 :: (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 -> [a])
 -> ([a] -> [Double])
 -> (String -> [b])
 -> ([b] -> [String])
 -> [Read2]
 -> [(String, Double)]
readBasic4G :: forall a b.
(String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
readBasic4G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD String -> [b]
gConvB [b] -> [String]
gConvS xs :: [Read2]
xs@(D [Double]
ys:S String
t:[Read2]
ts) = (Double -> (String, Double)) -> [Double] -> [(String, Double)]
forall a b. (a -> b) -> [a] -> [b]
map (\Double
y -> (Double -> String
showDoubleAsInsert Double
y, Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
h)) [Double]
ys [(String, Double)] -> [(String, Double)] -> [(String, Double)]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
forall a b.
(String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
readBasic4G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD String -> [b]
gConvB [b] -> [String]
gConvS (String -> Read2
S String
tRead2 -> [Read2] -> [Read2]
forall a. a -> [a] -> [a]
:[Read2]
ts)
   where h :: Double
h = (String -> [a]) -> ([a] -> [Double]) -> String -> Double
forall a. (String -> [a]) -> ([a] -> [Double]) -> String -> Double
readHead String -> [a]
fConvA [a] -> [Double]
fConvD String
t
readBasic4G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD String -> [b]
gConvB [b] -> [String]
gConvS xs :: [Read2]
xs@(S String
ys:D [Double]
ts:[Read2]
ks) = [(String, Double)]
dc [(String, Double)] -> [(String, Double)] -> [(String, Double)]
forall a. Monoid a => a -> a -> a
`mappend` (Double -> (String, Double)) -> [Double] -> [(String, Double)]
forall a b. (a -> b) -> [a] -> [b]
map (\Double
y -> (Double -> String
showDoubleAsInsert Double
y, Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
l)) [Double]
ts [(String, Double)] -> [(String, Double)] -> [(String, Double)]
forall a. Monoid a => a -> a -> a
`mappend` (String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
forall a b.
(String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
readBasic4G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD String -> [b]
gConvB [b] -> [String]
gConvS [Read2]
ks
   where dc :: [(String, Double)]
dc =  [String] -> [Double] -> [(String, Double)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([b] -> [String]
gConvS ([b] -> [String]) -> (String -> [b]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [b]
gConvB (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ String
ys) ([a] -> [Double]
fConvD ([a] -> [Double]) -> (String -> [a]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [a]
fConvA (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
ys)
         dl :: (String, Double)
dl = [(String, Double)] -> (String, Double)
forall a. HasCallStack => [a] -> a
last [(String, Double)]
dc
         l :: Double
l = (String, Double) -> Double
forall a b. (a, b) -> b
snd (String, Double)
dl
readBasic4G String -> Bool
p String -> [a]
fConvA [a] -> [Double]
fConvD String -> [b]
gConvB [b] -> [String]
gConvS [S String
ys] = [String] -> [Double] -> [(String, Double)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([b] -> [String]
gConvS ([b] -> [String]) -> (String -> [b]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [b]
gConvB (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ String
ys) ([a] -> [Double]
fConvD ([a] -> [Double]) -> (String -> [a]) -> String -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [a]
fConvA (String -> [Double]) -> String -> [Double]
forall a b. (a -> b) -> a -> b
$ String
ys)
readBasic4G String -> Bool
_ String -> [a]
_ [a] -> [Double]
_ String -> [b]
_ [b] -> [String]
_ [Read2]
_ = []

readBasic4 :: (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
readBasic4 = (String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
forall a b.
(String -> Bool)
-> (String -> [a])
-> ([a] -> [Double])
-> (String -> [b])
-> ([b] -> [String])
-> [Read2]
-> [(String, Double)]
readBasic4G (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 readBasic4 #-}

-- | Is a way to read duration of the additional added time period into the line.
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
{-# INLINABLE readU2 #-}

-- | Is a way to read duration of the additional added time period into the line.
readU3 :: Double -> String -> Double
readU3 :: Double -> String -> Double
readU3 Double
def xs :: String
xs@(Char
y:String
ys) = Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
def (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)
readU3 Double
def String
_ = Double
def
{-# INLINABLE readU3 #-}