 
   Otherwise return s."
   ([^String s ^String suffix]
+   {:pre [(string? s) (string? suffix)]
+    :post [(string? %)]}
    (chop-suffix s suffix false))
   ([^String s ^String suffix ignore-case]
-   {:pre [(not (nil? s))
-          (not (nil? suffix))]
-    :post [(not (nil? %))]}
+   {:pre [(string? s)
+          (string? suffix)]
+    :post [(string? %)]}
    (if (and (>= (length s) (length suffix))
             (ends-with? s suffix ignore-case))
      (substring s 0 (- (length s) (length suffix)))

(defn ^String truncate
  "If s is longer than len-3, cut it down to len-3 and append '...'."
  [^String s len]
  {:pre [(not (nil? s)) (>= len 3)]}
  (if (> (length s) (max 3 (- len 3)))
    (str (substring s 0 (- len 3)) "...")
    s))

  Returns nil if index falls outside the string boundaries or if
  length is negative."
  ([^String s index]
   {:pre [(string? s) (integer? index)]
    :post [(or (string? %) (nil? %))]}
   (slice s index 1))
  ([^String s ^long index length]
   {:pre [(string? s) (integer? index) (integer? length)]
    :post [(or (string? %) (nil? %))]}
   (cond
     (neg? length) nil
     (neg? (+ (superstring.core/length s) index))
