module GF.Text.Clitics (getClitics,getCliticsText) where
import Data.List
getClitics :: (String -> Bool) -> [String] -> String -> [[String]]
getClitics :: (String -> Bool) -> [String] -> String -> [[String]]
getClitics String -> Bool
isLex [String]
rclitics = ([String] -> [String]) -> [[String]] -> [[String]]
forall a b. (a -> b) -> [a] -> [b]
map ([String] -> [String]
forall a. [a] -> [a]
reverse ([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
forall a. [a] -> [a]
reverse) ([[String]] -> [[String]])
-> (String -> [[String]]) -> String -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [[String]]
clits (String -> [[String]])
-> (String -> String) -> String -> [[String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse where
clits :: String -> [[String]]
clits String
rword = String -> [[String]] -> [[String]]
ifLex String
rword [String
rclitString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
more |
String
rclit <- [String]
rclitics, String
stem <- String -> String -> [String]
forall a. Eq a => [a] -> [a] -> [[a]]
splits String
rclit String
rword, [String]
more <- String -> [[String]]
clits String
stem]
splits :: [a] -> [a] -> [[a]]
splits [a]
c = [[a]] -> ([a] -> [[a]]) -> Maybe [a] -> [[a]]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] [a] -> [[a]]
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe [a] -> [[a]]) -> ([a] -> Maybe [a]) -> [a] -> [[a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a] -> Maybe [a]
forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix [a]
c
ifLex :: String -> [[String]] -> [[String]]
ifLex String
w [[String]]
ws = if String -> Bool
isLex (String -> String
forall a. [a] -> [a]
reverse String
w) then [String
w] [String] -> [[String]] -> [[String]]
forall a. a -> [a] -> [a]
: [[String]]
ws else [[String]]
ws
getCliticsText :: (String -> Bool) -> [String] -> [String] -> [String]
getCliticsText :: (String -> Bool) -> [String] -> [String] -> [String]
getCliticsText String -> Bool
isLex [String]
rclitics =
([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]]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([[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) -> [[String]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map [String] -> String
render ([[String]] -> [String])
-> (String -> [[String]]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Bool) -> [String] -> String -> [[String]]
getClitics String -> Bool
isLex [String]
rclitics)
where
render :: [String] -> String
render = [String] -> String
unwords ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
"&+"