bookkeeper 0.2.1.1 → 0.2.2.0
raw patch · 5 files changed
+73/−1 lines, 5 filesdep +criteriondep +data-default-class
Dependencies added: criterion, data-default-class
Files
- CHANGELOG.md +4/−0
- bench/Main.hs +36/−0
- bookkeeper.cabal +20/−1
- src/Bookkeeper/Internal.hs +9/−0
- test/BookkeeperSpec.hs +4/−0
CHANGELOG.md view
@@ -1,3 +1,7 @@+# 0.2.2.0++* Add 'Data.Default' instance+ # 0.2.1.0 * Add 'Gettable', 'Settable', 'Modifiable' type synonyms.
+ bench/Main.hs view
@@ -0,0 +1,36 @@+module Main where++import Bookkeeper+import Criterion.Main++type PersonB = Book '[ "name" :=> String, "age" :=> Int ]+data PersonR = PersonR { name :: String, age :: {-# NOUNPACK #-} Int } deriving (Eq, Show)++pb :: PersonB+pb = emptyBook+ & #name =: ""+ & #age =: 0++pr :: PersonR+pr = PersonR+ { name = ""+ , age = 0+ }++modB :: Int -> PersonB+modB 0 = pb+modB n = modB (n - 1) & #age %: (+ n)++modR :: Int -> PersonR+modR 0 = pr+modR n = let p = modR (n - 1) in p { age = age p + n }++main :: IO ()+main = defaultMain+ [ bgroup "modB" [ bench "10" $ nf (\x -> get #age $ modB x) 10+ , bench "100" $ nf (\x -> get #age $ modB x) 100+ ]+ , bgroup "modR" [ bench "10" $ nf (\x -> age $ modR x) 10+ , bench "100" $ nf (\x -> age $ modR x) 100+ ]+ ]
bookkeeper.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: bookkeeper-version: 0.2.1.1+version: 0.2.2.0 synopsis: Anonymous records and overloaded labels description: Please see README.md category: Data Structures, Records@@ -34,6 +34,7 @@ build-depends: base >= 4.9 && < 4.10 , type-level-sets+ , data-default-class exposed-modules: Bookkeeper Bookkeeper.Internal@@ -48,6 +49,7 @@ build-depends: base >= 4.9 && < 4.10 , type-level-sets+ , data-default-class , base >=4.9 && < 4.10 , bookkeeper , markdown-unlit default-language: Haskell2010 @@ -61,6 +63,7 @@ build-depends: base >= 4.9 && < 4.10 , type-level-sets+ , data-default-class , doctest >= 0.9 && < 0.12 , Glob >= 0.7 && < 0.8 , yaml == 0.8.*@@ -79,10 +82,26 @@ build-depends: base >= 4.9 && < 4.10 , type-level-sets+ , data-default-class , bookkeeper , hspec > 2 && < 3 , QuickCheck >= 2.8 && < 2.9 other-modules: BookkeeperSpec Doctest+ default-language: Haskell2010++benchmark bench+ type: exitcode-stdio-1.0+ main-is: Main.hs+ hs-source-dirs:+ bench+ default-extensions: AutoDeriveTypeable ConstraintKinds DataKinds DefaultSignatures DeriveFunctor DeriveGeneric DeriveFoldable DeriveTraversable FlexibleContexts FlexibleInstances FunctionalDependencies GADTs MultiParamTypeClasses KindSignatures TypeInType OverloadedStrings RankNTypes ScopedTypeVariables TypeApplications TypeFamilies TypeOperators OverloadedLabels MagicHash+ ghc-options: -Wall -O2+ build-depends:+ base >= 4.9 && < 4.10+ , type-level-sets+ , data-default-class+ , bookkeeper+ , criterion default-language: Haskell2010
src/Bookkeeper/Internal.hs view
@@ -6,6 +6,7 @@ import GHC.Generics (Generic) import qualified Data.Type.Map as Map import GHC.TypeLits (Symbol, KnownSymbol)+import Data.Default.Class (Default(..)) import Data.Kind (Type) import Data.Type.Map (Map, Mapping((:->))) import Data.Monoid ((<>))@@ -50,6 +51,14 @@ instance Monoid (Book' '[]) where mempty = emptyBook _ `mappend` _ = emptyBook++instance Default (Book' '[]) where+ def = emptyBook++instance ( Default (Book' xs)+ , Default v+ ) => Default (Book' ((k :=> v) ': xs)) where+ def = Book (Map.Ext Map.Var def (getBook def)) -- | A book with no records. You'll usually want to use this to construct -- books.
test/BookkeeperSpec.hs view
@@ -31,6 +31,10 @@ = p & #name %: fmap toUpper get #name p' `shouldBe` "JULIAN K. ARNI" + it "allows type-chaging update" $ do+ let p' = p & #name %: length+ get #name p' `shouldBe` 14+ it "allows extension" $ do let p' = #email =: "jkarni<at>turingjump<dot>com" $ p get #email p' `shouldBe` ("jkarni<at>turingjump<dot>com" :: String)