{-# LANGUAGE UndecidableInstances #-} module Main where import Data.FunctionBuilder data Hello = MkHello String instance HasFunctionBuilder String Hello where type ToFunction String Hello next = next toFunctionBuilder (MkHello !s) = immediate s data HelloP = MkHelloP instance DynamicContent String HelloP String where addParameter _ = deferred ("HelloP: " ++) instance HasFunctionBuilder String HelloP where type ToFunction String HelloP next = String -> next toFunctionBuilder = addParameter data SetStringParam a = MkSetter a String instance DynamicContent String a String => HasFunctionBuilder String (SetStringParam a) where type ToFunction String (SetStringParam a) r = r toFunctionBuilder (MkSetter f str) = fillParameter (addParameter f) str data AssignParameter w a b where MkAssignParameter ::DynamicContent w a b => a -> b -> AssignParameter w a b instance StaticContent w (AssignParameter w a b) where addStaticContent (MkAssignParameter !a !b) = fillParameter (addParameter a) b instance HasFunctionBuilder w (AssignParameter w a b) where toFunctionBuilder = addStaticContent type FBStr a b = FunctionBuilder String a b main :: IO () main = if toFunction (toFunctionBuilder (MkHello "test") :: FBStr String String) == ("test" :: String) && toFunction (addParameter MkHelloP :: FBStr String (String -> String)) "test" == "HelloP: test" && toFunction (toFunctionBuilder (MkSetter MkHelloP "test") :: FBStr String String) == "HelloP: test" then return () else error "Tests failed."