module Language.PureScript.Publish.BoxesHelpers
  ( Boxes.Box
  , Boxes.nullBox
  , module Language.PureScript.Publish.BoxesHelpers
  ) where

import Prelude.Compat

import Data.Text (Text)
import qualified Data.Text as T
import System.IO (hPutStr, stderr)

import qualified Text.PrettyPrint.Boxes as Boxes

width :: Int
width = 79

indentWidth :: Int
indentWidth = 2

para :: String -> Boxes.Box
para = Boxes.para Boxes.left width

indented :: Boxes.Box -> Boxes.Box
indented b = Boxes.hcat Boxes.left [Boxes.emptyBox 1 indentWidth, b]

successivelyIndented :: [String] -> Boxes.Box
successivelyIndented [] =
  Boxes.nullBox
successivelyIndented (x:xs) =
  Boxes.vcat Boxes.left [para x, indented (successivelyIndented xs)]

vcat :: [Boxes.Box] -> Boxes.Box
vcat = Boxes.vcat Boxes.left

spacer :: Boxes.Box
spacer = Boxes.emptyBox 1 1

bulletedList :: (a -> String) -> [a] -> [Boxes.Box]
bulletedList f = map (indented . para . ("* " ++) . f)

bulletedListT :: (a -> Text) -> [a] -> [Boxes.Box]
bulletedListT f = bulletedList (T.unpack . f)

printToStderr :: Boxes.Box -> IO ()
printToStderr = hPutStr stderr . Boxes.render

printToStdout :: Boxes.Box -> IO ()
printToStdout = putStr . Boxes.render
