anchor.diff:      |> Seq.groupBy fst
       |> Seq.map (fun (k, xs) -> (k, xs |> Seq.map snd |> Set.ofSeq))
       |> Map.ofSeq
  +
  +  let mergeConstraints (a: Constraints) (b: Constraints) =
  +    Seq.append
  +      (a |> Map.keys)
  +      (b |> Map.keys)
  +    |> Seq.map (fun k -> (k, ()))
  +    |> Map.ofSeq
  +    |> Map.map (fun k _ ->
  +      Set.union
  +        (a.TryFind(k) |> Option.defaultValue(Set[]))
  +        (b.TryFind(k) |> Option.defaultValue(Set[]))
  +    )
  +
   
     let rec versionSearchCost (v : Version) : int =
       match v with
  
positive.code:                             state.Solution.Resolutions
                              |> Map.add package (resolvedVersion, privatePackagesSolution)
                        };
                      Constraints =
                        Map.union
                          state.Constraints
  
negative.code:       |> Seq.fold folder (Result.Ok b)
  
    let quickSearchStrategy (sourceExplorer : ISourceExplorer) (state : SolverState) = asyncSeq {
  
      yield!
        state.Hints
          |> AsyncSeq.filter(fun (atom, location) -> state.Visited.Contains(atom.Package, location))
          |> AsyncSeq.map (fun (atom, location) ->
            (atom.Package, (location, atom.Versions)))
  
  
      let unsatisfied = findUnsatisfied state.Solution state.Constraints
  
  