not-in-base-0.1.1: src/NIB/String.hs
-- {-# OPTIONS_GHC -fglasgow-exts -,
--
-- #-}
{-# LANGUAGE UndecidableInstances, OverlappingInstances, FlexibleInstances, TypeSynonymInstances
#-}
{-|
Contains useful generic functions not found elsewhere.
-}
module NIB.String where
import Data.Char
import NIB.List
import NIB.Pointfree
-- \ String functions
-- \ ToString type class as found on stackoverflow (Porges answer at
-- http://stackoverflow.com/questions/968198/haskell-show-screwed-up)
-- Expanded with instance ToString Char.
class ToString a where
toString :: a -> String
instance ToString String where
toString = id
instance ToString Char where
toString c = [c]
instance Show a => ToString a where
toString = show
-- | Remove all line breaks in a string
--
-- > "testtest" == removeBreak "test\n\rtest\r"
removeBreak :: String -> String
removeBreak = filter ((/= '\r') &&* (/= '\n'))
-- | Convert first character in String to lower.
--
-- > lowerFirst "Foo" == "foo"
-- > lowerFirst "BaR" == "baR"
-- > lowerFirst "g0O" == "g0O".'
lowerFirst :: String -> String
lowerFirst = convertFirst toLower
-- | Convert first character in String to upper.
--
-- > upperFirst "foo" == "Foo"
-- > upperFirst "bAr" == "BAr"
-- > upperFirst "G0O" == "G0O".'
upperFirst :: String -> String
upperFirst = convertFirst toUpper
-- | Convert every space (' ') in a string to a blank ('_') instead.
--
-- > spaceToBlank " " == "_"
-- > spaceToBlank " foo " == "_foo__"
-- > spaceToBlank "b a r" == "b_a_r"
spaceToBlank :: String -> String
spaceToBlank "" = ""
spaceToBlank (x:xs) = (if x == ' ' then '_' else x) : spaceToBlank xs
-- | Trims whitespace from the beginning or end.
--
-- > trimWs " foo " == "foo"
trimWs :: String -> String
trimWs = trim (==' ')