{-# OPTIONS_GHC -fno-warn-name-shadowing #-} {-# LANGUAGE RecursiveDo #-} module Parser(main) where import qualified Graphics.UI.Threepenny as UI import Graphics.UI.Threepenny.Core import Graphics.UI.Threepenny.Editors import Control.Monad import Data.Maybe import Language.Haskell.Exts {----------------------------------------------------------------------------- Main ------------------------------------------------------------------------------} main :: IO () main = startGUI defaultConfig setup example :: String example = unlines ["module Main(main) where" ,"" ,"main :: IO ()" ,"main = putStrLn \"Hello World!\"" ] parser :: ParseMode -> String -> String parser mode x = case parseFileContentsWithMode mode x of ParseOk x -> show $ Control.Monad.void x x@ParseFailed{} -> show x pMode :: UI (Element, Behavior ParseMode) pMode = do filename <- UI.input language <- UI.select #+ [UI.option # set text (show x) | x <- knownLanguages] # set UI.selection (Just 0) ignore <- UI.input # set (attr "type") "checkbox" layout <- grid [[string "Filename", element filename] ,[string "Language", element language] ,[string "Ignore pragmas", element ignore]] filename <- stepper "" $ UI.valueChange filename language <- fmap (fmap ((!!) knownLanguages . fromMaybe 0)) $ stepper Nothing $ UI.selectionChange language ignore <- stepper False $ UI.checkedChange ignore let val = (\f l i -> defaultParseMode{parseFilename=f, baseLanguage=l, ignoreLanguagePragmas=i}) <$> filename <*> language <*> ignore return (layout, val) pModeEditor :: Editor ParseMode Layout ParseMode pModeEditor = (\f l i -> defaultParseMode{parseFilename=f, baseLanguage=l, ignoreLanguagePragmas=i}) <$> field "Filename" parseFilename editorString -*- field "Language" baseLanguage (editorJust $ editorSelection (pure knownLanguages) (pure (string . show))) -*- field "Ignore pragmas" ignoreLanguagePragmas editor pMode' :: UI (UI Element, Behavior ParseMode) pMode' = mdo parseModeE <- create pModeEditor parseModeB parseModeB <- stepper defaultParseMode (edited parseModeE) return (render parseModeE, parseModeB) setup :: Window -> UI () setup window = void $ do _ <- return window # set title "HSE parser" mode <- pMode mode2 <- pMode' source <- UI.textarea # set UI.style [("width","600px"),("height","250px")] # set value example sourceVal <- stepper example $ UI.valueChange source output <- UI.textarea # set UI.style [("width","600px"),("height","250px")] # set (attr "readonly") "readonly" # sink value (parser <$> snd mode <*> sourceVal) getBody window #+ [row [column [element source, element output], element $ fst mode, fst mode2]]