Use Immutable::Promise to reduce stack usage because tail call optimization is not effective for Proc.