       [r_, s_] = [r or ZERO, s or ZERO]
       x = r_.first() - s_.first() - b
       [digit, borrow] = if x < 0 then [x + BASE, 1] else [x, 0]
-      new Stream(digit, -> step(r_.rest(), s_.rest(), borrow))
+      Sequence.conj(digit, -> step(r_.rest(), s_.rest(), borrow))
     else
       s or r
   cleanup step(r, s)

  first: -> car
  rest:  -> cdr

# -- Internal helper functions that operate on (streams of) digits/limbs

cleanup = (s) -> s?.reverse()?.dropWhile((x) -> x == 0)?.reverse() or null


    [r_, s_] = [r or ZERO, s or ZERO]
    x = r_.first() + s_.first() + c
    [digit, carry] = if x >= BASE then [x - BASE, 1] else [x, 0]
    Sequence.conj(digit, -> add(r_.rest(), s_.rest(), carry))
  else
    s or r

