Idea: Optics types, combining pattern types and view types

There can also be some variations of optics_type!(Bar is B(_) => C { .. }):

Type Before called After returns (Output) After returns (Residual) After unwinds
optics_type!(Bar is B(_) => C { .. }) B(_) C { .. } C { .. } B(_) | C { .. }
optics_type!(Bar is B(_) |=> C { .. }) B(_) B(_) | C { .. } B(_) | C { .. } B(_) | C { .. }
optics_type!(Bar is B(_) ?=> C { .. }) B(_) C { .. } B(_) | C { .. } B(_) | C { .. }
optics_type!(Bar is B(_) !=> C { .. }) B(_) C { .. } C { .. } C { .. }

where ?=> only applies to functions returning impl Try.