module Data.Phonetic.Languages.PrepareText (
Concatenations
, complexWords
, splitLines
, splitLinesN
, isSpC
, sort2Concat
, toSequentialApp
, prepareConcats
, complexNWords
, prepareText
, prepareTextN
, growLinesN
, prepareGrowTextMN
, isPLL
) where
import CaseBi.Arr (getBFstL')
import Data.List.InnToOut.Basic (mapI)
import Data.Char (isAlpha,toLower)
import GHC.Arr
import Data.List (sort,sortOn)
type Concatenations = [[String]]
prepareText
:: [[String]]
-> String
-> String
-> [String]
prepareText :: [[String]] -> String -> String -> [String]
prepareText = Int -> [[String]] -> String -> String -> [String]
prepareTextN Int
7
{-# INLINE prepareText #-}
sort2Concat
:: [[String]]
-> Concatenations
sort2Concat :: [[String]] -> [[String]]
sort2Concat [[String]]
xsss
| [[String]] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[String]]
xsss = []
| Bool
otherwise = ([String] -> [String]) -> [[String]] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map [String] -> [String]
forall a. Ord a => [a] -> [a]
sort ([[String]] -> [[String]])
-> ([[String]] -> [[String]]) -> [[String]] -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[String]] -> [[String]]
forall a. [a] -> [a]
reverse ([[String]] -> [[String]])
-> ([[String]] -> [[String]]) -> [[String]] -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([String] -> [Int]) -> [[String]] -> [[String]]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn ((String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map ([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]] -> [[String]]) -> [[String]] -> [[String]]
forall a b. (a -> b) -> a -> b
$ [[String]]
xsss
toSequentialApp
:: Concatenations
-> [Concatenations]
toSequentialApp :: [[String]] -> [[[String]]]
toSequentialApp ysss :: [[String]]
ysss@([String]
xss:[[String]]
xsss)
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss = [[String]] -> [[[String]]]
toSequentialApp [[String]]
xsss
| Bool
otherwise = [[String]
xss, Int -> String -> [String]
forall a. Int -> a -> [a]
replicate (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) []] [[String]] -> [[[String]]] -> [[[String]]]
forall a. a -> [a] -> [a]
: [[String]] -> [[[String]]]
toSequentialApp [[String]]
xsss
where n :: Int
n = [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 -> [String])
-> ([String] -> String) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
forall a. [a] -> a
head ([String] -> Int) -> [String] -> Int
forall a b. (a -> b) -> a -> b
$ [String]
xss
toSequentialApp [[String]]
_ = []
prepareConcats
:: [[String]]
-> [Concatenations]
prepareConcats :: [[String]] -> [[[String]]]
prepareConcats = [[String]] -> [[[String]]]
toSequentialApp ([[String]] -> [[[String]]])
-> ([[String]] -> [[String]]) -> [[String]] -> [[[String]]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[String]] -> [[String]]
sort2Concat
{-# INLINABLE prepareConcats #-}
complexNWords :: [[String]] -> [String] -> [String]
complexNWords :: [[String]] -> [String] -> [String]
complexNWords [[String]]
xsss [String]
yss = [[[String]]] -> [String] -> [String]
complexNWords' [[[String]]]
tssss [String]
yss
where tssss :: [[[String]]]
tssss = [[String]] -> [[[String]]]
prepareConcats [[String]]
xsss
complexNWords' :: [[[String]]] -> [String] -> [String]
complexNWords' tssss :: [[[String]]]
tssss@([[String]]
ysss:[[[String]]]
zssss) [String]
uss = [[[String]]] -> [String] -> [String]
complexNWords' [[[String]]]
zssss ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[String]] -> [[String]] -> [String] -> [String]
complexWords [[String]]
ysss [[String]]
ysss ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
uss
complexNWords' [[[String]]]
_ [String]
uss = [String]
uss
complexWords :: Concatenations -> Concatenations -> [String] -> [String]
complexWords :: [[String]] -> [[String]] -> [String] -> [String]
complexWords [[String]]
rsss [[String]]
ysss [String]
zss
= ((String, [[String]], [[String]]) -> String)
-> [(String, [[String]], [[String]])] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\(String
ts,[[String]]
_,[[String]]
_) -> String
ts) ([(String, [[String]], [[String]])] -> [String])
-> ([String] -> [(String, [[String]], [[String]])])
-> [String]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])])
-> [(String, [[String]], [[String]])]
-> [String]
-> [(String, [[String]], [[String]])]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr String
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
f [(String, [[String]], [[String]])]
forall a. [([a], [[String]], [[String]])]
v ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
zss
where v :: [([a], [[String]], [[String]])]
v = [([],[[String]]
rsss,[[String]]
ysss)]
f :: String
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
f String
z rs :: [(String, [[String]], [[String]])]
rs@((String
t,[[String]]
rsss,([String]
yss:[[String]]
tsss)):[(String, [[String]], [[String]])]
ks)
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
yss = String
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
f String
z ((String
t,[[String]]
rsss,[[String]]
tsss)(String, [[String]], [[String]])
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
forall a. a -> [a] -> [a]
:[(String, [[String]], [[String]])]
ks)
| Bool -> [(String, Bool)] -> String -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' Bool
False ([String] -> [Bool] -> [(String, Bool)]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
yss ([Bool] -> [(String, Bool)])
-> (Bool -> [Bool]) -> Bool -> [(String, Bool)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> [Bool]
forall a. Int -> a -> [a]
replicate Int
10000 (Bool -> [(String, Bool)]) -> Bool -> [(String, Bool)]
forall a b. (a -> b) -> a -> b
$ Bool
True) String
uwxs = ((Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
' ') String
uwxs String -> String -> String
forall a. Monoid a => a -> a -> a
`mappend` String
t,[[String]]
rsss,[[String]]
rsss)(String, [[String]], [[String]])
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
forall a. a -> [a] -> [a]
:[(String, [[String]], [[String]])]
ks
| Bool
otherwise = String
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
f String
z ((String
t,[[String]]
rsss,[[String]]
tsss)(String, [[String]], [[String]])
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
forall a. a -> [a] -> [a]
:[(String, [[String]], [[String]])]
ks)
where y :: Int
y = [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 -> [String])
-> ([String] -> String) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
forall a. [a] -> a
head ([String] -> Int) -> [String] -> Int
forall a b. (a -> b) -> a -> b
$ [String]
yss
uwxs :: String
uwxs = [String] -> String
unwords ([String] -> String)
-> ([(String, [[String]], [[String]])] -> [String])
-> [(String, [[String]], [[String]])]
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
y ([String] -> [String])
-> ([(String, [[String]], [[String]])] -> [String])
-> [(String, [[String]], [[String]])]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String, [[String]], [[String]]) -> String)
-> [(String, [[String]], [[String]])] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\(String
q,[[String]]
_,[[String]]
_) -> String
q) ([(String, [[String]], [[String]])] -> String)
-> [(String, [[String]], [[String]])] -> String
forall a b. (a -> b) -> a -> b
$ [(String, [[String]], [[String]])]
rs
f String
z rs :: [(String, [[String]], [[String]])]
rs@((String
t,[[String]]
rsss,[]):[(String, [[String]], [[String]])]
ks) = (String
z,[[String]]
rsss,[[String]]
rsss)(String, [[String]], [[String]])
-> [(String, [[String]], [[String]])]
-> [(String, [[String]], [[String]])]
forall a. a -> [a] -> [a]
:[(String, [[String]], [[String]])]
rs
prepareTextN
:: Int
-> [[String]]
-> String
-> String
-> [String]
prepareTextN :: Int -> [[String]] -> String -> String -> [String]
prepareTextN Int
n [[String]]
ysss String
xs = (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (String -> Char -> Bool
isPLL String
xs)) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> [String]
splitLinesN Int
n ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ([String] -> String
unwords ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[String]] -> [String] -> [String]
complexNWords [[String]]
ysss ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
words) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
isSpC :: Char -> Bool
isSpC :: Char -> Bool
isSpC Char
x = 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
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\x2019' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\x02BC' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-'
{-# INLINE isSpC #-}
{-# DEPRECATED #-}
isPLL :: String -> Char -> Bool
isPLL :: String -> Char -> Bool
isPLL String
xs Char
y = Bool -> [(Char, Bool)] -> Char -> Bool
forall a b. Ord a => b -> [(a, b)] -> a -> b
getBFstL' Bool
False (String -> [Bool] -> [(Char, Bool)]
forall a b. [a] -> [b] -> [(a, b)]
zip String
xs ([Bool] -> [(Char, Bool)])
-> (Bool -> [Bool]) -> Bool -> [(Char, Bool)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Bool -> [Bool]
forall a. Int -> a -> [a]
replicate Int
10000 (Bool -> [(Char, Bool)]) -> Bool -> [(Char, Bool)]
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
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss Bool -> Bool -> Bool
|| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = []
| Bool
otherwise = (String -> Bool) -> (String -> [String]) -> [String] -> [String]
forall a. (a -> Bool) -> (a -> [a]) -> [a] -> [a]
mapI (\String
xs -> Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare ([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) Int
n Ordering -> Ordering -> Bool
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 ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([String] -> String) -> [[String]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map [String] -> String
unwords ([[String]] -> [String])
-> ([String] -> [[String]]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\([String]
q,[String]
r) -> [[String]
q,[String]
r]) (([String], [String]) -> [[String]])
-> ([String] -> ([String], [String])) -> [String] -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt ([String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
yss Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
2) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
yss) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ [String]
xss
growLinesN :: Int -> [String] -> [String]
growLinesN :: Int -> [String] -> [String]
growLinesN Int
n [String]
xss
| [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
xss Bool -> Bool -> Bool
|| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = []
| Bool
otherwise = [String] -> String
unwords [String]
yss String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Int -> [String] -> [String]
growLinesN Int
n [String]
zss
where l :: Int
l = [Int] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Int] -> Int) -> ([String] -> [Int]) -> [String] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int) -> [Int] -> [Int]
forall a. (a -> a -> a) -> [a] -> [a]
scanl1 Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) ([Int] -> [Int]) -> ([String] -> [Int]) -> [String] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Int) -> [String] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map ([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]
xss
([String]
yss,[String]
zss) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
l Int
1) [String]
xss
prepareGrowTextMN
:: Int
-> Int
-> [[String]]
-> String
-> String
-> [String]
prepareGrowTextMN :: Int -> Int -> [[String]] -> String -> String -> [String]
prepareGrowTextMN Int
m Int
n [[String]]
ysss String
xs = Int -> [String] -> [String]
growLinesN Int
m ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [[String]] -> String -> String -> [String]
prepareTextN Int
n [[String]]
ysss String
xs
{-# INLINE prepareGrowTextMN #-}