adam@1: con pattern :: Type -> Type -> Type adam@1: adam@1: con tagInternal :: {Unit} -> Type adam@1: adam@4: val null : pattern unit (variant []) adam@4: adam@1: val tag : attrs ::: {Unit} -> folder attrs -> string -> $(mapU string attrs) adam@1: -> pattern (tagInternal attrs) {Attrs : $(mapU string attrs), Cdata : option string} adam@1: adam@3: val tagA : attrs ::: {Unit} -> folder attrs -> string -> $(mapU string attrs) adam@3: -> pattern (tagInternal attrs) $(mapU string attrs) adam@3: val tagC : string -> pattern (tagInternal []) string adam@3: adam@1: con childrenInternal :: Type -> {Type} -> Type adam@1: adam@1: val children : parentI ::: Type -> parent ::: Type -> children ::: {(Type * Type)} adam@1: -> pattern parentI parent -> $(map (fn (i, d) => pattern i d) children) -> folder children adam@1: -> pattern (childrenInternal parentI (map fst children)) (parent * $(map snd children)) adam@1: adam@4: con treeInternal :: Type -> Type -> Type adam@4: adam@4: val tree : parentI ::: Type -> parent ::: Type -> childI ::: Type -> child ::: Type adam@4: -> pattern parentI parent -> pattern childI child adam@4: -> pattern (treeInternal parentI childI) (parent * child) adam@4: adam@1: val app : internal ::: Type -> data ::: Type -> pattern internal data -> (data -> transaction {}) -> string -> transaction {}