       after: (x) ->
         if @l.constructor == Digit4
           { a, b, c, d } = @l
-          new Deep new Digit2(x, a), (=> @m().after(new Node3(b, c, d))), @r
+          l = new Digit2 x, a
+          new Deep l, suspend(=> @m().after(new Node3(b, c, d))), @r
         else
           new Deep @l.after(x), @m, @r
 
       before: (x) ->
         if @r.constructor == Digit4
           { a, b, c, d } = @r
-          new Deep @l, (=> @m().before(new Node3(a, b, c))), new Digit2(d, x)
+          r = new Digit2(d, x)
+          new Deep @l, suspend(=> @m().before(new Node3(a, b, c))), r
         else
           new Deep @l, @m, @r.before(x)
 

            [l, x, r] = @r.split p, i2
            [deepR(@l, suspend(=> @m()), l), x, asTree(r)]

      reverse: -> new Deep @r.reverse(), (=> @m().reverse()), @l.reverse()

    internal = [
      Node2

          if m() == Empty
            asTree r
          else
            new Deep m().first().asDigit(), suspend(=> m().rest()), r
        else
          new Deep l, m, r

