{-# LANGUAGE FlexibleInstances, UndecidableInstances, IncoherentInstances #-} module Utils.String where import Data.List (intercalate) class ToString a where toString :: a -> String instance ToString String where toString :: String -> String toString = String -> String forall a. a -> a id 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 $ Int -> String -> String indentLine Int n (String -> String) -> [String] -> [String] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> String -> [String] lines String str where indentLine :: Int -> String -> String indentLine Int n = ([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] ++)