adam@6: (** Derived functions dealing with polymorphic variants *) adam@6: adam@6: val read : r ::: {Unit} -> t ::: Type -> folder r -> $(mapU t r) -> variant (mapU {} r) -> t adam@6: val write : r ::: {Unit} -> t ::: Type -> folder r -> $(mapU t r) -> variant (mapU {} r) -> t -> $(mapU t r) adam@6: adam@6: val search : r ::: {Unit} -> t ::: Type -> (variant (mapU {} r) -> option t) -> folder r -> option t adam@6: val find : r ::: {Unit} -> (variant (mapU {} r) -> bool) -> folder r -> option (variant (mapU {} r)) adam@6: adam@6: val test : nm :: Name -> t ::: Type -> ts ::: {Type} -> [[nm] ~ ts] => folder ([nm = t] ++ ts) adam@6: -> variant ([nm = t] ++ ts) -> option t adam@6: val testLess : nm :: Name -> t ::: Type -> ts ::: {Type} -> [[nm] ~ ts] => folder ts -> variant ([nm = t] ++ ts) -> option t adam@6: adam@6: val testEq : K --> f :: (K -> Type) -> nm :: Name -> t ::: K -> ts ::: {K} -> r ::: {K} -> [[nm] ~ ts] => adam@6: Eq.eq r ([nm = t] ++ ts) adam@6: -> folder r adam@6: -> variant (map f r) -> option (f t) adam@6: adam@6: val eq : r ::: {Unit} -> folder r -> variant (mapU {} r) -> variant (mapU {} r) -> bool adam@6: adam@6: val makeEq : K --> f :: (K -> Type) -> nm :: Name -> t ::: K -> ts ::: {K} -> r ::: {K} -> [[nm] ~ ts] => adam@6: Eq.eq r ([nm = t] ++ ts) adam@6: -> f t adam@6: -> variant (map f r) adam@6: adam@6: val fold : r ::: {Unit} -> t ::: Type -> folder r -> (variant (mapU {} r) -> t -> t) -> t -> t adam@6: adam@20: val foldR : tr ::: Type -> r ::: {Unit} -> t ::: Type -> folder r -> (variant (mapU {} r) -> tr -> t -> t) -> $(mapU tr r) -> t -> t adam@20: adam@20: val appR : m ::: (Type -> Type) -> monad m adam@20: -> tr ::: Type -> r ::: {Unit} -> folder r -> (variant (mapU {} r) -> tr -> m {}) -> $(mapU tr r) -> m {} adam@20: adam@6: val destrR : K --> f :: (K -> Type) -> fr :: (K -> Type) -> t ::: Type adam@6: -> (p :: K -> f p -> fr p -> t) adam@6: -> r ::: {K} -> folder r -> variant (map f r) -> $(map fr r) -> t adam@6: adam@6: val destr2R : K --> f1 :: (K -> Type) -> f2 :: (K -> Type) -> fr :: (K -> Type) -> t ::: Type adam@6: -> (p :: K -> f1 p -> f2 p -> fr p -> t) adam@6: -> r ::: {K} -> folder r -> variant (map f1 r) -> variant (map f2 r) -> $(map fr r) -> option t