anchor.diff:  let parseTokens messageTemplate = seq {
       if messageTemplate = "" then yield Token.EmptyText
       else
  -        let mutable isDone = false
  -        let mutable nextIndex = 0
  -        while not isDone do
  -            let beforeText = nextIndex
  -            let tt = parseTextToken nextIndex messageTemplate &nextIndex
  -            if nextIndex > beforeText then
  +        let isDone = ref false
  +        let nextIndex = ref 0
  +        while not !isDone do
  +            let beforeText = !nextIndex
  +            let tt = parseTextToken !nextIndex messageTemplate nextIndex
  +            if !nextIndex > beforeText then
                   yield tt
  -            if nextIndex = messageTemplate.Length then
  -                isDone <- true
  -            if not isDone then
  +            if !nextIndex = messageTemplate.Length then
  +                isDone := true
  +            if not !isDone then
                   let beforeProp = nextIndex
  -                let pt = parsePropertyToken nextIndex messageTemplate &nextIndex
  +                let pt = parsePropertyToken !nextIndex messageTemplate nextIndex
                   if beforeProp < nextIndex then
                       yield pt
  -                if nextIndex = messageTemplate.Length then
  -                    isDone <- true
  +                if !nextIndex = messageTemplate.Length then
  +                    isDone := true
   }
   
   let parse (s:string) =
  
positive.code: let tryParseInt32 s = System.Int32.TryParse(s, System.Globalization.NumberStyles.None, System.Globalization.CultureInfo.InvariantCulture)
  let maybeInt32 s = match tryParseInt32 s with true, n -> Some n | false, _ -> None
  
  let parseTextToken (startAt:int) (template:string) (nextIndex: int byref) : Token =
      let first = startAt
      let mutable next = startAt
      let accum = lazy System.Text.StringBuilder()
      let mutable isDone = false
      let moveToNextChar () = next <- next + 1
      let addCharToThisTextToken (c:char) = accum.Force().Append(c) |> ignore
      let isNextChar (c:char) = next+1 < template.Length && template.[next+1] = c
      while not isDone do
          let thisChar = template.[next]
          if thisChar = '{' then
              if isNextChar '{' then addCharToThisTextToken thisChar; moveToNextChar()
              else
  
negative.code:             if thisChar = '}' && isNextChar '}' then moveToNextChar () // treat "}}" as "}"
  
          if thisChar <> '{' then moveToNextChar()
          isDone <- isDone || !next >= template.Length
  
      callersNextIndex := !next
      if accum.IsValueCreated then Tk.text first (accum.Force().ToString())
      else Token.EmptyText
  
  type ch = System.Char
  let parsePropertyToken (startAt:int) (messageTemplate:string) (callersNextIndex: int ref) : Token =
      let first = startAt
      let mutable thisChIdx = startAt
      let peekChAt (index) = messageTemplate.[index]
      let isValidInPropName c = c = '_' || ch.IsLetterOrDigit c
      let isValidInDestrHint c = c = '@' || c = '$'
      let isValidInAlignment c = c = '-' || ch.IsDigit c
  