HaRe-0.6: tools/property/syntax/PropSyntaxStruct.hs
module PropSyntaxStruct (module PropSyntaxStruct,module P) where
import BaseSyntax as P
import HsPropStruct as P
import HsPropMaps as P
import HsPropPretty
import HasBaseStruct
import HasPropStruct
import NameMaps
import PrettyPrint
import HsDeclPretty(ppContext)
import SrcLoc
import MUtils
import MapDeclM
import Recursive(struct)
data Q c t = c:=>t deriving (Eq,Show)
--type PropEI i e p ds t c = EI i e p ds t c
type PropDI i e p ds t c tp pa pp = Prop (DI i e p ds t c tp) (PD i pa pp)
data Prop b p = Base b | Prop p deriving (Eq,Show)
prop bf pf (Base b) = bf b
prop bf pf (Prop p) = pf p
recprop f g = prop f g . struct
mapProp bf pf = prop (Base . bf) (Prop . pf)
mapMProp bf pf = prop (fmap Base . bf) (fmap Prop . pf)
mapBase f = mapProp f id
isBase p = prop p (const False)
maybeBase f = prop f (const Nothing)
maybeProp = prop (const Nothing)
listBase f = prop f (const [])
seqProp (Base b) = Base # b
seqProp (Prop p) = Prop # p
instance HasBaseStruct (Prop b p) b where base = Base
instance GetBaseStruct (Prop b p) b where basestruct = maybeBase Just
instance HasPropStruct (Prop b p) p where proprec = Prop
instance GetPropStruct (Prop b p) p where propstruct = maybeProp Just
--------------------------------------------------------------------------------
instance (AccNames i b,AccNames i p) => AccNames i (Prop b p) where
accNames f = prop (accNames f) (accNames f)
instance (AccNames i c,AccNames i t) => AccNames i (Q c t) where
accNames f (c:=>t) = accNames f c . accNames f t
--------------------------------------------------------------------------------
instance (HasSrcLoc b,HasSrcLoc p) => HasSrcLoc (Prop b p) where
srcLoc = prop srcLoc srcLoc
instance (MapDeclM b ds,MapDeclM p ds) => MapDeclM (Prop b p) ds where
mapDeclM f = mapMProp (mapDeclM f) (mapDeclM f)
instance (Printable b,Printable p) => Printable (Prop b p) where
ppi = prop ppi ppi
wrap = prop wrap wrap
instance (Printable c,Printable t) => Printable (Q c t) where
ppi (c:=>t) = ppContext (ppis c)<+>t