{-| MyPretty is a library that can be used in conjuncture with "Text.PrettyPrint.GenericPretty".
    
    This library is a thin wrapper around the "Pretty" library and implements only 'Style' related
    features. 
    These features are planned to be added to the Pretty library itself. 
    When that happens "MyPretty" will become obsolete and will be replaced by "Pretty".
    
    This library can be imported if the user wants to make custom pretty printing definitions for
    his types or define a custom printing Style. 
    The syntax used is that of "Pretty" and "Text.PrettyPrint.HughesPJ".
    
    For an example of a custom definition for a data type and usage of a custom Style 
    see the README file included in the package.
|-}
module Text.PrettyPrint.MyPretty(
                module Pretty,
                Style(..), renderStyle, style
               )where

import Pretty
import FastString

-- | A rendering style
data Style
          = Style {   mode           :: Mode     -- ^ The rendering mode
                    , lineLength     :: Int      -- ^ Length of line, in chars
                    , ribbonsPerLine :: Float    -- ^ Ratio of ribbon length to line length
                  }
                  
-- | Render a document using a particular style
-- internally calls 'Pretty.fullRender'
renderStyle  :: Style -> Doc -> String
renderStyle s = fullRender (mode s) (lineLength s) (ribbonsPerLine s) outputStr ""
  where
    outputStr :: TextDetails -> String -> String
    outputStr td str = decode td ++ str
      where
        decode :: TextDetails -> String
        decode (PStr s1) = unpackFS s1
        decode (LStr s1 _) = unpackLitString s1
        decode (Chr c)  = [c]
        decode (Str s) = s

-- | The default 'Style' used for "Text.PrettyPrint.GenericPretty"
-- (mode=PageMode, lineLength=80, ribbonsPerLine=1.5)
style :: Style
style = Style {mode = PageMode, lineLength = 80, ribbonsPerLine = 1.5}