multiless.go 695 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package missinggo
  2. type (
  3. SameLessFunc func() (same, less bool)
  4. MultiLess struct {
  5. ok bool
  6. less bool
  7. }
  8. )
  9. func (me *MultiLess) Less() bool {
  10. return me.ok && me.less
  11. }
  12. func (me *MultiLess) Final() bool {
  13. if !me.ok {
  14. panic("undetermined")
  15. }
  16. return me.less
  17. }
  18. func (me *MultiLess) FinalOk() (left, ok bool) {
  19. return me.less, me.ok
  20. }
  21. func (me *MultiLess) Next(f SameLessFunc) {
  22. if me.ok {
  23. return
  24. }
  25. same, less := f()
  26. if same {
  27. return
  28. }
  29. me.ok = true
  30. me.less = less
  31. }
  32. func (me *MultiLess) StrictNext(same, less bool) {
  33. if me.ok {
  34. return
  35. }
  36. me.Next(func() (bool, bool) { return same, less })
  37. }
  38. func (me *MultiLess) NextBool(l, r bool) {
  39. me.StrictNext(l == r, l)
  40. }