anchor.diff:      with
          | CurrentListReturn costs -> costs |> List.map (fun x -> e, x)
     let best = (currentBest, currentBestCost)
  -  reporter.finish revertedResult best
  +  reporter.finish (revertedResult |> List.length) best
     best
   
   
  
positive.code:     { 
        init: string -> unit; 
        step: int -> int -> int -> ('a * double) -> unit;  // Step#, Rule index, Rules#, NodeCost
        finish: ('a * double) list -> ('a * double) -> unit // All NodeCosts, Best NodeCost
      }
    
    type Logger = string -> unit
  
negative.code:   let completeReporter<'a> (printer: 'a -> string) (logger: Logger) =
      { init = fun msg -> logger msg;
        step = fun stp ruleIdx rulesSize (node, cost) -> logger (sprintf "Step %d, rule %d out of %d: %s" stp ruleIdx rulesSize (nodeCostToString printer node cost))
        finish = fun len (node, cost) -> logger (sprintf "examined programs: %d\nBest: %s" len (nodeCostToString printer node cost))
      }
  
  open Logging
  