air 2013.7.18 → 2014.5.19
raw patch · 8 files changed
+4/−151 lines, 8 filesdep −paralleldep −template-haskellPVP ok
version bump matches the API change (PVP)
Dependencies removed: parallel, template-haskell
API changes (from Hackage documentation)
- Air.Data.Record.SimpleLabel.TH: mkLabel :: Name -> Q [Dec]
- Air.Data.Record.SimpleLabel.TH: mkLabels :: [Name] -> Q [Dec]
- Air.TH.Air: tuple :: Int -> ExpQ
- Air.TH.Default: mkDefault :: Name -> Q [Dec]
- Air.TH.Here: here :: QuasiQuoter
Files
- air.cabal +3/−10
- src/Air.hs +0/−2
- src/Air/Data/Record/SimpleLabel.hs +1/−5
- src/Air/Data/Record/SimpleLabel/TH.hs +0/−33
- src/Air/TH.hs +0/−12
- src/Air/TH/Air.hs +0/−18
- src/Air/TH/Default.hs +0/−53
- src/Air/TH/Here.hs +0/−18
air.cabal view
@@ -1,5 +1,5 @@ Name: air-Version: 2013.7.18+Version: 2014.5.19 Build-type: Simple Synopsis: air Description: An alternative Haskell Prelude library.@@ -15,15 +15,13 @@ library - build-depends: + build-depends: base >= 4 && < 5 , containers , array- , parallel , bytestring >= 0.9 , directory , filepath- , template-haskell , dlist , mtl , time@@ -31,19 +29,14 @@ hs-source-dirs: src/ - exposed-modules: + exposed-modules: Air , Air.Light , Air.Env- , Air.TH.Here- , Air.TH.Default- , Air.TH.Air- , Air.TH , Air.SimpleMath , Air.Control.Monad.ListBuilder , Air.Control.Monad.ObjectBuilder , Air.Data.Record.SimpleLabel- , Air.Data.Record.SimpleLabel.TH , Air.Data.Default , Air.Data.Monoid , Air.Data.Managed
src/Air.hs view
@@ -1,7 +1,5 @@ module Air ( module Air.Env- , module Air.TH ) where import Air.Env hiding (mod)-import Air.TH
src/Air/Data/Record/SimpleLabel.hs view
@@ -1,5 +1,5 @@ -- a fork of Sebastiaan Visser's BSD3 fclabels- + {-# LANGUAGE TypeOperators, TypeSynonymInstances, TemplateHaskell #-} module Air.Data.Record.SimpleLabel@@ -16,9 +16,6 @@ , get, set, mod , getM, setM, modM , (=:)-- -- * Derive labels using Template Haskell.- , module Air.Data.Record.SimpleLabel.TH ) where @@ -26,7 +23,6 @@ import Control.Applicative import Control.Category import Control.Monad.State hiding (get)-import Air.Data.Record.SimpleLabel.TH type Getter s x = s -> x
− src/Air/Data/Record/SimpleLabel/TH.hs
@@ -1,33 +0,0 @@-module Air.Data.Record.SimpleLabel.TH (mkLabels, mkLabel) where--import Control.Monad-import Data.Char-import Language.Haskell.TH.Syntax---- | Derive labels for all the record selector in a datatype.-mkLabels :: [Name] -> Q [Dec]-mkLabels = liftM concat . mapM mkLabel--mkLabel :: Name -> Q [Dec]-mkLabel n = do- i <- reify n- let -- only process data and newtype declarations- cs' = case i of- TyConI (DataD _ _ _ cs _) -> cs- TyConI (NewtypeD _ _ _ c _) -> [c]- _ -> []- -- we're only interested in labels of record constructors- ls' = [ l | RecC _ ls <- cs', l <- ls ]- return (map mkLabel1 ls')--mkLabel1 :: VarStrictType -> Dec-mkLabel1 (name, _, _) =- -- Generate a name for the label:- -- in this fork: label names are "__" + accesser name, e.g. if data Square = Square {length :: Double}, then label is __length- let n = mkName $ "__" ++ nameBase name- in FunD n [Clause [] (NormalB (- AppE (AppE (VarE (mkName "label")) (VarE name)) -- getter- (LamE [VarP (mkName "b"), VarP (mkName "a")] -- setter- (RecUpdE (VarE (mkName "a")) [(name, VarE (mkName "b"))]))- )) []]-
− src/Air/TH.hs
@@ -1,12 +0,0 @@-module Air.TH (- module Air.Data.Record.SimpleLabel- , module Air.TH.Here- , module Air.TH.Default- , module Air.TH.Air-) where--import Air.Data.Record.SimpleLabel-import Air.TH.Here-import Air.TH.Default-import Air.TH.Air-
− src/Air/TH/Air.hs
@@ -1,18 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}--module Air.TH.Air where--import Language.Haskell.TH-import Control.Monad (replicateM)---{--> $(tuple 3) [1,2,3,4,5]- (1,2,3)- > $(tuple 2) [1,2]- (1,2)--}-tuple :: Int -> ExpQ-tuple n = do- ns <- replicateM n (newName "x")- lamE [foldr (\x y -> conP '(:) [varP x,y]) wildP ns] (tupE $ map varE ns)
− src/Air/TH/Default.hs
@@ -1,53 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}--module Air.TH.Default where--import Language.Haskell.TH-import Air.Data.Default----- $(reify ''Dummy >>= show > stringE)--- "TyConI (DataD [] Main.Dummy [] [RecC Main.Dummy [(Main.test_field_1,NotStrict,ConT GHC.Base.String),(Main.test_field_2,NotStrict,ConT GHC.Integer.Type.Integer)]] [])"---- runQ [d| instance Default Dummy where def = Dummy def def |]--- [InstanceD [] (AppT (ConT Data.Default.Default) (ConT Main.Dummy)) [ValD (VarP def) (NormalB (AppE (AppE (ConE Main.Dummy) (VarE def)) (VarE def))) []]]---- runQ [d| instance Default Dummy where def = Dummy {test_field_1 = def, test_field_2 = def} |]--- [InstanceD [] (AppT (ConT Data.Default.Default) (ConT Main.Dummy)) [ValD (VarP def) (NormalB (RecConE Main.Dummy [(Main.test_field_1,VarE def),(Main.test_field_2,VarE def)])) []]]---- Example:---- data Dummy = Dummy--- {--- test_field_1 :: String--- , test_field_2 :: Integer--- }--- deriving (Show)--- --- mkDefault ''Dummy--- --- gives:---- instance Default Dummy where--- { def = Dummy {test_field_1 = def, test_field_2 = def} }---mkDefault :: Name -> Q [Dec]-mkDefault name = do- info <- reify name- case info of- TyConI x -> do- case x of- (DataD _ data_name _ recs _) -> do- case recs of- [] -> error $ "no phantom type"- (RecC record_name fields):_ -> do- let def_name = mkName "def"- let def_fields = map (\(field_name, _, _) -> (field_name, VarE def_name)) fields- return $ return $ - InstanceD [] - (AppT (ConT ''Default) (ConT data_name)) - [ValD (VarP def_name) (NormalB (RecConE record_name def_fields)) []]- NewtypeD _ _ _ _ _ -> error "Newtypes are not supported"- _ -> error $ "Unknown declaration type"- _ -> error "Only datatypes can be processed"
− src/Air/TH/Here.hs
@@ -1,18 +0,0 @@--- {-# LANGUAGE CPP #-}--module Air.TH.Here where--import Language.Haskell.TH.Quote -import Language.Haskell.TH.Syntax -import Language.Haskell.TH.Lib ---here :: QuasiQuoter -here = - QuasiQuoter - {- quoteExp = litE . stringL- , quotePat = litP . stringL- }--