{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Interpreter.StringConversion where
import Text.Read (readMaybe)
import Data.Maybe (fromJust,fromMaybe)
import Data.Char (isDigit,isAlpha)
import Data.List (sort,nub,(\\))
import Data.Monoid (mappend)
import Control.Exception
convStringInterpreter :: String -> String -> String
convStringInterpreter :: String -> String -> String
convStringInterpreter String
contrs String
xs
| String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
contrs = String
xs
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([String] -> Bool) -> (String -> [String]) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Bool) -> String -> Bool
forall a b. (a -> b) -> a -> b
$ String
xs = String
xs
| case (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (\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
y Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-') String
contrs of { Char
a:Char
'/':String
bs -> Char
a Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'/' Bool -> Bool -> Bool
&& Char
a Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'0' ; ~String
rrr -> Bool
False } =
let ys :: String
ys = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
y -> Char -> Bool
isDigit Char
y Bool -> Bool -> Bool
|| Char
y Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'/') String
contrs in
case String
ys of
~Char
a:Char
'/':String
bs -> let wordsN :: [String]
wordsN = String -> [String]
words String
xs
wordN :: Int
wordN = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
1 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe [Char
a]::Maybe Int)) ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
wordsN)
pos :: Int
pos = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
bs::Maybe Int)
wrdP :: String
wrdP = [String]
wordsN [String] -> Int -> String
forall a. [a] -> Int -> a
!! (Int
wordN Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
(String
ts,String
us) | Int
pos Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt Int
pos String
wrdP
| Bool
otherwise = Int -> String -> (String, String)
forall a. Int -> [a] -> ([a], [a])
splitAt (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
wrdP Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
pos) String
wrdP
twoWords :: String
twoWords = String
ts String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String
us)
([String]
wss,[String]
tss) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
wordN Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [String]
wordsN
kss :: [String]
kss = Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
drop Int
1 [String]
tss in
if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
wss then String
twoWords String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:[String] -> String
unwords [String]
kss)
else [String] -> String
unwords [String]
wss String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String
twoWords) String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` (Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:[String] -> String
unwords [String]
kss)
| String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (String -> String
forall a. Eq a => [a] -> [a]
nub (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
t -> Char
t Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'1' Bool -> Bool -> Bool
&& [Char
t] String -> String -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> String
forall a. Show a => a -> String
show ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
xs)) (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
contrs) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
2 = String
xs
| Bool
otherwise = let cntrs :: String
cntrs = String -> String
forall a. Eq a => [a] -> [a]
nub (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (\Char
t -> Char
t Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
'1' Bool -> Bool -> Bool
&& [Char
t] String -> String -> Bool
forall a. Ord a => a -> a -> Bool
<= Int -> String
forall a. Show a => a -> String
show ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> Int) -> (String -> [String]) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
xs)) (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
contrs
tss :: [String]
tss = String -> [String]
words String
xs in
case String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
cntrs of
Int
2 -> let pos :: Int
pos = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
1 String
cntrs)::Maybe Int)
number :: Int
number = Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 String
cntrs)::Maybe Int)
([String]
zss,[String]
yss) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [String]
tss
([String]
kss,[String]
lss) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
number [String]
yss in
if [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
tss Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
pos Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
number Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 then String
xs
else if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
zss then [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
kss String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
" " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` [String] -> String
unwords [String]
lss
else [String] -> String
unwords [String]
zss String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
" " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
kss String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
" " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` [String] -> String
unwords [String]
lss
Int
_ -> let idxs :: [Int]
idxs = (Char -> Int) -> String -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\Char
x -> Maybe Int -> Int
forall a. HasCallStack => Maybe a -> a
fromJust (String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe [Char
x]::Maybe Int)) (String -> [Int]) -> String -> [Int]
forall a b. (a -> b) -> a -> b
$ String
cntrs
wordsN :: [String]
wordsN = (Int -> String) -> [Int] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> [String]
tss [String] -> Int -> String
forall a. [a] -> Int -> a
!! (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)) [Int]
idxs
restWords :: [String]
restWords = [String]
tss [String] -> [String] -> [String]
forall a. Eq a => [a] -> [a] -> [a]
\\ [String]
wordsN
in [String] -> String
unwords [String]
restWords String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
" " String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
wordsN
readFileIfAny :: FilePath -> IO String
readFileIfAny :: String -> IO String
readFileIfAny String
file = IO String -> (IOException -> IO String) -> IO String
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch (String -> IO String
readFile String
file) (\(IOException
e :: IOException) -> String -> IO String
forall (m :: * -> *) a. Monad m => a -> m a
return String
"")
mightBePLWord :: String -> Bool
mightBePLWord :: String -> Bool
mightBePLWord String
xs
| String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ((Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isAlpha) String
us) = Bool -> Bool
not (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
ts)
| Bool
otherwise = Bool
False
where (String
ts,String
us) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isAlpha String
xs
{-# INLINE mightBePLWord #-}
argsConvertTextual :: String -> [String] -> [String]
argsConvertTextual :: String -> [String] -> [String]
argsConvertTextual String
ts [String]
tss
| (String -> Bool) -> [String] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
ts) [String]
tss = [String]
tss
| Bool
otherwise = [String]
tss [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` [String
ts]
{-# INLINE argsConvertTextual #-}
fullArgsConvertTextual :: String -> String -> [String] -> [String]
fullArgsConvertTextual :: String -> String -> [String] -> [String]
fullArgsConvertTextual String
textProcessment0 String
lineA [String]
args =
String -> [String] -> [String]
argsConvertTextual String
textProcessment0 ((String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
mightBePLWord) [String]
args [String] -> [String] -> [String]
forall a. Monoid a => a -> a -> a
`mappend` String -> [String]
words String
lineA)
{-# INLINE fullArgsConvertTextual #-}