anchor.diff:                  else
                       ["coord", texelCoordType, None] @ additionalDefaultArgs @ ["lod", "int", Some "0"]
   
  -            memberFunctionDefaultArgs
  -                "non-sampled texture read"
  -                SampleVariants.None
  -                "Read"
  -                arguments
  -                returnType
  -
  -            propertyDefaultArgs
  -                "non-sampled texture read"
  -                "Fetch"
  -                None
  -                arguments
  -                returnType
  +            Write.MemberFunction(
  +                "Read",
  +                arguments,
  +                returnType,
  +                comment = "non-sampled texture read"
  +            )
  +
  +            Write.Property(
  +                "Fetch",
  +                arguments,
  +                returnType,
  +                comment = "non-sampled texture read"
  +            )
   
           stop()
   
  
positive.code: type SampleVariants =
      | None = 0x0
      | Bias = 0x1
      
  
  let memberFunctionAttributesDefaultArgs (comment : string) (attributes : Option<string>) (variants : SampleVariants) (name : string)
                                          (args : list<string * string * Option<string>>) (ret : string) =
      let args =
          args |> List.map (fun (n,t,o) ->
              match o with
              | Some def -> sprintf "[<Optional; DefaultParameterValue(%s)>] %s : %s" def n t
              | _ -> sprintf "%s : %s" n t
          ) |> String.concat ", "
  
  
      line "/// %s" comment
  
      match attributes with
      | Some attr -> line "%s" attr
      | _ -> ()
  
      line "member x.%s(%s) : %s = onlyInShaderCode \"%s\"" name args ret name
      line ""
  
      if (variants &&& SampleVariants.Bias) <> SampleVariants.None then
          line "/// %s with lod-bias" comment
          line "member x.%s(%s, lodBias : float) : %s = onlyInShaderCode \"%s\"" name args ret name
          line ""
  
  let memberFunctionDefaultArgs (comment : string) (variants : SampleVariants) (name : string)
                                (args : list<string * string * Option<string>>) (ret : string) =
      memberFunctionAttributesDefaultArgs comment None variants name args ret
  
  let memberFunctionAttributes (comment : string) (attributes : Option<string>) (variants : SampleVariants)
                               (name : string) (args : list<string * string>) (ret : string) =
      let args = args |> List.map (fun (n, t) -> n, t, None)
      memberFunctionAttributesDefaultArgs comment attributes variants name args ret
  
  let memberFunction (comment : string) (variants : SampleVariants)
                     (name : string) (args : list<string * string>) (ret : string) =
      memberFunctionAttributes comment None variants name args ret
  
  let propertyDefaultArgs (comment : string) (name : string) (setter : Option<String>) (args : list<string * string * Option<string>>) (ret : string) =
      let args =
          args |> List.map (fun (n,t,o) ->
              match o with
              | Some def -> sprintf "[<Optional; DefaultParameterValue(%s)>] %s : %s" def n t
              | _ -> sprintf "%s : %s" n t
          ) |> String.concat ", "
  
      line "/// %s" comment
      line "member x.Item"
      line "    with get (%s) : %s = onlyInShaderCode \"%s\"" args ret name
  
      match setter with
      | Some name ->
          line "    and set (%s) (data : %s) : unit = onlyInShaderCode \"%s\"" args ret name
      | _ ->
          ()
  
      line ""
  
  let property (comment : string) (name : string) (setter : Option<String>) (args : list<string * string>) (ret : string) =
      let args = args |> List.map (fun (n, t) -> n, t, None)
      propertyDefaultArgs comment name setter args ret
  
  let floatVec (c : int) =
      match c with
  
negative.code:                             yield (t,d,a,m,s)
      ]
  
  
  let mutable indent = ""
  
  