X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Data%2FCollections%2FNewtype%2FTH.hs;fp=Data%2FCollections%2FNewtype%2FTH.hs;h=e3cb868e5ab460428cc7fbdce00427f00a7d0300;hp=d81cb0155662b3c2582374ba663a64e29ab19871;hb=852d97c73c367bc7880600850d92463f580ca1ca;hpb=b8d4661ea67362e44cf4ec8d62d996a5d0d89bdf diff --git a/Data/Collections/Newtype/TH.hs b/Data/Collections/Newtype/TH.hs index d81cb01..e3cb868 100644 --- a/Data/Collections/Newtype/TH.hs +++ b/Data/Collections/Newtype/TH.hs @@ -18,7 +18,7 @@ import Data.Maybe import Language.Haskell.TH.Lib import Language.Haskell.TH.Ppr import Language.Haskell.TH.Syntax -import Prelude hiding ( concat, concatMap, exp +import Prelude hiding ( concat, concatMap, exp, filter , foldl, foldr, foldl1, foldr1, null) import Prelude.Unicode @@ -54,6 +54,11 @@ inspectInstance (AppT (AppT (ConT classTy) wrapperTy) _) = return (wrapperTy, deriveUnfoldable) | classTy ≡ ''Foldable = return (wrapperTy, deriveFoldable) + | classTy ≡ ''Collection + = return (wrapperTy, deriveCollection) +inspectInstance (AppT (AppT (AppT (ConT classTy) wrapperTy) _) _) + | classTy ≡ ''Indexed + = return (wrapperTy, deriveIndexed) inspectInstance ty = fail $ "deriveInstance: unsupported type: " ⧺ pprint ty @@ -163,3 +168,35 @@ deriveFoldable c ty _ unwrap = [| isSingleton ∘ $unwrap |] | otherwise = fail $ "deriveFoldable: unknown method: " ⧺ pprint name + +deriveCollection ∷ Q Cxt → Q Type → Q Exp → Q Exp → Q Dec +deriveCollection c ty wrap unwrap + = do names ← methodNames ''Collection + instanceD c ty $ concatMap (pointfreeMethod exp) names + where + exp ∷ Name → Q Exp + exp name + | name ≡ 'filter + = [| ($wrap ∘) ∘ (∘ $unwrap) ∘ filter |] + | otherwise + = fail $ "deriveCollection: unknown method: " ⧺ pprint name + +deriveIndexed ∷ Q Cxt → Q Type → Q Exp → Q Exp → Q Dec +deriveIndexed c ty wrap unwrap + = do names ← methodNames ''Indexed + instanceD c ty $ concatMap (pointfreeMethod exp) names + where + exp ∷ Name → Q Exp + exp name + | name ≡ 'index + = [| (∘ $unwrap) ∘ index |] + | name ≡ 'adjust + = [| (($wrap ∘) ∘) ∘ flip flip $unwrap ∘ ((∘) ∘) ∘ adjust |] + | name ≡ 'inDomain + = [| (∘ $unwrap) ∘ inDomain |] + | name ≡ '(//) + = [| ($wrap ∘) ∘ (//) ∘ $unwrap |] + | name ≡ 'accum + = [| (($wrap ∘) ∘) ∘ (∘ $unwrap) ∘ accum |] + | otherwise + = fail $ "deriveIndexed: unknown method: " ⧺ pprint name