code: func NewFileOp(s State, action *FileAction, c Constraints) *FileOp {
  	action = action.bind(s)
  
  	f := &FileOp{
  		action:      action,
  		constraints: c,
  	}
  
  	f.output = &output{vertex: f, getIndex: func() (pb.OutputIndex, error) {
  		return pb.OutputIndex(0), nil
  	}}
  
  	return f
  }
docs: // Examples:
  // local := llb.Local(...)
  // llb.Image().Dir("/abc").File(Mkdir("./foo").Mkfile("/abc/foo/bar", []byte("data")))
  // llb.Image().File(Mkdir("/foo").Mkfile("/foo/bar", []byte("data")))
  // llb.Image().File(Copy(local, "/foo", "/bar")).File(Copy(local, "/foo2", "/bar2"))
  //
  // a := Mkdir("./foo")  // *FileAction /ced/foo
  // b := Mkdir("./bar") // /abc/bar
  // c := b.Copy(a.WithState(llb.Scratch().Dir("/ced")), "./foo", "./baz") // /abc/baz
  // llb.Image().Dir("/abc").File(c)
  //
  // In future this can be extended to multiple outputs with:
  // a := Mkdir("./foo")
  // b, id := a.GetSelector()
  // c := b.Mkdir("./bar")
  // filestate = state.File(c)
  // filestate.GetOutput(id).Exec()