anchor.diff:      let ``Utils.GetFilesGroupedBySHA1``() =
           hashedMultiFilesSHA1  
   
  +    let ``Utils.CoerceFilesIntoHardLinks``() = files |> Utils.CoerceFilesIntoHardLinks true
  +
       let Run() =
           ``Kernel32.Create hard link``()
           ``Utils.GetFile``() |> printfn "%d"
  
positive.code:             with _ -> None
          files |> Array.map hashedFile |> Array.choose id
  
      /// get SHA1-hashes with label and elapsed calculation time for all given files
      let GetFileSHA1 verbose files = 
          files
          |> GetFilesHashedDiagnostic verbose [|"SHA1", HashAlgorithm.Create("SHA1")|] 
  
negative.code:             let h_ms, h_t, h_hash = h.[0]
              (h_ms, h_t, h_hash, f))
  
      /// Get SHA1-grouping of the given files.
      let GetFilesGroupedBySHA1 verbose files = 
          files
          |> GetFileSHA1 verbose 
          |> Seq.ofArray 
          |> Seq.groupBy (fun (_,_,h,_) -> h) 
          
      /// Coerce a sequence of files using hard links.
      let rec CoerceFilesIntoHardLinks verbose (files : seq<string>) = 
          if files |> Seq.isEmpty then ()
          else 
              let head = files |> Seq.head
              let tail = files |> Seq.skip 1
              if tail |> Seq.isEmpty then ()
              else
                  let head2 = Seq.head tail
                  if (try File.Delete(head2); true with | _ as ex -> (if verbose then printfn "Delete error %s\n%s" head2 ex.Message); false) then
                      (try CreateHardLink head2 head with | _ as ex -> (if verbose then printfn "Hard link error %s\n%s" head2 ex.Message); false) |> ignore
                  let tail2 = tail |> Seq.skip 1
                  if tail2 |> Seq.isEmpty then ()
                  else CoerceFilesIntoHardLinks verbose (seq { yield head; yield! tail2 })
  
  
  module Tests =
  