packages feed

large-records 0.2.0.0 → 0.2.1.0

raw patch · 5 files changed

+63/−42 lines, 5 filesdep +primitivedep −vectordep ~large-genericsPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: primitive

Dependencies removed: vector

Dependency ranges changed: large-generics

API changes (from Hackage documentation)

- Data.Record.Plugin.Runtime: data Vector a
- Data.Record.Plugin.Runtime: fromList :: [a] -> Vector a
- Data.Record.Plugin.Runtime: toList :: Vector a -> [a]
- Data.Record.Plugin.Runtime: unsafeIndex :: Vector a -> Int -> a
- Data.Record.Plugin.Runtime: unsafeUpd :: Vector a -> [(Int, a)] -> Vector a
+ Data.Record.Plugin.Runtime: data SmallArray a
+ Data.Record.Plugin.Runtime: indexSmallArray :: SmallArray a -> Int -> a
+ Data.Record.Plugin.Runtime: smallArrayFromList :: [a] -> SmallArray a
+ Data.Record.Plugin.Runtime: smallArrayToList :: SmallArray a -> [a]
+ Data.Record.Plugin.Runtime: updateSmallArray :: SmallArray a -> [(Int, a)] -> SmallArray a
- Data.Record.Plugin.Runtime: Rep :: Vector (f (Any :: Type)) -> Rep (f :: Type -> Type) a
+ Data.Record.Plugin.Runtime: Rep :: SmallArray (f (Any :: Type)) -> Rep (f :: Type -> Type) a
- Data.Record.Plugin.Runtime: repFromVector :: Vector Any -> Rep I a
+ Data.Record.Plugin.Runtime: repFromVector :: SmallArray Any -> Rep I a
- Data.Record.Plugin.Runtime: repToVector :: Rep I a -> Vector Any
+ Data.Record.Plugin.Runtime: repToVector :: Rep I a -> SmallArray Any

Files

CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for large-records +## 0.2.1.0 -- 2022-04-06++* Update for `large-generics` 0.2+ ## 0.2.0.0 -- 2022-03-23   * Avoid all quotes: no more Template Haskell (#63) or quasi-quotes (#43).
large-records.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.4 name:               large-records-version:            0.2.0.0+version:            0.2.1.0 synopsis:           Efficient compilation for large records, linear in the size of the record description:        For many reasons, the internal code generated for modules                     that contain records is quadratic in the number of record@@ -46,10 +46,12 @@       base             >= 4.13   && < 4.17     , containers       >= 0.6.2  && < 0.7     , mtl              >= 2.2.1  && < 2.3+    , primitive        >= 0.7    && < 0.8     , record-hasfield  >= 1.0    && < 1.1     , syb              >= 0.7    && < 0.8-    , vector           >= 0.12   && < 0.13-    , large-generics   >= 0.1    && < 0.2++      -- large-generics 0.2 starts using 'SmallArray' instead of 'Vector'+    , large-generics   >= 0.2    && < 0.3        -- transformers 0.5.6 introduces Writer.CPS     , transformers     >= 0.5.6  && < 0.7
src/Data/Record/Internal/Plugin/CodeGen.hs view
@@ -85,7 +85,7 @@ -- -- TODO: From ghc 9.2 and up, we should generate ----- > newtype T a b = TFromVector {vectorFromT :: Vector Any}+-- > newtype T a b = TFromVector {vectorFromT :: SmallArray Any} -- >   deriving anyclass C -- where applicable -- -- instead, along with a pattern synonym.@@ -122,14 +122,14 @@     fieldExistentialType :: LRdrName -> Field -> (LRdrName, LHsType GhcPs)     fieldExistentialType var fld = (fieldName fld, optionalBang $ VarT var) --- | Generate conversion to and from vector+-- | Generate conversion to and from an array -- -- Generates something like ----- > vectorFromT :: T a b -> Vector Any+-- > vectorFromT :: T a b -> SmallArray Any -- > vectorFromT = \x -> -- >     case x of--- >       MkT f0 f1 f2 f3 f4 -> V.fromList [+-- >       MkT f0 f1 f2 f3 f4 -> smallArrayFromList [ -- >           unsafeCoerce f0 -- >         , unsafeCoerce f1 -- >         , unsafeCoerce f2@@ -137,9 +137,9 @@ -- >         , unsafeCoerce f4 -- >         ] -- >--- > vectorToT :: Vector Any -> T a b+-- > vectorToT :: SmallArray Any -> T a b -- > vectorToT = \x ->--- >     case V.toList x of+-- >     case smallArrayToList x of -- >       [f0, f1, f2, f3, f4] -> -- >         MkT (unsafeCoerce f0) -- >             (unsafeCoerce f1)@@ -163,11 +163,11 @@             sigD name $               funT                 (recordTypeT r)-                (ConT RT.type_Vector `appT` ConT RT.type_Any)+                (ConT RT.type_SmallArray `appT` ConT RT.type_Any)           , valD name $               lamE1 (conP recordConName (map varP args)) $                 appE-                  (VarE RT.fromList)+                  (VarE RT.smallArrayFromList)                   (listE [ VarE RT.unsafeCoerce `appE` VarE arg                          | arg <- args                          ]@@ -184,12 +184,12 @@         return $ [             sigD name $               funT-                (ConT RT.type_Vector `appT` ConT RT.type_Any)+                (ConT RT.type_SmallArray `appT` ConT RT.type_Any)                 (recordTypeT r)           , valD name $               lamE1 (varP x) $                 caseE-                  (VarE RT.toList `appE` VarE x)+                  (VarE RT.smallArrayToList `appE` VarE x)                   [ ( listP (map varP args)                     , appsE                         (ConE recordConName)@@ -244,7 +244,7 @@             appE               (VarE RT.noInlineUnsafeCo)               (appsE-                 (VarE RT.unsafeIndex)+                 (VarE RT.indexSmallArray)                  [ VarE (nameVectorFrom r) `appE` VarE t                  , VarE n                  ]@@ -281,7 +281,7 @@             appE               (VarE (nameVectorTo r))               (appsE-                 (VarE RT.unsafeUpd)+                 (VarE RT.updateSmallArray)                  [ VarE (nameVectorFrom r) `appE` VarE t                  , listE [                        tupE $@@ -419,7 +419,10 @@       lamE1 (varP p) $         appE           (ConE RT.con_Rep)-          (VarE RT.fromList `appE` listE (map (dictForField p) recordFields))+          (appE+             (VarE RT.smallArrayFromList)+             (listE (map (dictForField p) recordFields))+          )   where     dictForField :: LRdrName -> Field -> LHsExpr GhcPs     dictForField p Field{..} =@@ -483,7 +486,10 @@             , ( RT.recordFieldMetadata               , appE                   (ConE RT.con_Rep)-                  (VarE RT.fromList `appE` listE (map auxField recordFields))+                  (appE+                     (VarE RT.smallArrayFromList)+                     (listE (map auxField recordFields))+                  )               )             ]   where
src/Data/Record/Internal/Plugin/Names/Runtime.hs view
@@ -17,12 +17,12 @@   , unq_showsPrec   , error   , unsafeCoerce-    -- * vector-  , type_Vector-  , fromList-  , toList-  , unsafeIndex-  , unsafeUpd+    -- * primitive+  , type_SmallArray+  , smallArrayFromList+  , smallArrayToList+  , indexSmallArray+  , updateSmallArray     -- * record-hasfield   , type_HasField   , unq_hasField@@ -105,18 +105,18 @@   vector -------------------------------------------------------------------------------} -type_Vector :: LRdrName-type_Vector = nameQT "Vector"+type_SmallArray :: LRdrName+type_SmallArray = nameQT "SmallArray" -fromList    :: LRdrName-toList      :: LRdrName-unsafeIndex :: LRdrName-unsafeUpd   :: LRdrName+smallArrayFromList :: LRdrName+smallArrayToList   :: LRdrName+indexSmallArray    :: LRdrName+updateSmallArray   :: LRdrName -fromList    = nameQV "fromList"-toList      = nameQV "toList"-unsafeIndex = nameQV "unsafeIndex"-unsafeUpd   = nameQV "unsafeUpd"+smallArrayFromList = nameQV "smallArrayFromList"+smallArrayToList   = nameQV "smallArrayToList"+indexSmallArray    = nameQV "indexSmallArray"+updateSmallArray   = nameQV "updateSmallArray"  {-------------------------------------------------------------------------------   record-hasfield
src/Data/Record/Plugin/Runtime.hs view
@@ -19,11 +19,11 @@   , unsafeCoerce   , error     -- * vector-  , Vector-  , Vector.fromList-  , Vector.toList-  , Vector.unsafeIndex-  , Vector.unsafeUpd+  , SmallArray+  , smallArrayFromList+  , smallArrayToList+  , indexSmallArray+  , updateSmallArray     -- * record-hasfield   , GRC.HasField(hasField)     -- * large-generics@@ -44,19 +44,20 @@   , repToVector   ) where +import Control.Monad (forM_) import Data.Coerce (coerce) import Data.Kind (Constraint, Type)+import Data.Primitive.SmallArray import Data.Proxy (Proxy(Proxy))-import Data.Vector (Vector) import GHC.Exts (Any) import Unsafe.Coerce (unsafeCoerce) +import qualified Data.Foldable                    as Foldable import qualified Data.Record.Generic              as LR import qualified Data.Record.Generic.Eq           as LR import qualified Data.Record.Generic.GHC          as LR import qualified Data.Record.Generic.Rep.Internal as LR import qualified Data.Record.Generic.Show         as LR-import qualified Data.Vector                      as Vector import qualified GHC.Records.Compat               as GRC  {-------------------------------------------------------------------------------@@ -66,10 +67,18 @@ dictFor :: c x => Proxy c -> Proxy x -> LR.Dict c x dictFor _ _ = LR.Dict -repFromVector :: Vector Any -> LR.Rep LR.I a+repFromVector :: SmallArray Any -> LR.Rep LR.I a repFromVector = coerce -repToVector :: LR.Rep LR.I a -> Vector Any+repToVector :: LR.Rep LR.I a -> SmallArray Any repToVector = coerce +smallArrayToList :: SmallArray a -> [a]+smallArrayToList = Foldable.toList +updateSmallArray :: SmallArray a -> [(Int, a)] -> SmallArray a+updateSmallArray v updates = runSmallArray $ do+    v' <- thawSmallArray v 0 (sizeofSmallArray v)+    forM_ updates $ \(i, a) -> do+      writeSmallArray v' i a+    return v'