anchor.diff:      o.GetType ()
       |> collectRules
   
  -  let newEmpty env = {env = env; rules = HashEqSet.empty; tree = TyTree.build []}
  +  let newEmpty () = {
  +    rulesCache = Dictionary<_, _> ()
  +    treesCache = Dictionary<_, _> ()
  +    rules = HashEqSet.empty
  +    tree = TyTree.build []
  +  }
   
     let maybeAddRules (o: obj) ruleSet =
       match o with
  
positive.code:   let tryGenerate (rules: obj) : option<'a> =
      let desTy = typeof<'a> |> Ty.ofType |> mapVars (Fresh.newMapper ())
      let rules =
        Dictionary<_, _> ()
        |> RuleSet.newEmpty
        |> RuleSet.maybeAddRules rules
      seq {1 .. Int32.MaxValue}
      |> Seq.tryPick (fun limit ->
  
negative.code: 
  module RuleSet =
    type RuleSet = {
      rulesCache: Dictionary<Type, array<Rule<Type>>>
      treesCache: Dictionary<HashEqSet<Type>, TyTree<Rule<Type>>>
      rules: HashEqSet<Type>
      tree: TyTree<Rule<Type>>
    }
  