{-# LANGUAGE NoImplicitPrelude #-}
module StringUtils (
    strip,
    lstrip,
    rstrip,
    replace,
    split,
    splitFirst,
    ) where

import           IHaskellPrelude
import qualified Data.Text as T
import           Data.List.Split (splitOn)
import qualified Data.List.Split as Split

lstrip :: String -> String
lstrip :: String -> String
lstrip = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> String -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (String
" \t\r\n" :: String))

rstrip :: String -> String
rstrip :: String -> String
rstrip = 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
lstrip (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse

strip :: String -> String
strip :: String -> String
strip = String -> String
rstrip (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
lstrip

replace :: String -> String -> String -> String
replace :: String -> String -> String -> String
replace String
needle String
replacement String
haystack =
  Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace (String -> Text
T.pack String
needle) (String -> Text
T.pack String
replacement) (String -> Text
T.pack String
haystack)

split :: String -> String -> [String]
split :: String -> String -> [String]
split = String -> String -> [String]
forall a. Eq a => [a] -> [a] -> [[a]]
splitOn

splitFirst :: String -> String -> [String]
splitFirst :: String -> String -> [String]
splitFirst String
delim String
str = let
  (String
head:String
_:[String]
tail) = Splitter Char -> String -> [String]
forall a. Splitter a -> [a] -> [[a]]
Split.split (String -> Splitter Char
forall a. Eq a => [a] -> Splitter a
Split.onSublist String
delim) String
str
  in [String
head, [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
tail]