compare.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package help
  2. type comparer func(interface{}, interface{}) int
  3. // Comparable is an interface that has to be implemented by a custom collection
  4. // elements in order to work with linq.
  5. //
  6. // Example:
  7. // func (f foo) CompareTo(c Comparable) int {
  8. // a, b := f.f1, c.(foo).f1
  9. //
  10. // if a < b {
  11. // return -1
  12. // } else if a > b {
  13. // return 1
  14. // }
  15. //
  16. // return 0
  17. // }
  18. type Comparable interface {
  19. CompareTo(Comparable) int
  20. }
  21. func getComparer(data interface{}) comparer {
  22. switch data.(type) {
  23. case int:
  24. return func(x, y interface{}) int {
  25. a, b := x.(int), y.(int)
  26. switch {
  27. case a > b:
  28. return 1
  29. case b > a:
  30. return -1
  31. default:
  32. return 0
  33. }
  34. }
  35. case int8:
  36. return func(x, y interface{}) int {
  37. a, b := x.(int8), y.(int8)
  38. switch {
  39. case a > b:
  40. return 1
  41. case b > a:
  42. return -1
  43. default:
  44. return 0
  45. }
  46. }
  47. case int16:
  48. return func(x, y interface{}) int {
  49. a, b := x.(int16), y.(int16)
  50. switch {
  51. case a > b:
  52. return 1
  53. case b > a:
  54. return -1
  55. default:
  56. return 0
  57. }
  58. }
  59. case int32:
  60. return func(x, y interface{}) int {
  61. a, b := x.(int32), y.(int32)
  62. switch {
  63. case a > b:
  64. return 1
  65. case b > a:
  66. return -1
  67. default:
  68. return 0
  69. }
  70. }
  71. case int64:
  72. return func(x, y interface{}) int {
  73. a, b := x.(int64), y.(int64)
  74. switch {
  75. case a > b:
  76. return 1
  77. case b > a:
  78. return -1
  79. default:
  80. return 0
  81. }
  82. }
  83. case uint:
  84. return func(x, y interface{}) int {
  85. a, b := x.(uint), y.(uint)
  86. switch {
  87. case a > b:
  88. return 1
  89. case b > a:
  90. return -1
  91. default:
  92. return 0
  93. }
  94. }
  95. case uint8:
  96. return func(x, y interface{}) int {
  97. a, b := x.(uint8), y.(uint8)
  98. switch {
  99. case a > b:
  100. return 1
  101. case b > a:
  102. return -1
  103. default:
  104. return 0
  105. }
  106. }
  107. case uint16:
  108. return func(x, y interface{}) int {
  109. a, b := x.(uint16), y.(uint16)
  110. switch {
  111. case a > b:
  112. return 1
  113. case b > a:
  114. return -1
  115. default:
  116. return 0
  117. }
  118. }
  119. case uint32:
  120. return func(x, y interface{}) int {
  121. a, b := x.(uint32), y.(uint32)
  122. switch {
  123. case a > b:
  124. return 1
  125. case b > a:
  126. return -1
  127. default:
  128. return 0
  129. }
  130. }
  131. case uint64:
  132. return func(x, y interface{}) int {
  133. a, b := x.(uint64), y.(uint64)
  134. switch {
  135. case a > b:
  136. return 1
  137. case b > a:
  138. return -1
  139. default:
  140. return 0
  141. }
  142. }
  143. case float32:
  144. return func(x, y interface{}) int {
  145. a, b := x.(float32), y.(float32)
  146. switch {
  147. case a > b:
  148. return 1
  149. case b > a:
  150. return -1
  151. default:
  152. return 0
  153. }
  154. }
  155. case float64:
  156. return func(x, y interface{}) int {
  157. a, b := x.(float64), y.(float64)
  158. switch {
  159. case a > b:
  160. return 1
  161. case b > a:
  162. return -1
  163. default:
  164. return 0
  165. }
  166. }
  167. case string:
  168. return func(x, y interface{}) int {
  169. a, b := x.(string), y.(string)
  170. switch {
  171. case a > b:
  172. return 1
  173. case b > a:
  174. return -1
  175. default:
  176. return 0
  177. }
  178. }
  179. case bool:
  180. return func(x, y interface{}) int {
  181. a, b := x.(bool), y.(bool)
  182. switch {
  183. case a == b:
  184. return 0
  185. case a:
  186. return 1
  187. default:
  188. return -1
  189. }
  190. }
  191. default:
  192. return func(x, y interface{}) int {
  193. a, b := x.(Comparable), y.(Comparable)
  194. return a.CompareTo(b)
  195. }
  196. }
  197. }