1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-11-23 22:14:53 +02:00
Files
fp-go/tuple/ord.go
Dr. Carsten Leue c07df5c771 initial checkin
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
2023-07-07 22:31:06 +02:00

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)
})
}