bad:
first()?.second()?.third()?
good: a = first()
if a failed, handle that error
b = second(a)
if b failed, handle that error
c = third(b)
if c failed, handle that error
yield c