Add heterogeneous fold class, 'HFold'.
Add heterogeneous fold class, 'HFold'.

With instances for right-nested tuples (the shape of 'SimpleCall'
'Arg t's).

The eventual goal is generic post-processor instances which use a user
specified pretty-printing class to format the parts of the call.  This
way the user does not have to write boiler plate log processor
instances.

I foresee a problematic common case: suppose we want to pretty print
some types, but are too lazy to write pretty printers for all types
and want to fall back on 'Show' by default.  Can we avoid this (does
this even work?):

  -- Extend 'Show' to all types (orphan instance from hell).
  instance Show a where
    show _ = "<no show>"

  -- Custom pretty printer instances for types we care to pretty print.
  instance MyCustomPrettyPrinter MyFancyType where
    pp = ...

  -- Fall back on 'Show' for types we don't care to pretty print.
  instance Show a => MyCustomPrettyPrinter a where
    pp = show

The major issue there is the 'Show' orphan instance covering all types
not already with 'Show' instances.  I guess it would be easy enough to
let the user define it when they need it, or put it in it's own
module.

ntc2/haskell-call-trace