sealed class ElementResult<out T>
abstract fun error(): Throwable?
abstract fun value(): T
class ElementFail<out T> : ElementResult<T>
class ElementPass<out T> : ElementResult<T>