   failure. Otherwise encounters an assertion failure (type error)."
   [x]
   {:pre [(fail? x)]}
-  (second x))
+  (:message x))
 
 (defn either?
   "λ [t] → Bool

(ns grimoire.either
  "Quick and dirty implementation of something like Haskell's Either[Success,
  Failure] for Clojure. Not the nicest thing in the world, but it'll do the
  job. Used to indicate success and failure throughout the lib-grimoire API.")

(defn succeed
  "λ [t] → Succeed[t]

  Type constructor. Returns a pair [:succeed x] for all x.

  ∀x (succeed? (succeed x)) == true
  ∀x (result (succeed x)) == x"
  [x]
  [:succeed x])

(defn succeed?
  "λ [t] → Bool

  Type predicate. Matches only two-vectors [:succeed x] as documented in the
  succeed constructor."
  [x]
  {:pre [(vector? x)
         (= 2 (count x))]}
  (= :succeed (first x)))

(defn result
  "λ [Succeed[t]] → t

  succeed. Otherwise encounters an assertion failure (type error)."
  [x]
  {:pre [(succeed? x)]}
  (:result x))

(v/deftag fail
  "λ [t] → Fail[x]

  Type constructor. Returns a pair [:fail x] for all x.

  ∀x (fail? (fail x)) == true
  ∀x (message (fail x)) == x"
  [message])

(defn message
  "λ [Fail[t]] → t
