haskell-src-meta 0.0.4 → 0.0.5
raw patch · 5 files changed
+70/−47 lines, 5 filesdep ~haskell-src-extsPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: haskell-src-exts
API changes (from Hackage documentation)
- Language.Haskell.Meta.QQ.Vixey: vix :: QuasiQuoter
+ Language.Haskell.Meta.QQ.Idiom: i :: QuasiQuoter
+ Language.Haskell.Meta.Utils: mkClauseQ :: [PatQ] -> ExpQ -> ClauseQ
+ Language.Haskell.Meta.Utils: mkFunD :: Name -> [Pat] -> Exp -> Dec
+ Language.Haskell.TH.Instances.Lift: instance Ord Body
+ Language.Haskell.TH.Instances.Lift: instance Ord Callconv
+ Language.Haskell.TH.Instances.Lift: instance Ord Clause
+ Language.Haskell.TH.Instances.Lift: instance Ord Con
+ Language.Haskell.TH.Instances.Lift: instance Ord Dec
+ Language.Haskell.TH.Instances.Lift: instance Ord Exp
+ Language.Haskell.TH.Instances.Lift: instance Ord Foreign
+ Language.Haskell.TH.Instances.Lift: instance Ord FunDep
+ Language.Haskell.TH.Instances.Lift: instance Ord Guard
+ Language.Haskell.TH.Instances.Lift: instance Ord Lit
+ Language.Haskell.TH.Instances.Lift: instance Ord Match
+ Language.Haskell.TH.Instances.Lift: instance Ord Pat
+ Language.Haskell.TH.Instances.Lift: instance Ord Range
+ Language.Haskell.TH.Instances.Lift: instance Ord Safety
+ Language.Haskell.TH.Instances.Lift: instance Ord Stmt
+ Language.Haskell.TH.Instances.Lift: instance Ord Strict
+ Language.Haskell.TH.Instances.Lift: instance Ord Type
Files
- haskell-src-meta.cabal +3/−3
- src/Language/Haskell/Meta/QQ/Idiom.hs +44/−0
- src/Language/Haskell/Meta/QQ/Vixey.hs +0/−44
- src/Language/Haskell/Meta/Utils.hs +5/−0
- src/Language/Haskell/TH/Instances/Lift.hs +18/−0
haskell-src-meta.cabal view
@@ -1,5 +1,5 @@ name: haskell-src-meta-version: 0.0.4+version: 0.0.5 cabal-version: >= 1.6 build-type: Simple license: BSD3@@ -14,7 +14,7 @@ to template-haskell abstract syntax isn't 100% complete yet. library- build-Depends: base == 4.*, containers, haskell-src-exts == 1.0.*,+ build-Depends: base == 4.*, containers, haskell-src-exts == 1.*, packedstring, template-haskell, pretty, syb extensions: TemplateHaskell, QuasiQuotes, RankNTypes, StandaloneDeriving,@@ -33,6 +33,6 @@ Language.Haskell.Meta.QQ.Hs, Language.Haskell.Meta.QQ.Here, Language.Haskell.Meta.QQ.HsHere,- Language.Haskell.Meta.QQ.Vixey,+ Language.Haskell.Meta.QQ.Idiom, Language.Haskell.Meta.QQ.BF, Language.Haskell.Meta.QQ.SKI
+ src/Language/Haskell/Meta/QQ/Idiom.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}++-- | Idiom brackets. Vixey's idea.++module Language.Haskell.Meta.QQ.Idiom (i) where++import Data.Generics+ (Data,everywhere,mkT)+import Control.Applicative+import Language.Haskell.Meta+import Language.Haskell.TH.Lib+import Language.Haskell.TH.Quote+import Language.Haskell.TH.Syntax++-- ghci> [$i| (,) "foo" "bar" |]+-- [('f','b'),('f','a'),('f','r'),('o','b'),('o','a'),('o','r'),('o','b'),('o','a'),('o','r')]+i :: QuasiQuoter+i = QuasiQuoter ((cleanNames <$>) . applicateQ)+ (either fail return . parsePat)++applicateQ :: String -> ExpQ+applicateQ s = case either fail unwindE (parseExp s) of+ x:y:xs -> foldl+ (\e e' -> [|$e <*> $e'|])+ [|$(return x) <$> $(return y)|]+ (fmap return xs)+ _ -> fail "applicateQ fails."++unwindE :: Exp -> [Exp]+unwindE = go []+ where go acc (e `AppE` e') = go (e':acc) e+ go acc e = e:acc++cleanNames :: (Data a) => a -> a+cleanNames = everywhere (mkT cleanName)+ where cleanName :: Name -> Name+ cleanName n+ | isNameU n = n+ | otherwise = (mkName . nameBase) n+ isNameU :: Name -> Bool+ isNameU (Name _ (NameU _)) = True+ isNameU _ = False++
− src/Language/Haskell/Meta/QQ/Vixey.hs
@@ -1,44 +0,0 @@-{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}---- | Vixey's idea.--module Language.Haskell.Meta.QQ.Vixey (vix) where--import Data.Generics- (Data,everywhere,mkT)-import Control.Applicative-import Language.Haskell.Meta-import Language.Haskell.TH.Lib-import Language.Haskell.TH.Quote-import Language.Haskell.TH.Syntax---- ghci> [$i| (,) "foo" "bar" |]--- [('f','b'),('f','a'),('f','r'),('o','b'),('o','a'),('o','r'),('o','b'),('o','a'),('o','r')]-vix :: QuasiQuoter-vix = QuasiQuoter ((cleanNames <$>) . applicateQ)- (either fail return . parsePat)--applicateQ :: String -> ExpQ-applicateQ s = case either fail unwindE (parseExp s) of- x:y:xs -> foldl- (\e e' -> [|$e <*> $e'|])- [|$(return x) <$> $(return y)|]- (fmap return xs)- _ -> fail "applicateQ fails."--unwindE :: Exp -> [Exp]-unwindE = go []- where go acc (e `AppE` e') = go (e':acc) e- go acc e = e:acc--cleanNames :: (Data a) => a -> a-cleanNames = everywhere (mkT cleanName)- where cleanName :: Name -> Name- cleanName n- | isNameU n = n- | otherwise = (mkName . nameBase) n- isNameU :: Name -> Bool- isNameU (Name _ (NameU _)) = True- isNameU _ = False--
src/Language/Haskell/Meta/Utils.hs view
@@ -321,6 +321,11 @@ fromTyConI (TyConI dec) = Just dec fromTyConI _ = Nothing +mkFunD :: Name -> [Pat] -> Exp -> Dec+mkFunD f xs e = FunD f [Clause xs (NormalB e) []]++mkClauseQ :: [PatQ] -> ExpQ -> ClauseQ+mkClauseQ ps e = clause ps (normalB e) [] -----------------------------------------------------------------------------
src/Language/Haskell/TH/Instances/Lift.hs view
@@ -18,6 +18,24 @@ import Data.List(intercalate) import GHC.Base +deriving instance Ord Exp+deriving instance Ord Dec+deriving instance Ord Stmt+deriving instance Ord Type+deriving instance Ord Foreign+deriving instance Ord FunDep+deriving instance Ord Con+deriving instance Ord Body+deriving instance Ord Clause+deriving instance Ord Strict+deriving instance Ord Safety+deriving instance Ord Callconv+deriving instance Ord Guard+deriving instance Ord Range+deriving instance Ord Match+deriving instance Ord Pat+deriving instance Ord Lit+ instance Lift () where lift () = [|()|]