code: func (lcs *lcs) TableContext(ctx context.Context) (table [][]int, err error) {
  	if lcs.table != nil {
  		return lcs.table, nil
  	}
  
  	sizeX := len(lcs.left) + 1
  	sizeY := len(lcs.right) + 1
  
  	table = make([][]int, sizeX)
  	for x := 0; x < sizeX; x++ {
  		table[x] = make([]int, sizeY)
  	}
  
  	for y := 1; y < sizeY; y++ {
  		select { // check in each y to save some time
  		case <-ctx.Done():
  			return nil, ctx.Err()
  		default:
  			// nop
  		}
  		for x := 1; x < sizeX; x++ {
  			increment := 0
  			if reflect.DeepEqual(lcs.left[x-1], lcs.right[y-1]) {
  				increment = 1
  			}
  			table[x][y] = max(table[x-1][y-1]+increment, table[x-1][y], table[x][y-1])
  		}
  	}
  
  	lcs.table = table
  	return table, nil
  }
docs: // Table implements Lcs.TableContext()