 
 (defprotocol ITimeArithmetic
   (+ [_ _] "Add time")
-  (- [_ _] "Subtract time")
+  (- [_ _] "Subtract time"))
+
+(defprotocol ITimeIncDec
   (inc [_] "Increment time")
-  (dec [_] "Decrement time")
-  (maximum [_ _] "Return maximum")
-  (minimum [_ _] "Return minimum"))
+  (dec [_] "Decrement time"))
 
 (defn max [arg & args]
   (reduce #(maximum %1 %2) arg args))

  ITimeArithmetic
  (+ [t x] (.plus t x))
  (- [t x] (.minus t x))
  (inc [t] (+ t (seconds 1)))
  (dec [t] (- t (seconds 1)))
  (maximum [x y] (if (neg? (compare x y)) y x))
  (minimum [x y] (if (neg? (compare x y)) x y))
  ITimeRangeable
  (range
    ([from] (iterate #(.plusSeconds % 1) from))

(extend-type LocalTime
  ITimeArithmetic
  (+ [t x] (.plus t x))
  (- [t x] (.minus t x)))

(extend-type YearMonth
  ITimeArithmetic
  (+ [t x] (.plus t x))
  (- [t x] (.minus t x))

  ITimeIncDec
  (inc [t] (.plusMonths t 1))
  (dec [t] (.minusMonths t 1))

  ITimeRangeable
  (range
    ([from] (iterate #(.plusMonths % 1) from))
