packages feed

atomo-0.4.0.2: src/Atomo/Kernel/Format.hs

{-# LANGUAGE QuasiQuotes #-}
module Atomo.Kernel.Format where

import Control.Monad.RWS
import Text.Parsec (runParser)
import Text.PrettyPrint

import Atomo
import Atomo.Format
import Atomo.Format.Parser
import Atomo.Format.Types
import Atomo.Pretty


load :: VM ()
load = do
    ([p|Formatter|] =::) =<< eval [e|Object clone|]

    [p|Formatter new: (s: String)|] =: do
        s <- getString [e|s|]
        case runParser parser (FParserState [] []) "<new:>" s of
            Right fs ->
                [e|Formatter|] `newWith`
                    [ ("format", haskell fs)
                    ]
            Left er ->
                raise ["formatting-parse"] [string (show er)]

    [p|(f: Formatter) % (... inputs)|] =: do
        fs <- eval [e|f format|] >>= fromHaskell
        is <- getList [e|inputs|]
        (_, f) <- evalRWST format fs (startState is)
        return (String f)

    [p|(f: Formatter) pretty|] =: do
        fs <- eval [e|f format|] >>= fromHaskell
        [e|Pretty|] `newWith`
            [ ("doc", haskell (char 'f' <> doubleQuotes (pretty (fs :: Format))))
            ]