{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE TypeOperators #-}
module Data.Record.Generic.Rep.Internal (
Rep(..)
, map'
, sequenceA
, unsafeFromList
, unsafeFromListAny
, collapse
, toListAny
, noInlineUnsafeCo
) where
import Prelude hiding (sequenceA)
import qualified Prelude
import Data.Coerce (coerce)
import Data.Foldable (toList)
import Data.Primitive.SmallArray
import Data.SOP.BasicFunctors
import GHC.Exts (Any)
import Unsafe.Coerce (unsafeCoerce)
newtype Rep f a = Rep (SmallArray (f Any))
type role Rep representational nominal
map' :: (forall x. f x -> g x) -> Rep f a -> Rep g a
map' :: forall (f :: * -> *) (g :: * -> *) a.
(forall x. f x -> g x) -> Rep f a -> Rep g a
map' forall x. f x -> g x
f (Rep SmallArray (f Any)
v) = forall (f :: * -> *) a. SmallArray (f Any) -> Rep f a
Rep forall a b. (a -> b) -> a -> b
$ forall x. f x -> g x
f forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SmallArray (f Any)
v
sequenceA :: Applicative m => Rep (m :.: f) a -> m (Rep f a)
sequenceA :: forall (m :: * -> *) (f :: * -> *) a.
Applicative m =>
Rep (m :.: f) a -> m (Rep f a)
sequenceA (Rep SmallArray ((:.:) m f Any)
v) = forall (f :: * -> *) a. SmallArray (f Any) -> Rep f a
Rep forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
Prelude.sequenceA (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {l} {k} (f :: l -> *) (g :: k -> l) (p :: k).
(:.:) f g p -> f (g p)
unComp SmallArray ((:.:) m f Any)
v)
collapse :: Rep (K a) b -> [a]
collapse :: forall a b. Rep (K a) b -> [a]
collapse (Rep SmallArray (K a Any)
v) = coerce :: forall a b. Coercible a b => a -> b
coerce (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SmallArray (K a Any)
v)
toListAny :: Rep f a -> [f Any]
toListAny :: forall (f :: * -> *) a. Rep f a -> [f Any]
toListAny (Rep SmallArray (f Any)
v) = forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SmallArray (f Any)
v
unsafeFromList :: [b] -> Rep (K b) a
unsafeFromList :: forall b a. [b] -> Rep (K b) a
unsafeFromList = forall (f :: * -> *) a. SmallArray (f Any) -> Rep f a
Rep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> SmallArray a
smallArrayFromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
Prelude.map forall k a (b :: k). a -> K a b
K
unsafeFromListAny :: [f Any] -> Rep f a
unsafeFromListAny :: forall (f :: * -> *) a. [f Any] -> Rep f a
unsafeFromListAny = forall (f :: * -> *) a. SmallArray (f Any) -> Rep f a
Rep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> SmallArray a
smallArrayFromList
instance Show x => Show (Rep (K x) a) where
show :: Rep (K x) a -> String
show (Rep SmallArray (K x Any)
v) =
forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
Prelude.map forall {k} a (b :: k). K a b -> a
unK (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SmallArray (K x Any)
v)
instance Eq x => Eq (Rep (K x) a) where
Rep SmallArray (K x Any)
v == :: Rep (K x) a -> Rep (K x) a -> Bool
== Rep SmallArray (K x Any)
v' =
forall a b. (a -> b) -> [a] -> [b]
Prelude.map forall {k} a (b :: k). K a b -> a
unK (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SmallArray (K x Any)
v)
forall a. Eq a => a -> a -> Bool
== forall a b. (a -> b) -> [a] -> [b]
Prelude.map forall {k} a (b :: k). K a b -> a
unK (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SmallArray (K x Any)
v')
noInlineUnsafeCo :: forall a b. a -> b
{-# NOINLINE noInlineUnsafeCo #-}
noInlineUnsafeCo :: forall a b. a -> b
noInlineUnsafeCo = forall a b. a -> b
unsafeCoerce