             case .success(let value):
                 return value
             case .failure(let error as Error):
-                throw error as Error
+                throw error
             default:
-                fatalError("E should adopt Error.")
+                fatalError("\(E.self) should adopt Error.")
         }
     }
 

}

public func ?? <T, E> (left: Result<T, E>, right: @autoclosure () -> Result<T, E>) -> Result<T, E> {
    return left.recoverWith(right())
}

        return self.value ?? value()
    }

    public func recover(_ result: @autoclosure () -> Result<T, E>) -> Result<T, E> {
        return map(success: { _ in self }, failure: { _ in result() })
    }

