record 0.1.1 → 0.1.2
raw patch · 5 files changed
+168/−6 lines, 5 filesdep +directorydep +doctestdep +filepathdep ~basedep ~base-preludebuild-type:Customsetup-changedPVP ok
version bump matches the API change (PVP)
Dependencies added: directory, doctest, filepath
Dependency ranges changed: base, base-prelude
API changes (from Hackage documentation)
Files
- CHANGELOG.md +3/−0
- Setup.hs +42/−2
- doctest/Main.hs +66/−0
- library/Record/Parser.hs +32/−2
- record.cabal +25/−2
CHANGELOG.md view
@@ -1,2 +1,5 @@+# 0.1.2+* Fix Integers getting parsed as Rationals (#2)+ # 0.1.1 * Implement the List type parsing
Setup.hs view
@@ -1,2 +1,42 @@-import Distribution.Simple-main = defaultMain+-- The code is mostly ripped from+-- https://github.com/ekmett/lens/blob/697582fb9a980f273dbf8496253c5bbefedd0a8b/Setup.lhs+import Data.List ( nub )+import Data.Version ( showVersion )+import Distribution.Package ( PackageName(PackageName), Package, PackageId, InstalledPackageId, packageVersion, packageName )+import Distribution.PackageDescription ( PackageDescription(), TestSuite(..) )+import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks )+import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose, copyFiles )+import Distribution.Simple.BuildPaths ( autogenModulesDir )+import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), Flag(..), fromFlag, HaddockFlags(haddockDistPref))+import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) )+import Distribution.Text ( display )+import Distribution.Verbosity ( Verbosity, normal )+import System.FilePath ( (</>) )++main :: IO ()+main = defaultMainWithHooks simpleUserHooks+ { buildHook = \pkg lbi hooks flags -> do+ generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi+ buildHook simpleUserHooks pkg lbi hooks flags+ }++generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO ()+generateBuildModule verbosity pkg lbi = do+ let dir = autogenModulesDir lbi+ createDirectoryIfMissingVerbose verbosity True dir+ withLibLBI pkg lbi $ \_ libcfg -> do+ withTestLBI pkg lbi $ \suite suitecfg -> do+ rewriteFile (dir </> "Build_" ++ testName suite ++ ".hs") $ unlines+ [ "module Build_" ++ testName suite ++ " where"+ , "import Prelude"+ , "deps :: [String]"+ , "deps = " ++ (show $ formatdeps (testDeps libcfg suitecfg))+ ]+ where+ formatdeps = map (formatone . snd)+ formatone p = case packageName p of+ PackageName n -> n ++ "-" ++ showVersion (packageVersion p)++testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)]+testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys+
+ doctest/Main.hs view
@@ -0,0 +1,66 @@+-- The code is mostly ripped from+-- https://github.com/ekmett/lens/blob/d1d97469f0e93c1d3535308954a060e8a04e37aa/tests/doctests.hsc+import BasePrelude+import System.Directory+import System.FilePath+import Test.DocTest+import Build_doctest (deps)++main :: IO ()+main = do+ sources <- getSources+ doctest $ dfltParams ++ map ("-package="++) deps ++ sources+ where+ dfltParams = + [+ "-isrc",+ "-idist/build/autogen",+ "-optP-include",+ "-optPdist/build/autogen/cabal_macros.h",+ "-XArrows",+ "-XBangPatterns",+ "-XConstraintKinds",+ "-XDataKinds",+ "-XDefaultSignatures",+ "-XDeriveDataTypeable",+ "-XDeriveFunctor",+ "-XDeriveGeneric",+ "-XEmptyDataDecls",+ "-XFlexibleContexts",+ "-XFlexibleInstances",+ "-XFunctionalDependencies",+ "-XGADTs",+ "-XGeneralizedNewtypeDeriving",+ "-XImpredicativeTypes",+ "-XLambdaCase",+ "-XLiberalTypeSynonyms",+ "-XMultiParamTypeClasses",+ "-XMultiWayIf",+ "-XNoImplicitPrelude",+ "-XNoMonomorphismRestriction",+ "-XOverloadedStrings",+ "-XPatternGuards",+ "-XParallelListComp",+ "-XQuasiQuotes",+ "-XRankNTypes",+ "-XRecordWildCards",+ "-XScopedTypeVariables",+ "-XStandaloneDeriving",+ "-XTemplateHaskell",+ "-XTupleSections",+ "-XTypeFamilies",+ "-XTypeOperators",+ "-hide-all-packages"+ ]++getSources :: IO [FilePath]+getSources = filter (isSuffixOf ".hs") <$> go "library"+ where+ go dir = do+ (dirs, files) <- getFilesAndDirectories dir+ (files ++) . concat <$> mapM go dirs++getFilesAndDirectories :: FilePath -> IO ([FilePath], [FilePath])+getFilesAndDirectories dir = do+ c <- map (dir </>) . filter (`notElem` ["..", "."]) <$> getDirectoryContents dir+ (,) <$> filterM doesDirectoryExist c <*> filterM doesFileExist c
library/Record/Parser.hs view
@@ -33,6 +33,16 @@ Done _ a -> Right a Partial c -> onResult (c "") +-- |+-- Run a parser on a given input,+-- lifting its errors to the context parser.+-- +-- Consider it a subparser.+parser :: Parser a -> Text -> Parser a+parser p t =+ either fail return $+ run p t+ labeled :: String -> Parser a -> Parser a labeled = flip (<?>)@@ -159,6 +169,7 @@ Lit_String Text | Lit_Integer Integer | Lit_Rational Rational+ deriving (Show) exp :: Parser Exp exp =@@ -212,11 +223,30 @@ sepBy1 exp (skipSpace *> char ',' <* skipSpace) <* skipSpace <* char ']' +-- |+-- +-- Integers get parsed as integers:+-- +-- >>> run lit "2"+-- Right (Lit_Integer 2)+-- +-- Rationals get parsed as rationals:+-- +-- >>> run lit "2.0"+-- Right (Lit_Rational (2 % 1))+-- +-- >>> run lit "3e2"+-- Right (Lit_Rational (300 % 1)) lit :: Parser Lit lit = Lit_Char <$> charLit <|> Lit_String <$> stringLit <|>- Lit_Rational <$> rational <|>+ Lit_Rational <$> rationalNotDecimal <|> Lit_Integer <$> decimal-+ where+ rationalNotDecimal =+ match rational >>= \(t, r) ->+ case run (decimal <* endOfInput) t of+ Left _ -> return r+ _ -> mzero
record.cabal view
@@ -1,7 +1,7 @@ name: record version:- 0.1.1+ 0.1.2 synopsis: First class records implemented with quasi-quotation description:@@ -31,7 +31,7 @@ license-file: LICENSE build-type:- Simple+ Custom cabal-version: >=1.10 extra-source-files:@@ -71,6 +71,29 @@ transformers >= 0.2 && < 0.5, base-prelude >= 0.1 && < 0.2, base >= 4.6 && < 4.9+++test-suite doctest+ type:+ exitcode-stdio-1.0+ hs-source-dirs:+ doctest+ main-is:+ Main.hs+ ghc-options:+ -threaded+ "-with-rtsopts=-N"+ -funbox-strict-fields+ build-depends:+ doctest == 0.9.*,+ directory == 1.2.*,+ filepath == 1.3.*,+ base-prelude,+ base+ default-extensions:+ Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFunctor, DeriveGeneric, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, ImpredicativeTypes, LambdaCase, LiberalTypeSynonyms, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators+ default-language:+ Haskell2010 -- Well, it's not a benchmark actually,