@@ -40,6 +40,8 @@ import GHC.OverloadedLabels
4040import GHC.Prim
4141import GHC.ST (ST (..), runST)
4242import GHC.TypeLits
43+import Generic.Data (gshowsPrec)
44+import Generic.Data.Internal.Show (GShow)
4345import Unsafe.Coerce
4446import Prelude
4547
@@ -80,14 +82,18 @@ instance l ~ l' => IsLabel (l :: Symbol) (FldProxy l') where
8082-- | Internal record type. When manually writing an explicit type signature for
8183-- a record, use 'Record' instead. For abstract type signatures 'Rec' will work
8284-- well.
83−data Rec (lts :: [*]) = Rec
85+data Rec (lts :: [*]) = MkRec
8486 { _unRec :: SmallArray# Any -- Note that the values are physically in reverse order
8587 }
8688
8789type role Rec representational
8890
89−instance (RecApply lts lts Show) => Show (Rec lts) where
90− show = show . showRec
91+instance
92+ ( RecApply lts lts Show,
93+ GShow Proxy (Rep (Rec lts)),
94+ Generic (Rec lts)
95+ ) => Show (Rec lts) where
96+ show = (\x -> if null x then "{}" else x) . unwords . drop 1 . words . flip (gshowsPrec 0) ""
9197
9298instance RecEq lts lts => Eq (Rec lts) where
9399 (==) (a :: Rec lts) (b :: Rec lts) = recEq a b (Proxy :: Proxy lts)
@@ -123,12 +129,12 @@ unsafeRNil (I# n#) =
123129 case newSmallArray# n# (error "No Value") s# of
124130 (# s'#, arr# #) ->
125131 case unsafeFreezeSmallArray# arr# s'# of
126− (# s''#, a# #) -> (# s''#, Rec a# #)
132+ (# s''#, a# #) -> (# s''#, MkRec a# #)
127133{-# INLINE unsafeRNil #-}
128134
129135-- Not in superrecord
130136recCopy :: forall lts rts. RecCopy lts lts rts => Rec lts -> Rec rts
131−recCopy r@(Rec vec#) =
137+recCopy r@(MkRec vec#) =
132138 let size# = sizeofSmallArray# vec#
133139 in runST' $ ST $ \s# ->
134140 case newSmallArray# size# (error "No value") s# of
@@ -136,7 +142,7 @@ recCopy r@(Rec vec#) =
136142 case recCopyInto (Proxy @lts) r (Proxy @rts) arr# s'# of
137143 s''# ->
138144 case unsafeFreezeSmallArray# arr# s''# of
139− (# s'''#, a# #) -> (# s'''#, Rec a# #)
145+ (# s'''#, a# #) -> (# s'''#, MkRec a# #)
140146{-# INLINE recCopy #-}
141147
142148class RecCopy (pts :: [*]) (lts :: [*]) (rts :: [*]) where
@@ -185,14 +191,14 @@ unsafeRCons ::
185191 l := t ->
186192 Rec lts ->
187193 Rec (l := t ': lts)
188−unsafeRCons (_ := val) (Rec vec#) =
194+unsafeRCons (_ := val) (MkRec vec#) =
189195 runST' $ ST $ \s# ->
190196 case unsafeThawSmallArray# vec# s# of
191197 (# s'#, arr# #) ->
192198 case writeSmallArray# arr# size# (unsafeCoerce# val) s'# of
193199 s''# ->
194200 case unsafeFreezeSmallArray# arr# s''# of
195− (# s'''#, a# #) -> (# s'''#, Rec a# #)
201+ (# s'''#, a# #) -> (# s'''#, MkRec a# #)
196202 where
197203 !(I# size#) = fromIntegral $ natVal' (proxy# :: Proxy# s)
198204{-# INLINE unsafeRCons #-}
@@ -262,7 +268,7 @@ get ::
262268 FldProxy l ->
263269 Rec lts ->
264270 v
265−get _ (Rec vec#) =
271+get _ (MkRec vec#) =
266272 let !(I# index#) =
267273 fromIntegral (natVal' (proxy# :: Proxy# (RecTyIdxH 0 l lts)))
268274 size# = sizeofSmallArray# vec#
@@ -292,7 +298,7 @@ set ::
292298 v' ->
293299 Rec lts ->
294300 Rec lts'
295−set _ !val (Rec vec#) =
301+set _ !val (MkRec vec#) =
296302 let !(I# index#) = fromIntegral (natVal' (proxy# :: Proxy# (RecTyIdxH 0 l lts)))
297303 -- Unlike superrecord - calculating size dynamically instead of statically
298304 size# = sizeofSmallArray# vec#
@@ -307,7 +313,7 @@ set _ !val (Rec vec#) =
307313 case writeSmallArray# arr# (size# -# index# -# 1#) dynVal s''# of
308314 s'''# ->
309315 case unsafeFreezeSmallArray# arr# s'''# of
310− (# s''''#, a# #) -> (# s''''#, Rec a# #)
316+ (# s''''#, a# #) -> (# s''''#, MkRec a# #)
311317 in r2
312318{-# INLINE set #-}
313319
@@ -379,7 +385,7 @@ combine lts rts =
379385 case recCopyInto (Proxy :: Proxy rhs) rts (Proxy :: Proxy res) arr# s''# of
380386 s'''# ->
381387 case unsafeFreezeSmallArray# arr# s'''# of
382− (# s''''#, a# #) -> (# s''''#, Rec a# #)
388+ (# s''''#, a# #) -> (# s''''#, MkRec a# #)
383389{-# INLINE combine #-}
384390
385391-- | Alias for 'combine'