+
+deriveSortingCollection ∷ Q Cxt → Q Type → Q Exp → Q Exp → Q Dec
+deriveSortingCollection c ty wrap unwrap
+ = do names ← methodNames ''SortingCollection
+ instanceD c ty $ concatMap (pointfreeMethod exp) names
+ where
+ exp ∷ Name → Q Exp
+ exp name
+ | name ≡ 'minView
+ = [| (second $wrap <$>) ∘ minView ∘ $unwrap |]
+ | otherwise
+ = fail $ "deriveSortingCollection: unknown method: " ⧺ pprint name