adam@11: fun numFields [r ::: {Type}] (fl : folder r) (r : $r) : int = adam@11: @fold [fn _ => int] (fn [nm ::_] [u ::_] [r ::_] [[nm] ~ r] acc => acc+1) 0 fl adam@11: adam@10: fun mem [a ::: Type] [ns ::: {Unit}] (_ : eq a) (fl : folder ns) (x : a) (r : $(mapU a ns)) : bool = adam@10: @foldUR [a] [fn _ => bool] adam@10: (fn [nm ::_] [r ::_] [[nm] ~ r] y acc => adam@10: acc || x = y) adam@10: False fl r adam@12: adam@12: fun equal [ts ::: {Type}] (eqs : $(map eq ts)) (fl : folder ts) (r1 : $ts) (r2 : $ts) : bool = adam@18: @foldR3 [eq] [ident] [ident] [fn _ => bool] adam@12: (fn [nm ::_] [t ::_] [r ::_] [[nm] ~ r] isEq x y acc => adam@12: acc && @eq isEq x y) adam@12: True fl eqs r1 r2 ezyang@28: ezyang@28: fun ap [K] [tf1 :: K -> Type] [tf2 :: K -> Type] ezyang@28: [r ::: {K}] (fl : folder r) (fs : $(map (fn t => tf1 t -> tf2 t) r)) (xs : $(map tf1 r)) ezyang@28: = @map2 [fn t => tf1 t -> tf2 t] [fn t => tf1 t] [tf2] (fn [t] f x => f x) fl fs xs