module Bookhound.Utils.String where

import Data.List (intercalate)
import Data.Text (Text, unpack)


class ToString a where
  toString :: a -> String

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

instance ToString Int where
  toString :: Int -> [Char]
toString = forall a. Show a => a -> [Char]
show

instance ToString Text where
  toString :: Text -> [Char]
toString = Text -> [Char]
unpack

instance ToString Integer where
  toString :: Integer -> [Char]
toString = forall a. Show a => a -> [Char]
show

instance ToString Float where
  toString :: Float -> [Char]
toString = forall a. Show a => a -> [Char]
show

instance ToString Double where
  toString :: Double -> [Char]
toString = forall a. Show a => a -> [Char]
show

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



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