module DynEditorExample import Data.Func, Data.Functor, Data.Maybe import iTasks, iTasks.UI.Editor.Modifiers import DynamicEditor // non-typesafe expression :: Expr = IntLit Int | RealLit Real | Plus Expr Expr | ToInt Expr | ToReal Expr | Eq Expr Expr // expression with phantom type :: TypedExpr a =: TypedExpr Expr derive class iTask Expr, TypedExpr dslEditor :: DynamicEditor (TypedExpr a) dslEditor = DynamicEditor ( [ functionConsDyn "plus" "plus" ( dynamic \(TypedExpr x) (TypedExpr y) -> TypedExpr (Plus x y) :: A.b: (TypedExpr b) (TypedExpr b) -> TypedExpr b ) , functionCons "toInt" "to integer" toIntExpr , functionCons "toReal" "to decimal" toRealExpr , customEditorCons "int" "(enter integer)" (bijectEditorValue (\(TypedExpr (IntLit i)) -> i) intLit gEditor{|*|}) , customEditorCons "real" "(enter decimal)" (bijectEditorValue (\(TypedExpr (RealLit r)) -> r) realLit gEditor{|*|}) , functionConsDyn "eq" "are equal" ( dynamic \(TypedExpr x) (TypedExpr y) -> TypedExpr (Eq x y) :: A.b: (TypedExpr b) (TypedExpr b) -> TypedExpr Bool ) ] ) where toIntExpr :: (TypedExpr Real) -> TypedExpr Int toIntExpr (TypedExpr x) = TypedExpr (ToInt x) toRealExpr :: (TypedExpr Int) -> TypedExpr Real toRealExpr (TypedExpr x) = TypedExpr (ToReal x) intLit :: Int -> TypedExpr Int intLit i = TypedExpr (IntLit i) realLit :: Real -> TypedExpr Real realLit r = TypedExpr (RealLit r) // possible results can be Int, Real // Bool does not work yet enterExpr :: Task (Maybe (DynamicEditorValue (TypedExpr Int))) enterExpr = enterInformation () [EnterUsing id $ dynamicEditor dslEditor] >&> viewSharedInformation () [ViewAs $ fmap $ toValue dslEditor] Start world = doTasks enterExpr world