aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/abstract/monoid.lux
blob: 33d082020e4014eaf7dd444ae69174b3afa0c67c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(.module:
  [lux #*])

(signature: #export (Monoid a)
  {#.doc (doc "A way to compose values."
              "Includes an identity value which does not alter any other value when combined with.")}
  (: a
     identity)
  (: (-> a a a)
     compose))

(def: #export (compose Monoid<l> Monoid<r>)
  (All [l r] (-> (Monoid l) (Monoid r) (Monoid [l r])))
  (structure (def: identity
               [(:: Monoid<l> identity) (:: Monoid<r> identity)])
             
             (def: (compose [lL rL] [lR rR])
               [(:: Monoid<l> compose lL lR)
                (:: Monoid<r> compose rL rR)])))