Copyright | (c) Dennis Gosnell 2016 |
---|---|
License | BSD-style (see LICENSE file) |
Maintainer | cdep.illabout@gmail.com |
Stability | experimental |
Portability | POSIX |
Safe Haskell | None |
Language | Haskell2010 |
- data PrinterState = PrinterState {
- _currLine :: Int
- _currCharOnLine :: Int
- _indentStack :: [Int]
- _printerString :: String
- printerString :: Lens' PrinterState String
- indentStack :: Lens' PrinterState [Int]
- currLine :: Lens' PrinterState Int
- currCharOnLine :: Lens' PrinterState Int
- printerState :: Int -> Int -> [Int] -> String -> PrinterState
- initPrinterState :: PrinterState
- _headEx :: Lens' [Int] Int
- latestIndent :: Lens' PrinterState Int
- popIndent :: MonadState PrinterState m => m ()
- setIndentAtCurrChar :: MonadState PrinterState m => m ()
- putOpeningSymbol :: MonadState PrinterState m => String -> m ()
- putClosingSymbol :: MonadState PrinterState m => String -> m ()
- putComma :: MonadState PrinterState m => m ()
- putCommaSep :: forall m. MonadState PrinterState m => CommaSeparated [Expr] -> m ()
- putString :: MonadState PrinterState m => String -> m ()
- putSurroundExpr :: MonadState PrinterState m => String -> String -> CommaSeparated [Expr] -> m ()
- doIndent :: MonadState PrinterState m => m ()
- newLine :: MonadState PrinterState m => m ()
- newLineAndDoIndent :: MonadState PrinterState m => m ()
- putExpression :: MonadState PrinterState m => Expr -> m ()
- expressionPrint :: [Expr] -> String
Documentation
>>>
import Control.Monad.State (State)
>>>
:{
let test :: PrinterState -> State PrinterState a -> PrinterState test initState state = execState state initState testInit :: State PrinterState a -> PrinterState testInit = test initPrinterState :}
data PrinterState Source #
PrinterState | |
|
indentStack :: Lens' PrinterState [Int] Source #
printerState :: Int -> Int -> [Int] -> String -> PrinterState Source #
latestIndent :: Lens' PrinterState Int Source #
This assumes that the indent stack is not empty.
popIndent :: MonadState PrinterState m => m () Source #
setIndentAtCurrChar :: MonadState PrinterState m => m () Source #
putOpeningSymbol :: MonadState PrinterState m => String -> m () Source #
putClosingSymbol :: MonadState PrinterState m => String -> m () Source #
putComma :: MonadState PrinterState m => m () Source #
putCommaSep :: forall m. MonadState PrinterState m => CommaSeparated [Expr] -> m () Source #
putString :: MonadState PrinterState m => String -> m () Source #
:: MonadState PrinterState m | |
=> String | starting character ( |
-> String | ending character ( |
-> CommaSeparated [Expr] | comma separated inner expression. |
-> m () |
Print a surrounding expression (like []
or {}
or ()
).
If the CommaSeparated
expressions are empty, just print the start and end
markers.
>>>
testInit $ putSurroundExpr "[" "]" (CommaSeparated [])
PrinterState {_currLine = 0, _currCharOnLine = 2, _indentStack = [0], _printerString = "[]"}
>>>
let state = printerState 1 5 [5,0] "\nhello"
>>>
test state $ putSurroundExpr "(" ")" (CommaSeparated [[]])
PrinterState {_currLine = 1, _currCharOnLine = 7, _indentStack = [5,0], _printerString = "\nhello()"}
If there is only one expression, then just print it it all on one line, with spaces around the expressions.
>>>
testInit $ putSurroundExpr "{" "}" (CommaSeparated [[Other "hello", Other "bye"]])
PrinterState {_currLine = 0, _currCharOnLine = 12, _indentStack = [0], _printerString = "{ hellobye }"}
If there are multiple expressions, and this is indent level 0, then print out normally and put each expression on a different line with a comma. No indentation happens.
>>>
comma = [[Other "hello"], [Other "bye"]]
>>>
testInit $ putSurroundExpr "[" "]" (CommaSeparated comma)
PrinterState {_currLine = 2, _currCharOnLine = 1, _indentStack = [0], _printerString = "[ hello\n, bye\n]"}
doIndent :: MonadState PrinterState m => m () Source #
newLine :: MonadState PrinterState m => m () Source #
newLineAndDoIndent :: MonadState PrinterState m => m () Source #
putExpression :: MonadState PrinterState m => Expr -> m () Source #
expressionPrint :: [Expr] -> String Source #