module Bookhound.Internal.String where import Data.List (intercalate) import Data.Text (Text, unpack) 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 Text where toString :: Text -> String toString = Text -> String unpack 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. Semigroup a => a -> a -> a <>)