X-Git-Url: https://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Data%2FCollections%2FNewtype%2FTH.hs;h=0301fd37562222cc896bc9246dc20c0c423d1bba;hb=8de439e0d2869f46e926d3132f6b1113201460e5;hp=d392758a4be3c3eaaaaa690037b2fdbef8b6aa97;hpb=b2da45926a7900603a5426e0c6d65e3ca630a1a2;p=Lucu.git diff --git a/Data/Collections/Newtype/TH.hs b/Data/Collections/Newtype/TH.hs index d392758..0301fd3 100644 --- a/Data/Collections/Newtype/TH.hs +++ b/Data/Collections/Newtype/TH.hs @@ -2,7 +2,9 @@ TemplateHaskell , UnicodeSyntax #-} --- |FIXME: doc +-- |Doesn't anyone know why these instances can't be derived using +-- GeneralizedNewtypeDeriving? I think its limitation isn't reasonable +-- at all... module Data.Collections.Newtype.TH ( derive ) @@ -27,7 +29,42 @@ import Prelude.Unicode type Deriver = Q Cxt → Q Type → Q Exp → Q Exp → Q Dec --- |FIXME: doc +-- |Automatic newtype instance deriver for type classes defined by the +-- collections-api package. +-- +-- @ +-- {-\# LANGUAGE TemplateHaskell \#-} +-- module Foo (T) where +-- import "Data.Collections" +-- import "Data.Collections.BaseInstances" () +-- import qualified Data.Collections.Newtype.TH as C +-- import qualified "Data.Map" as M +-- +-- newtype T = T (M.Map 'Int' 'Bool') +-- +-- C.derive [d| instance 'Unfoldable' T ('Int', 'Bool') +-- instance 'Foldable' T ('Int', 'Bool') +-- instance 'Indexed' T 'Int' 'Bool' +-- ... +-- |] +-- @ +-- +-- This function can derive the following instances: +-- +-- * 'Unfoldable' +-- +-- * 'Foldable' +-- +-- * 'Collection' +-- +-- * 'Indexed' +-- +-- * 'Map' +-- +-- * 'Set' +-- +-- * 'SortingCollection' +-- derive ∷ Q [Dec] → Q [Dec] derive = (concat <$>) ∘ (mapM go =≪) where @@ -59,6 +96,8 @@ inspectInstance (AppT (AppT (ConT classTy) wrapperTy) _) = return (wrapperTy, deriveFoldable) | classTy ≡ ''Collection = return (wrapperTy, deriveCollection) + | classTy ≡ ''Set + = return (wrapperTy, deriveSet) | classTy ≡ ''SortingCollection = return (wrapperTy, deriveSortingCollection) inspectInstance (AppT (AppT (AppT (ConT classTy) wrapperTy) _) _) @@ -254,6 +293,18 @@ deriveMap c ty wrap unwrap | otherwise = fail $ "deriveMap: unknown method: " ⧺ pprint name +deriveSet ∷ Q Cxt → Q Type → Q Exp → Q Exp → Q Dec +deriveSet c ty _ _ + = do names ← methodNames ''Set + instanceD c ty $ concatMap (pointfreeMethod exp) names + where + exp ∷ Name → Q Exp + exp name + | name ≡ 'haddock_candy + = [| haddock_candy |] + | otherwise + = fail $ "deriveSet: unknown method: " ⧺ pprint name + deriveSortingCollection ∷ Q Cxt → Q Type → Q Exp → Q Exp → Q Dec deriveSortingCollection c ty wrap unwrap = do names ← methodNames ''SortingCollection