{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-
A webb with a Music Suite-aware interpreter
Requires threepenny-gui-0.4.2.0
-}
module Main where
import Data.Either
import qualified Data.Map as Map
import Data.Maybe
import Data.Traversable
import Music.Prelude hiding ((#), element, set, text, option, pre, never)
import qualified Music.Score as Score
-- import qualified Data.List
-- import System.Random
import Graphics.UI.Threepenny
import Graphics.UI.Threepenny.Core
import Graphics.UI.Threepenny.Elements
main :: IO ()
main = do
startGUI defaultConfig
{ tpPort = Just 1032
, tpStatic = Nothing
}
-- setup
(runR $ buttonR "Test")
-- Data that:
-- Can be used to create some GUI (in UI)
-- May vary depending on user input (in UI)
data R a = R {
getR :: Element -> UI (Event a)
}
buttonR :: String -> R ()
buttonR t = R $ \p -> do
e <- set text t $ button
return p #+ [return e]
return $ fmap (const ()) $ click e
-- rowR :: [R a] -> R a
-- rowR rs = R (\e -> fmap (($ e) . getR) rs)
runR :: Show a => R a -> Window -> UI ()
runR (R r) window = do
p <- getBody window
e <- r p
stop <- liftIO $ register e print
-- stop is never called
return ()
setup :: Window -> UI ()
setup window = do
body <- getBody window
presets <- select
return presets #+ [option # set text "Foo", option # set text "Bar"]
input <- textarea # set text "" # set rows "20" # set cols "80"
button <- button # set text "Compile"
result1 <- pre
(accumB "|" $ fmap (const (\x -> x ++ "|")) $ valueChange input) >>= \presetB ->
sink text presetB $ return result1
return body #+ [column [
return presets,
return input,
return button,
return result1
]]
return ()