(.module: [lux #*] [// [monoid (#+ Monoid)]]) (signature: #export (Fold F) {#.doc "Iterate over a structure's values to build a summary value."} (: (All [a b] (-> (-> b a a) a (F b) a)) fold)) (def: #export (with-monoid monoid fold value) (All [F a] (-> (Monoid a) (Fold F) (F a) a)) (let [(^open "monoid;.") monoid] (fold monoid;compose monoid;identity value)))