mirror of
https://github.com/IBM/fp-go.git
synced 2025-11-23 22:14:53 +02:00
69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
package tuple
|
|
|
|
import (
|
|
O "github.com/ibm/fp-go/ord"
|
|
)
|
|
|
|
// Ord1 implements ordering on a 1-tuple
|
|
func Ord1[T1 any](o1 O.Ord[T1]) O.Ord[Tuple1[T1]] {
|
|
return O.MakeOrd(func(l, r Tuple1[T1]) int {
|
|
return o1.Compare(l.F1, r.F1)
|
|
}, func(l, r Tuple1[T1]) bool {
|
|
return o1.Equals(l.F1, r.F1)
|
|
})
|
|
}
|
|
|
|
// Ord2 implements ordering on a 2-tuple
|
|
func Ord2[T1, T2 any](o1 O.Ord[T1], o2 O.Ord[T2]) O.Ord[Tuple2[T1, T2]] {
|
|
return O.MakeOrd(func(l, r Tuple2[T1, T2]) int {
|
|
c := o1.Compare(l.F1, r.F1)
|
|
if c != 0 {
|
|
return c
|
|
}
|
|
c = o2.Compare(l.F2, r.F2)
|
|
return c
|
|
}, func(l, r Tuple2[T1, T2]) bool {
|
|
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2)
|
|
})
|
|
}
|
|
|
|
// Ord3 implements ordering on a 3-tuple
|
|
func Ord3[T1, T2, T3 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3]) O.Ord[Tuple3[T1, T2, T3]] {
|
|
return O.MakeOrd(func(l, r Tuple3[T1, T2, T3]) int {
|
|
c := o1.Compare(l.F1, r.F1)
|
|
if c != 0 {
|
|
return c
|
|
}
|
|
c = o2.Compare(l.F2, r.F2)
|
|
if c != 0 {
|
|
return c
|
|
}
|
|
c = o3.Compare(l.F3, r.F3)
|
|
return c
|
|
}, func(l, r Tuple3[T1, T2, T3]) bool {
|
|
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3)
|
|
})
|
|
}
|
|
|
|
// Ord4 implements ordering on a 4-tuple
|
|
func Ord4[T1, T2, T3, T4 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4]) O.Ord[Tuple4[T1, T2, T3, T4]] {
|
|
return O.MakeOrd(func(l, r Tuple4[T1, T2, T3, T4]) int {
|
|
c := o1.Compare(l.F1, r.F1)
|
|
if c != 0 {
|
|
return c
|
|
}
|
|
c = o2.Compare(l.F2, r.F2)
|
|
if c != 0 {
|
|
return c
|
|
}
|
|
c = o3.Compare(l.F3, r.F3)
|
|
if c != 0 {
|
|
return c
|
|
}
|
|
c = o4.Compare(l.F4, r.F4)
|
|
return c
|
|
}, func(l, r Tuple4[T1, T2, T3, T4]) bool {
|
|
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4)
|
|
})
|
|
}
|