packages feed

sandwich-0.3.0.0: src/Test/Sandwich/Formatters/Print/Util.hs

{-# LANGUAGE CPP #-}

module Test.Sandwich.Formatters.Print.Util where

import Control.Monad.Reader
import qualified Data.List as L
import Test.Sandwich.Formatters.Print.Types
import Text.Show.Pretty as P


isSingleLine :: P.Value -> Bool
isSingleLine (Con {}) = False
isSingleLine (InfixCons op tuples) = isSingleLine op && (all isSingleLine (fmap snd tuples))
isSingleLine (Rec {}) = False
isSingleLine (Tuple values) = all isSingleLine values
isSingleLine (List values) = all isSingleLine values
isSingleLine (Neg value) = isSingleLine value
isSingleLine (Ratio v1 v2) = all isSingleLine [v1, v2]
isSingleLine (String s) = '\n' `L.notElem` s

#if MIN_VERSION_pretty_show(1,10,0)
isSingleLine (Quote s) = '\n' `L.notElem` s
#endif

isSingleLine _ = True

withBumpIndent :: MonadReader (PrintFormatter, Int, c) m => m b -> m b
withBumpIndent action = do
  (PrintFormatter {..}, _, _) <- ask
  withBumpIndent' printFormatterIndentSize action

withBumpIndent' :: (MonadReader (a, Int, c) m) => Int -> m b -> m b
withBumpIndent' n = local (\(pf, indent, h) -> (pf, indent + n, h))

fst3 :: (a, b, c) -> a
fst3 (x, _, _) = x