aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/control/fold.lux
blob: 504f41f587afd2e4e53f178aaf5b34b197c56b2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(.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)))