         else @right
     ]
 
+    # Push assignments forward
     [CS.AssignOp, ->
       return this unless @expression.instanceof CS.SeqOp
       new CS.SeqOp @expression.left, new CS.AssignOp @assignee, @expression.right
     ]
 
+    # A falsey condition with side effects -> the condition
+    # A falsey condition without side effects -> the undefined value
+    # A truthy condition without side effects -> a loop
     [CS.While, (inScope) ->
       if isFalsey @condition
         return if mayHaveSideEffects @condition, inScope
-          # while (falsey with side effects) -> the condition
           @condition
         else
-          # while (falsey without side effects) -> nothing
           if block?
             declarationsFor @block
           else
             (new CS.Undefined).g()
       if isTruthy @condition
-        # while (truthy without side effects) -> loop
         unless mayHaveSideEffects @condition, inScope
           return (new CS.Undefined).g() unless @block?
           return this if this instanceof CS.Loop


  defaultRules = [

    [CS.Program, -> if @block? and mayHaveSideEffects @block, [] then this else new CS.Program null]

    # Turn the block into an expression
    [CS.Block, (inScope, ancestors) ->
      switch @statements.length
        when 0 then (new CS.Undefined).g()

          new CS.SeqOp expr, s
    ]

    # Reject unused and inconsequential expressions
    [CS.SeqOp, (inScope, ancestors) ->
      if mayHaveSideEffects @left, inScope
        if (mayHaveSideEffects @right, inScope) or usedAsExpression this, ancestors then this else @left
