anchor.diff:  ;=> true
   (s/explain :event/event
     {:event/type :event/restart})
  -;; val: {:event/type :event/restart} fails predicate: my.domain/event-type,  no method
  +;; val: {:event/type :event/restart} fails at: [:event/restart] predicate: my.domain/event-type,  no method
   (s/explain :event/event
     {:event/type :event/search
      :search/url 200})
  -;; val: {:event/type :event/search, :search/url 200} fails predicate: [(contains? % :event/timestamp)]
  -;; At: [:search/url] val: 200 fails spec: :search/url predicate: string?
  +;; val: {:event/type :event/search, :search/url 200} fails at: [:event/search] predicate: [(contains? % :event/timestamp)]
  +;; In: [:search/url] val: 200 fails spec: :search/url at: [:event/search :search/url] predicate: string?
   
   ----
   
  
positive.code:          :nums-kw #{:nums}
           :nums (s/* number?)))
  (s/conform ::unnested [:names "a" "b" :nums 1 2 3])
  => {:names-kw :names, :names ["a" "b"], :nums-kw :nums, :nums [1 2 3]}
  ----
  
  == Entity Maps
  
negative.code:    ::players [{::name "Kenny Rogers"
                 ::score 100
                 ::hand [[2 :banana]]}]})
  In: [::players 0 ::hand 0 1] val: :banana fails spec: ::card at: [::players ::hand 1] predicate: suit?
  ----
  
  The error explains the path in the data structure down to the invalid value, the spec part it's trying to match, the path in the specs, and the predicate that failed.
  
  If we have a function `deal` that doles out some cards to the players we can spec that function to verify the arg and return value are both suitable data values. We can also specify a `:fn` spec to verify that the count of cards in the game before the deal equals the count of cards after the deal.
  
  