stringbuilder-0.1.0: src/Data/String/Builder.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-- |
-- `build` can be used to construct multi-line string literals in a monadic
-- way.
--
-- > {-# LANGUAGE OverloadedStrings #-}
-- >
-- > import Data.String.Builder
-- >
-- > mystring :: String
-- > mystring = build $ do
-- > "foo"
-- > "bar"
-- > "baz"
--
-- `return` and `>>=` are not useful in this context!
module Data.String.Builder (build, Builder) where
import Prelude hiding (undefined)
import Data.String
import Control.Monad.Trans.Writer
undefined :: a
undefined = error "Data.String.Builder.undefined"
newtype BuilderM a = BuilderM { runBuilderM :: Writer String a }
deriving Monad
type Builder = BuilderM ()
literal :: String -> Builder
literal = BuilderM . tell
instance IsString (BuilderM a) where
fromString s = literal s >> literal "\n" >> return undefined
build :: Builder -> String
build = snd . runWriter . runBuilderM