code: func (s *Struct) Transform(tr func(Symbol) (Symbol, error)) (*Struct, error) {
  	out := &Struct{
  		symbol:  s.symbol,
  		symbols: make([]Symbol, 0, len(s.symbols)),
  	}
  	for _, sym := range s.symbols {
  		// Recursive branch.
  		if strct, ok := sym.(*Struct); ok {
  			t, err := strct.Transform(tr)
  			if err != nil {
  				return nil, err
  			}
  			out.symbols = append(out.symbols, t)
  			continue
  		}
  		// Leafs.
  		switch t, err := tr(sym); {
  		case err != nil:
  			return nil, err
  		case t != nil:
  			out.symbols = append(out.symbols, t)
  		}
  	}
  	out.frozen = true
  	return out, nil
  }
docs: // Transform returns a new struct made by applying a transformation to the
  // receiver struct, recursively.