large-records-0.2.1.0: src/Data/Record/Plugin/Runtime.hs
{-# LANGUAGE ConstraintKinds #-}
-- | Re-exports of types and functions used by generated code
--
-- This exports all functionality required by the generated code, with the
-- exception of GHC generics (name clash with @large-records@ generics).
--
-- This follows the structure of "Data.Record.Internal.Plugin.RuntimeNames".
module Data.Record.Plugin.Runtime (
-- * base
Any
, Constraint
, Eq((==))
, Int
, Ord(compare)
, Proxy(Proxy)
, Show(showsPrec)
, Type
, unsafeCoerce
, error
-- * vector
, SmallArray
, smallArrayFromList
, smallArrayToList
, indexSmallArray
, updateSmallArray
-- * record-hasfield
, GRC.HasField(hasField)
-- * large-generics
, LR.Dict
, LR.FieldMetadata(FieldMetadata)
, LR.FieldStrictness(FieldLazy, FieldStrict)
, LR.Generic(Constraints, MetadataOf, dict, from, metadata, to)
, LR.Metadata(Metadata, recordConstructor, recordFieldMetadata, recordName, recordSize)
, LR.Rep(Rep)
, LR.ThroughLRGenerics(WrapThroughLRGenerics, unwrapThroughLRGenerics)
, LR.gcompare
, LR.geq
, LR.gshowsPrec
, LR.noInlineUnsafeCo
-- * Auxiliary
, dictFor
, repFromVector
, 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 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 GHC.Records.Compat as GRC
{-------------------------------------------------------------------------------
Auxiliary
-------------------------------------------------------------------------------}
dictFor :: c x => Proxy c -> Proxy x -> LR.Dict c x
dictFor _ _ = LR.Dict
repFromVector :: SmallArray Any -> LR.Rep LR.I a
repFromVector = coerce
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'