implementation module uFPL.Util import StdClass from StdFunc import id, o import StdInt import StdList import StdOverloaded import StdString from Text import class Text(concat), instance Text String instance zero PrState where zero = { indent = 0 , output = [] } printToString :: a -> String | print a printToString x = concat (print x zero).output instance print (PrState -> PrState) where print p = p instance print String where print s = \st -> {st & output=[s:st.output]} instance print Int where print i = \st -> {st & output=[toString i:st.output]} nl :: PrState -> PrState nl st = {st & output=["\n":repeatn st.indent "\t"] ++ st.output} indent :: PrState -> PrState indent st = {st & indent=max 0 (st.indent - 1)} unindent :: PrState -> PrState unindent st = {st & indent=st.indent + 1} prsperse :: a [b] -> PrState -> PrState | print a & print b prsperse _ [] = id prsperse _ [x] = print x prsperse g [x:xs] = print x o print g o prsperse g xs