    module Text.Jasmine
        (
          minify
        , minifym
        , minifyBb
        , minifyFile
        ) where

    --import Text.Jasmine.Parse
    import Language.JavaScript.Parser (readJs, parse, JSNode(..))
    import Text.Jasmine.Pretty
    import qualified Blaze.ByteString.Builder as BB
    import qualified Data.ByteString.Lazy as LB
    import qualified Data.ByteString.Lazy.Char8 as S8
    import Data.Text.Lazy (unpack)
    import Data.Text.Lazy.Encoding (decodeUtf8With)
    import Data.Text.Encoding.Error (lenientDecode)

    minifym :: LB.ByteString -> Either String LB.ByteString
    minifym s = case parse' s of
                 Left msg -> Left (show msg)
                 Right p  -> Right $ BB.toLazyByteString $ renderJS p

    minifyBb :: LB.ByteString -> Either String BB.Builder
    minifyBb s = case parse' s  of
                 Left msg -> Left (show msg)
                 Right p  -> Right (renderJS p)

    minify :: LB.ByteString -> LB.ByteString
    --minify s = BB.toLazyByteString $ renderJS $ readJs s
    minify s = BB.toLazyByteString $ renderJS $ readJs (lbToStr s)

    _minify' :: LB.ByteString -> BB.Builder
    _minify' s = renderJS $ readJs (lbToStr s)

    minifyFile :: FilePath -> IO LB.ByteString
    minifyFile filename =
      do
         x <- LB.readFile (filename)
         return $ minify x

    --parse' :: S8.ByteString -> Either ParseError JSNode
    parse'
      :: S8.ByteString -> Either String JSNode
    parse' input = parse (lbToStr input) "src"

    lbToStr :: S8.ByteString -> [Char]
    lbToStr = unpack . decodeUtf8With lenientDecode

    _strToLb :: String -> S8.ByteString
    _strToLb str = S8.pack str

    -- EOF