{- | Rutinas auxiliares. -} module Database.TA.Helper.Text ( proper , palabras ) where import Data.Char ( toLower, toUpper, isSpace ) import Data.List ( mapAccumL ) -- | Función tomada de internet... proper :: String -> String proper = unwords . map capitalize . words where capitalize (x:xs) = toUpper x : map toLower xs {- | 'palabras' divide una hilera en una lista de palabras y espacios en blanco. La división ocurre cuando se encuentra con algún caracter que representa espacio. Los espacios se conservan. A diferencia con words: donde (words x) /= concat (words x) 'palabras' cumple con (palabras x) == concat (palabras x) -} palabras s = let (acc,l) = mapAccumL dividir [] s in filter (not . null) $ l ++ [(reverse acc)] where nosp = not . isSpace dividir acc x | null acc = (x:acc, [] ) | isSpace (head acc) && isSpace x = (x:acc, [] ) | isSpace (head acc) && nosp x = ([x] , reverse acc) | nosp (head acc) && isSpace x = ([x] , reverse acc) | otherwise = (x:acc, [] ) -- eof