module Utils.String where
import Data.List (intercalate)


class ToString a where
  toString :: a -> String

instance ToString Char where
  toString :: Char -> String
toString = Char -> String
forall (f :: * -> *) a. Applicative f => a -> f a
pure

instance ToString Int where
  toString :: Int -> String
toString = Int -> String
forall a. Show a => a -> String
show

instance ToString Integer where
  toString :: Integer -> String
toString = Integer -> String
forall a. Show a => a -> String
show

instance ToString Float where
  toString :: Float -> String
toString = Float -> String
forall a. Show a => a -> String
show

instance ToString Double where
  toString :: Double -> String
toString = Double -> String
forall a. Show a => a -> String
show

instance (ToString a, Foldable m) => ToString (m a) where
  toString :: m a -> String
toString = (a -> String) -> m a -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap a -> String
forall a. ToString a => a -> String
toString



indent :: Int -> String -> String
indent :: Int -> String -> String
indent Int
n String
str = String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n" ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String -> String
indentLine (String -> String) -> [String] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> [String]
lines String
str where
  indentLine :: String -> String
indentLine = ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (Int -> String -> [String]
forall a. Int -> a -> [a]
replicate Int
n String
" ") String -> String -> String
forall a. [a] -> [a] -> [a]
++)