{-# LANGUAGE Safe #-} module Utils (checkMajorVersion ,cleanDoubleQuotes ,deEscapeSingleQuotes ,dot ,escapeSingleQuotes ,nolines ,replace ,strip ,stripUsing ,toDoubleQuotedStr ,toSingleQuotedStr ,wrap ,wrapUsing ) where import Data.Char (isSpace) import Data.List (findIndices,intercalate) import Data.List.Split (splitOn) import Data.Maybe (fromMaybe) import Safe (lastDef,readMay) -- | Given a comparison and a string return true or false: -- -- > *Utils> checkMajorVersion (18>=) "18.1.0" -- > True -- > *Utils> checkMajorVersion (18>=) "19.3" -- > False -- > *Utils> checkMajorVersion (>=19) "19.3" -- > True -- > *Utils> checkMajorVersion (>=19) "18.1.0" -- > False -- checkMajorVersion :: (Int -> t) -> String -> t checkMajorVersion f s = f (fromMaybe 0 (readMay (takeWhile (/='.') s) :: Maybe Int)) -- | 'strip' away leading and trailing space. strip :: String -> String strip = stripUsing isSpace -- | If at all possible, 'wrap' a string @s@ into strings of length less -- than or equal to @l@ breaking with 'isSpace'. wrap :: Int -> String -> [String] wrap = wrapUsing isSpace -- | 'stripUsing' predicate @p@ leading and trailing @p x@ true. stripUsing :: (a -> Bool) -> [a] -> [a] stripUsing p = dropWhile p . reverse . dropWhile p . reverse -- | 'wrapUsing' predicate @p@ a list @xs@ into lists of length less -- than or equal to @l@ breaking on @p x@ true. wrapUsing :: (a -> Bool) -> Int -> [a] -> [[a]] wrapUsing p l s = if length s' < l || null is then [s'] else hd:wrapUsing p l tl where s' = stripUsing p s is = findIndices p s' (hd, tl) = splitAt i s' i = (lastDef (head is) . takeWhile (<=l)) is -- | 'dot' = \".\" dot :: FilePath dot = "." -- | Make a double quoted string from a single quoted string, a SciDB -- string. toDoubleQuotedStr :: String -> String toDoubleQuotedStr = replace "\"" "'" . stripUsing (=='\'') . replace "\\'" "\"" -- | Make a single quoted string which is a SciDB string. toSingleQuotedStr :: String -> String toSingleQuotedStr s = "'" ++ escapeSingleQuotes s ++ "'" -- | De-Escape single quotes. deEscapeSingleQuotes :: String -> String deEscapeSingleQuotes = replace "\\'" "'" -- | Escape single quotes. escapeSingleQuotes :: String -> String escapeSingleQuotes = replace "'" "\\'" -- | Replaces newlines (\\n) with a space ( ). nolines :: String -> String nolines = replace "\n" " " -- | Replace needle in a haystack with replacement. replace :: Eq a => [a] -> [a] -> [a] -> [a] replace needle replacement haystack = intercalate replacement (splitOn needle haystack) -- | Replace escaped double quotes (\") by single quotes (') -- and remove double qoutes ("). cleanDoubleQuotes :: String -> String cleanDoubleQuotes = replace "\"" "" . replace "\\\"" "'"