code: func (e *FSTEnum) pushFirst() (err error) {
  	arc := e.arcs[e.upto]
  	assert(arc != nil)
  
  	for {
  		e.output[e.upto] = e.fst.outputs.Add(e.output[e.upto-1], arc.Output)
  		if arc.Label == FST_END_LABEL {
  			// final node
  			break
  		}
  		// fmt.Printf("  pushFirst label=%c upto=%v output=%v\n",
  		// 	rune(arc.Label), e.upto, e.fst.outputs.outputToString(e.output[e.upto]))
  		e.spi.setCurrentLabel(arc.Label)
  		e.incr()
  
  		nextArc := e.Arc(e.upto)
  		if _, err = e.fst.readFirstTargetArc(arc, nextArc, e.fstReader); err != nil {
  			return
  		}
  		arc = nextArc
  	}
  	return nil
  }
docs: /*
  Appends current arc, and then recuses from its target, appending
  first arc all the way to the final node.
  */