{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE MultiWayIf, NoImplicitPrelude #-}
module Phladiprelio.General.PrepareText (
Concatenations
, concatWordsFromLeftToRight
, splitLines
, splitLinesN
, isSpC
, sort2Concat
, prepareText
, prepareTextN
, growLinesN
, prepareGrowTextMN
, tuneLinesN
, prepareTuneTextMN
, isPLL
) where
import GHC.Base
import Data.List
import Data.Bits (shiftR)
import GHC.Num ((+),(-),abs)
import CaseBi.Arr (getBFstL',getBFst')
import Data.List.InnToOut.Basic (mapI)
import Data.Char (isAlpha,toLower)
import GHC.Arr
import Data.Tuple (fst)
type Concatenations = [[String]]
type ConcatenationsArr = [Array Int (String,Bool)]
defaultConversion :: Concatenations -> ConcatenationsArr
defaultConversion :: Concatenations -> ConcatenationsArr
defaultConversion Concatenations
ysss = forall a b. (a -> b) -> [a] -> [b]
map ([String] -> Array Int (String, Bool)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null) forall a b. (a -> b) -> a -> b
$ Concatenations
ysss
where f :: [String] -> Array Int (String,Bool)
f :: [String] -> Array Int (String, Bool)
f [String]
yss = let l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
yss in forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Int
0,Int
lforall a. Num a => a -> a -> a
-Int
1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. [a] -> [b] -> [(a, b)]
zip [String]
yss forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
cycle forall a b. (a -> b) -> a -> b
$ [Bool
True]
prepareText
:: [[String]]
-> [[String]]
-> String
-> String
-> [String]
prepareText :: Concatenations -> Concatenations -> String -> String -> [String]
prepareText = Int
-> Concatenations -> Concatenations -> String -> String -> [String]
prepareTextN Int
7
{-# INLINE prepareText #-}
sort2Concat
:: [[String]]
-> Concatenations
sort2Concat :: Concatenations -> Concatenations
sort2Concat Concatenations
xsss
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null Concatenations
xsss = []
| Bool
otherwise = forall a b. (a -> b) -> [a] -> [b]
map forall a. Ord a => [a] -> [a]
sort forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn (forall a b. (a -> b) -> [a] -> [b]
map (forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words)) forall a b. (a -> b) -> a -> b
$ Concatenations
xsss
complexWords2 :: ConcatenationsArr -> String -> (String -> String,String)
complexWords2 :: ConcatenationsArr -> String -> (String -> String, String)
complexWords2 ysss :: ConcatenationsArr
ysss@(Array Int (String, Bool)
yss:ConcatenationsArr
zsss) zs :: String
zs@(Char
r:String
rs)
| forall a b. Ord a => (b, Array Int (a, b)) -> a -> b
getBFst' (Bool
False, Array Int (String, Bool)
yss) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords forall a b. (a -> b) -> a -> b
$ [String]
tss = ((String
uwxs forall a. Monoid a => a -> a -> a
`mappend`), [String] -> String
unwords [String]
uss)
| Bool
otherwise = ConcatenationsArr -> String -> (String -> String, String)
complexWords2 ConcatenationsArr
zsss String
zs
where y :: Int
y = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i e. Array i e -> Int -> e
unsafeAt Array Int (String, Bool)
yss forall a b. (a -> b) -> a -> b
$ Int
0
([String]
tss,[String]
uss) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
y forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words forall a b. (a -> b) -> a -> b
$ String
zs
uwxs :: String
uwxs = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
tss
complexWords2 ConcatenationsArr
_ String
zs = (forall a. a -> a
id,String
zs)
pairCompl :: (String -> String,String) -> (String,String)
pairCompl :: (String -> String, String) -> (String, String)
pairCompl (String -> String
f,String
xs) = (String -> String
f [],String
xs)
splitWords :: ConcatenationsArr -> [String] -> String -> (String,String)
splitWords :: ConcatenationsArr -> [String] -> String -> (String, String)
splitWords ConcatenationsArr
ysss [String]
tss String
zs = let (String
ws,String
us) = (String -> String, String) -> (String, String)
pairCompl forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConcatenationsArr -> String -> (String -> String, String)
complexWords2 ConcatenationsArr
ysss forall a b. (a -> b) -> a -> b
$ String
zs in if
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words forall a b. (a -> b) -> a -> b
$ String
zs -> (forall a. Monoid a => [a] -> a
mconcat [String]
tss,[])
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
ws -> (\([String]
xss,[String]
uss) -> (forall a. Monoid a => [a] -> a
mconcat ([String]
tss forall a. Monoid a => a -> a -> a
`mappend` [String]
xss), [String] -> String
unwords [String]
uss)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> ([a], [a])
splitAt Int
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words forall a b. (a -> b) -> a -> b
$ String
zs
| Bool
otherwise -> ConcatenationsArr -> [String] -> String -> (String, String)
splitWords ConcatenationsArr
ysss ([String]
tss forall a. Monoid a => a -> a -> a
`mappend` [String
ws]) String
us
concatWordsFromLeftToRight :: ConcatenationsArr -> String -> [String]
concatWordsFromLeftToRight :: ConcatenationsArr -> String -> [String]
concatWordsFromLeftToRight ConcatenationsArr
ysss String
zs = let (String
ws,String
us) = ConcatenationsArr -> [String] -> String -> (String, String)
splitWords ConcatenationsArr
ysss [] String
zs in
if forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
us then [String
ws] else String
ws forall a. a -> [a] -> [a]
: ConcatenationsArr -> String -> [String]
concatWordsFromLeftToRight ConcatenationsArr
ysss String
us
append2prependConv :: Concatenations -> Concatenations
append2prependConv :: Concatenations -> Concatenations
append2prependConv = forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (a -> b) -> [a] -> [b]
map ([String] -> String
unwords forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words))
{-# INLINE append2prependConv #-}
left2right :: [String] -> String
left2right :: [String] -> String
left2right = [String] -> String
unwords forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. [a] -> [a]
reverse
{-# INLINE left2right #-}
prepareTextN
:: Int
-> [[String]]
-> [[String]]
-> String
-> String
-> [String]
prepareTextN :: Int
-> Concatenations -> Concatenations -> String -> String -> [String]
prepareTextN Int
n Concatenations
ysss Concatenations
zsss String
xs = forall a. (a -> Bool) -> [a] -> [a]
filter (forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> Char -> Bool
isPLL String
xs)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
splitLinesN Int
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map ([String] -> String
left2right forall b c a. (b -> c) -> (a -> b) -> a -> c
.
ConcatenationsArr -> String -> [String]
concatWordsFromLeftToRight (Concatenations -> ConcatenationsArr
defaultConversion forall b c a. (b -> c) -> (a -> b) -> a -> c
. Concatenations -> Concatenations
sort2Concat forall b c a. (b -> c) -> (a -> b) -> a -> c
. Concatenations -> Concatenations
append2prependConv forall a b. (a -> b) -> a -> b
$ Concatenations
zsss) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
left2right forall b c a. (b -> c) -> (a -> b) -> a -> c
.
ConcatenationsArr -> String -> [String]
concatWordsFromLeftToRight (Concatenations -> ConcatenationsArr
defaultConversion forall b c a. (b -> c) -> (a -> b) -> a -> c
. Concatenations -> Concatenations
sort2Concat forall a b. (a -> b) -> a -> b
$ Concatenations
ysss)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Bool
null) forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
isSpC :: Char -> Bool
isSpC :: Char -> Bool
isSpC Char
x = Char
x forall a. Eq a => a -> a -> Bool
== Char
'\'' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
' ' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
'\x2019' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
'\x02BC' Bool -> Bool -> Bool
|| Char
x forall a. Eq a => a -> a -> Bool
== Char
'-'
{-# INLINE isSpC #-}
{-# DEPRECATED #-}
isPLL :: String -> Char -> Bool
isPLL :: String -> Char -> Bool
isPLL String
xs Char
y = forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' Bool
False (forall a b. [a] -> [b] -> [(a, b)]
zip String
xs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> a -> [a]
replicate Int
10000 forall a b. (a -> b) -> a -> b
$ Bool
True) Char
y
splitLines :: [String] -> [String]
splitLines :: [String] -> [String]
splitLines = Int -> [String] -> [String]
splitLinesN Int
7
{-# INLINE splitLines #-}
splitLinesN :: Int -> [String] -> [String]
splitLinesN :: Int -> [String] -> [String]
splitLinesN Int
n [String]
xss
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
<= Int
0 = []
| Bool
otherwise = forall a. (a -> Bool) -> (a -> [a]) -> [a] -> [a]
mapI (\String
xs -> forall a. Ord a => a -> a -> Ordering
compare (forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words forall a b. (a -> b) -> a -> b
$ String
xs) Int
n forall a. Eq a => a -> a -> Bool
== Ordering
GT) (\String
xs -> let yss :: [String]
yss = String -> [String]
words String
xs in
Int -> [String] -> [String]
splitLinesN Int
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map [String] -> String
unwords forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\([String]
q,[String]
r) -> [[String]
q,[String]
r]) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> [a] -> ([a], [a])
splitAt (forall a. Bits a => a -> Int -> a
shiftR (forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
yss) Int
1) forall a b. (a -> b) -> a -> b
$ [String]
yss) forall a b. (a -> b) -> a -> b
$ [String]
xss
growLinesN :: Int -> [String] -> [String]
growLinesN :: Int -> [String] -> [String]
growLinesN Int
n [String]
xss
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
< Int
0 = []
| Bool
otherwise = [String] -> String
unwords [String]
yss forall a. a -> [a] -> [a]
: Int -> [String] -> [String]
growLinesN Int
n [String]
zss
where l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
takeWhile (forall a. Ord a => a -> a -> Bool
<= Int
n) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> a) -> [a] -> [a]
scanl1 forall a. Num a => a -> a -> a
(+) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words) forall a b. (a -> b) -> a -> b
$ [String]
xss
([String]
yss,[String]
zss) = forall a. Int -> [a] -> ([a], [a])
splitAt (forall a. Ord a => a -> a -> a
max Int
l Int
1) [String]
xss
prepareGrowTextMN
:: Int
-> Int
-> [[String]]
-> [[String]]
-> String
-> String
-> [String]
prepareGrowTextMN :: Int
-> Int
-> Concatenations
-> Concatenations
-> String
-> String
-> [String]
prepareGrowTextMN Int
m Int
n Concatenations
ysss Concatenations
zsss String
xs = Int -> [String] -> [String]
growLinesN Int
m forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int
-> Concatenations -> Concatenations -> String -> String -> [String]
prepareTextN Int
n Concatenations
ysss Concatenations
zsss String
xs
{-# INLINE prepareGrowTextMN #-}
tuneLinesN :: Int -> [String] -> [String]
tuneLinesN :: Int -> [String] -> [String]
tuneLinesN Int
n [String]
xss
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss Bool -> Bool -> Bool
|| Int
n forall a. Ord a => a -> a -> Bool
< Int
0 = []
| Bool
otherwise =
let wss :: [String]
wss = String -> [String]
words forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords forall a b. (a -> b) -> a -> b
$ [String]
xss
([String]
yss,[String]
zss) = forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [String]
wss
in [String] -> String
unwords [String]
yss forall a. a -> [a] -> [a]
: Int -> [String] -> [String]
tuneLinesN Int
n [String]
zss
prepareTuneTextMN
:: Int
-> Int
-> [[String]]
-> [[String]]
-> String
-> String
-> [String]
prepareTuneTextMN :: Int
-> Int
-> Concatenations
-> Concatenations
-> String
-> String
-> [String]
prepareTuneTextMN Int
m Int
n Concatenations
ysss Concatenations
zsss String
xs = Int -> [String] -> [String]
tuneLinesN Int
m forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int
-> Concatenations -> Concatenations -> String -> String -> [String]
prepareTextN Int
n Concatenations
ysss Concatenations
zsss String
xs
{-# INLINE prepareTuneTextMN #-}