definition module uFPL from StdGeneric import :: Bimap from StdOverloaded import class +, class -, class *, class /, class ==, class < from uFPL.C import :: CType, :: CExpr, :: CBody, :: CVar, :: CFun, :: CProg :: RO = RO :: RW = RW :: UShared t w = { sname :: String , stype :: CType , sinit :: t , srepr :: Bimap t CExpr } :: Shares = NoShares | E.t rw: Shares (UShared t rw) Shares & Expr t removeDupShares :: Shares -> Shares sharesMap :: (A.t rw: (UShared t rw) -> a | Expr t) Shares -> [a] class allShares t where allShares` :: t -> Shares allShares :: t -> Shares allShares x :== removeDupShares (allShares` x) instance allShares [t] | allShares t instance allShares (Expr t rw) | Expr t instance allShares Trigger instance allShares Rule instance allShares NamedRule class Expr t | TC t where litExpr :: t -> CExpr instance Expr Int instance Expr Bool instance Expr Char :: Expr t rw = ELit t | EShared (UShared t rw) | E.rwa rwb: (+.) infixl 6 (Expr t rwa) (Expr t rwb) & + t | E.rwa rwb: (-.) infixl 6 (Expr t rwa) (Expr t rwb) & - t | E.rwa rwb: (*.) infixl 7 (Expr t rwa) (Expr t rwb) & * t | E.rwa rwb: (/.) infixl 7 (Expr t rwa) (Expr t rwb) & / t | E.rwa rwb u: EEq (Bimap t Bool) (Expr u rwa) (Expr u rwb) & Expr, == u | E.rwa rwb u: ELt (Bimap t Bool) (Expr u rwa) (Expr u rwb) & Expr, < u | E.rwa rwb: EAnd (Bimap t Bool) (Expr Bool rwa) (Expr Bool rwb) | E.rwa rwb: EOr (Bimap t Bool) (Expr Bool rwa) (Expr Bool rwb) | E.rwa rwb rwc: EIf (Expr Bool rwa) (Expr t rwb) (Expr t rwc) lit :: (t -> Expr t RO) (?) infix 4 :: (Expr Bool rwa) (Expr t rwb, Expr t rwc) -> Expr t RO (==.) infix 4 :: (Expr t rwa) (Expr t rwb) -> Expr Bool RO | Expr, == t (<.) infix 4 :: (Expr t rwa) (Expr t rwb) -> Expr Bool RO | Expr, < t (>.) infix 4 :: (Expr t rwa) (Expr t rwb) -> Expr Bool RO | Expr, < t (&&.) infixr 3 :: (Expr Bool rwa) (Expr Bool rwb) -> Expr Bool RO (||.) infixr 4 :: (Expr Bool rwa) (Expr Bool rwb) -> Expr Bool RO :: Trigger = E.t rw: Change (Expr t rw) & Expr t | E.t rwa rwb: (?=) (Expr t rwa) (Expr t rwb) & Expr, == t | (?&) infixr 3 Trigger Trigger | (?|) infixr 4 Trigger Trigger :: Rule = E.t rw: (<#) infix 3 (Expr t RW) (Expr t rw) & Expr t | E.rw: When (Expr Bool rw) [Rule] | (>>>) infixr 2 Trigger [Rule] | E.rwa rwb: SetCursor (Expr Int rwa, Expr Int rwb) | E.t rw: Print (Expr t rw) & Expr t :: NamedRule = E.r: (:=:) infix 1 String r & gen r CBody & allShares r & TC r class gen f t :: f -> t class (:.) infixr 2 r :: Rule r -> [Rule] instance :. Rule instance :. [Rule] class (|||) infixr 0 r :: NamedRule r -> [NamedRule] instance ||| NamedRule instance ||| [NamedRule] instance gen (Expr t rw) CExpr | Expr t instance gen (UShared t rw) CVar instance gen Trigger CExpr instance gen Rule CBody instance gen [r] CBody | gen r CBody instance gen NamedRule CFun instance gen NamedRule CProg instance gen [NamedRule] CProg