{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
#if __GLASGOW_HASKELL__ >= 806
{-# LANGUAGE QuantifiedConstraints #-}
#endif
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Vinyl.Core where
import Data.Coerce (Coercible)
#if __GLASGOW_HASKELL__ < 808
import Data.Monoid (Monoid)
#endif
#if __GLASGOW_HASKELL__ < 804
import Data.Semigroup (Semigroup(..))
#endif
import Foreign.Ptr (castPtr, plusPtr)
import Foreign.Storable (Storable(..))
import Data.Functor.Product (Product(Pair))
import Data.List (intercalate)
import Data.Vinyl.Functor
import Data.Vinyl.TypeLevel
import Data.Type.Equality (TestEquality (..), (:~:) (..))
import Data.Type.Coercion (TestCoercion (..), Coercion (..))
import GHC.Generics
import GHC.Types (Constraint, Type)
import Unsafe.Coerce (unsafeCoerce)
import Control.DeepSeq (NFData, rnf)
#if __GLASGOW_HASKELL__ < 806
import Data.Constraint.Forall (Forall)
#endif
data Rec :: (u -> *) -> [u] -> * where
RNil :: Rec f '[]
(:&) :: !(f r) -> !(Rec f rs) -> Rec f (r ': rs)
infixr 7 :&
infixr 5 <+>
infixl 8 <<$>>
infixl 8 <<*>>
instance TestEquality f => TestEquality (Rec f) where
testEquality :: forall (a :: [u]) (b :: [u]). Rec f a -> Rec f b -> Maybe (a :~: b)
testEquality Rec f a
RNil Rec f b
RNil = forall a. a -> Maybe a
Just forall {k} (a :: k). a :~: a
Refl
testEquality (f r
x :& Rec f rs
xs) (f r
y :& Rec f rs
ys) = do
r :~: r
Refl <- forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality f r
x f r
y
rs :~: rs
Refl <- forall {k} (f :: k -> *) (a :: k) (b :: k).
TestEquality f =>
f a -> f b -> Maybe (a :~: b)
testEquality Rec f rs
xs Rec f rs
ys
forall a. a -> Maybe a
Just forall {k} (a :: k). a :~: a
Refl
testEquality Rec f a
_ Rec f b
_ = forall a. Maybe a
Nothing
instance TestCoercion f => TestCoercion (Rec f) where
testCoercion :: forall (a :: [u]) (b :: [u]).
Rec f a -> Rec f b -> Maybe (Coercion a b)
testCoercion Rec f a
RNil Rec f b
RNil = forall a. a -> Maybe a
Just forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Coercion
testCoercion (f r
x :& Rec f rs
xs) (f r
y :& Rec f rs
ys) = do
Coercion r r
Coercion <- forall {k} (f :: k -> *) (a :: k) (b :: k).
TestCoercion f =>
f a -> f b -> Maybe (Coercion a b)
testCoercion f r
x f r
y
Coercion rs rs
Coercion <- forall {k} (f :: k -> *) (a :: k) (b :: k).
TestCoercion f =>
f a -> f b -> Maybe (Coercion a b)
testCoercion Rec f rs
xs Rec f rs
ys
forall a. a -> Maybe a
Just forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Coercion
testCoercion Rec f a
_ Rec f b
_ = forall a. Maybe a
Nothing
rappend
:: Rec f as
-> Rec f bs
-> Rec f (as ++ bs)
rappend :: forall {k} (f :: k -> *) (as :: [k]) (bs :: [k]).
Rec f as -> Rec f bs -> Rec f (as ++ bs)
rappend Rec f as
RNil Rec f bs
ys = Rec f bs
ys
rappend (f r
x :& Rec f rs
xs) Rec f bs
ys = f r
x forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& (Rec f rs
xs forall {k} (f :: k -> *) (as :: [k]) (bs :: [k]).
Rec f as -> Rec f bs -> Rec f (as ++ bs)
`rappend` Rec f bs
ys)
(<+>)
:: Rec f as
-> Rec f bs
-> Rec f (as ++ bs)
<+> :: forall {k} (f :: k -> *) (as :: [k]) (bs :: [k]).
Rec f as -> Rec f bs -> Rec f (as ++ bs)
(<+>) = forall {k} (f :: k -> *) (as :: [k]) (bs :: [k]).
Rec f as -> Rec f bs -> Rec f (as ++ bs)
rappend
rcombine :: (RMap rs, RApply rs)
=> (forall a. m a -> m a -> m a)
-> (forall a. f a -> m a)
-> (forall a. m a -> g a)
-> Rec f rs
-> Rec f rs
-> Rec g rs
rcombine :: forall {u} (rs :: [u]) (m :: u -> *) (f :: u -> *) (g :: u -> *).
(RMap rs, RApply rs) =>
(forall (a :: u). m a -> m a -> m a)
-> (forall (a :: u). f a -> m a)
-> (forall (a :: u). m a -> g a)
-> Rec f rs
-> Rec f rs
-> Rec g rs
rcombine forall (a :: u). m a -> m a -> m a
smash forall (a :: u). f a -> m a
toM forall (a :: u). m a -> g a
fromM Rec f rs
x Rec f rs
y =
forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall (a :: u). m a -> g a
fromM (forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RApply rs =>
Rec (Lift (->) f g) rs -> Rec f rs -> Rec g rs
rapply (forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap (forall l l' k (op :: l -> l' -> *) (f :: k -> l) (g :: k -> l')
(x :: k).
op (f x) (g x) -> Lift op f g x
Lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: u). m a -> m a -> m a
smash) Rec m rs
x') Rec m rs
y')
where x' :: Rec m rs
x' = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall (a :: u). f a -> m a
toM Rec f rs
x
y' :: Rec m rs
y' = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall (a :: u). f a -> m a
toM Rec f rs
y
class RMap rs where
rmap :: (forall x. f x -> g x) -> Rec f rs -> Rec g rs
instance RMap '[] where
rmap :: forall (f :: u -> *) (g :: u -> *).
(forall (x :: u). f x -> g x) -> Rec f '[] -> Rec g '[]
rmap forall (x :: u). f x -> g x
_ Rec f '[]
RNil = forall {u} (f :: u -> *). Rec f '[]
RNil
{-# INLINE rmap #-}
instance RMap xs => RMap (x ': xs) where
rmap :: forall (f :: u -> *) (g :: u -> *).
(forall (x :: u). f x -> g x) -> Rec f (x : xs) -> Rec g (x : xs)
rmap forall (x :: u). f x -> g x
f (f r
x :& Rec f rs
xs) = forall (x :: u). f x -> g x
f f r
x forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall (x :: u). f x -> g x
f Rec f rs
xs
{-# INLINE rmap #-}
(<<$>>)
:: RMap rs
=> (forall x. f x -> g x)
-> Rec f rs
-> Rec g rs
<<$>> :: forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
(<<$>>) = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap
{-# INLINE (<<$>>) #-}
(<<&>>)
:: RMap rs
=> Rec f rs
-> (forall x. f x -> g x)
-> Rec g rs
Rec f rs
xs <<&>> :: forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
Rec f rs -> (forall (x :: u). f x -> g x) -> Rec g rs
<<&>> forall (x :: u). f x -> g x
f = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall (x :: u). f x -> g x
f Rec f rs
xs
{-# INLINE (<<&>>) #-}
class RApply rs where
rapply :: Rec (Lift (->) f g) rs
-> Rec f rs
-> Rec g rs
instance RApply '[] where
rapply :: forall (f :: u -> *) (g :: u -> *).
Rec (Lift (->) f g) '[] -> Rec f '[] -> Rec g '[]
rapply Rec (Lift (->) f g) '[]
_ Rec f '[]
RNil = forall {u} (f :: u -> *). Rec f '[]
RNil
{-# INLINE rapply #-}
instance RApply xs => RApply (x ': xs) where
rapply :: forall (f :: u -> *) (g :: u -> *).
Rec (Lift (->) f g) (x : xs) -> Rec f (x : xs) -> Rec g (x : xs)
rapply (Lift (->) f g r
f :& Rec (Lift (->) f g) rs
fs) (f r
x :& Rec f rs
xs) = forall l l' k (op :: l -> l' -> *) (f :: k -> l) (g :: k -> l')
(x :: k).
Lift op f g x -> op (f x) (g x)
getLift Lift (->) f g r
f f r
x forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& (Rec (Lift (->) f g) rs
fs forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RApply rs =>
Rec (Lift (->) f g) rs -> Rec f rs -> Rec g rs
`rapply` Rec f rs
xs)
{-# INLINE rapply #-}
(<<*>>)
:: RApply rs
=> Rec (Lift (->) f g) rs
-> Rec f rs
-> Rec g rs
<<*>> :: forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RApply rs =>
Rec (Lift (->) f g) rs -> Rec f rs -> Rec g rs
(<<*>>) = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RApply rs =>
Rec (Lift (->) f g) rs -> Rec f rs -> Rec g rs
rapply
{-# INLINE (<<*>>) #-}
class RecApplicative rs where
rpure
:: (forall x. f x)
-> Rec f rs
instance RecApplicative '[] where
rpure :: forall (f :: u -> *). (forall (x :: u). f x) -> Rec f '[]
rpure forall (x :: u). f x
_ = forall {u} (f :: u -> *). Rec f '[]
RNil
{-# INLINE rpure #-}
instance RecApplicative rs => RecApplicative (r ': rs) where
rpure :: forall (f :: u -> *). (forall (x :: u). f x) -> Rec f (r : rs)
rpure forall (x :: u). f x
s = forall (x :: u). f x
s forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall {u} (rs :: [u]) (f :: u -> *).
RecApplicative rs =>
(forall (x :: u). f x) -> Rec f rs
rpure forall (x :: u). f x
s
{-# INLINE rpure #-}
rtraverse
:: Applicative h
=> (forall x. f x -> h (g x))
-> Rec f rs
-> h (Rec g rs)
rtraverse :: forall {u} (h :: * -> *) (f :: u -> *) (g :: u -> *) (rs :: [u]).
Applicative h =>
(forall (x :: u). f x -> h (g x)) -> Rec f rs -> h (Rec g rs)
rtraverse forall (x :: u). f x -> h (g x)
_ Rec f rs
RNil = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {u} (f :: u -> *). Rec f '[]
RNil
rtraverse forall (x :: u). f x -> h (g x)
f (f r
x :& Rec f rs
xs) = forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
(:&) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (x :: u). f x -> h (g x)
f f r
x forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall {u} (h :: * -> *) (f :: u -> *) (g :: u -> *) (rs :: [u]).
Applicative h =>
(forall (x :: u). f x -> h (g x)) -> Rec f rs -> h (Rec g rs)
rtraverse forall (x :: u). f x -> h (g x)
f Rec f rs
xs
{-# INLINABLE rtraverse #-}
rtraverseIn :: forall h f g rs.
(forall a. f a -> g (ApplyToField h a))
-> Rec f rs
-> Rec g (MapTyCon h rs)
rtraverseIn :: forall {u} (h :: * -> *) (f :: u -> *) (g :: u -> *) (rs :: [u]).
(forall (a :: u). f a -> g (ApplyToField h a))
-> Rec f rs -> Rec g (MapTyCon h rs)
rtraverseIn forall (a :: u). f a -> g (ApplyToField h a)
_ Rec f rs
RNil = forall {u} (f :: u -> *). Rec f '[]
RNil
rtraverseIn forall (a :: u). f a -> g (ApplyToField h a)
f (f r
x :& Rec f rs
xs) = forall (a :: u). f a -> g (ApplyToField h a)
f f r
x forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall {u} (h :: * -> *) (f :: u -> *) (g :: u -> *) (rs :: [u]).
(forall (a :: u). f a -> g (ApplyToField h a))
-> Rec f rs -> Rec g (MapTyCon h rs)
rtraverseIn forall (a :: u). f a -> g (ApplyToField h a)
f Rec f rs
xs
{-# INLINABLE rtraverseIn #-}
rsequenceIn :: forall f g (rs :: [Type]). (Traversable f, Applicative g)
=> Rec (f :. g) rs -> Rec g (MapTyCon f rs)
rsequenceIn :: forall (f :: * -> *) (g :: * -> *) (rs :: [*]).
(Traversable f, Applicative g) =>
Rec (f :. g) rs -> Rec g (MapTyCon f rs)
rsequenceIn = forall {u} (h :: * -> *) (f :: u -> *) (g :: u -> *) (rs :: [u]).
(forall (a :: u). f a -> g (ApplyToField h a))
-> Rec f rs -> Rec g (MapTyCon h rs)
rtraverseIn @f (forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall l k (f :: l -> *) (g :: k -> l) (x :: k).
Compose f g x -> f (g x)
getCompose)
{-# INLINABLE rsequenceIn #-}
rzipWith :: (RMap xs, RApply xs)
=> (forall x. f x -> g x -> h x) -> Rec f xs -> Rec g xs -> Rec h xs
rzipWith :: forall {u} (xs :: [u]) (f :: u -> *) (g :: u -> *) (h :: u -> *).
(RMap xs, RApply xs) =>
(forall (x :: u). f x -> g x -> h x)
-> Rec f xs -> Rec g xs -> Rec h xs
rzipWith forall (x :: u). f x -> g x -> h x
f = forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RApply rs =>
Rec (Lift (->) f g) rs -> Rec f rs -> Rec g rs
rapply forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap (forall l l' k (op :: l -> l' -> *) (f :: k -> l) (g :: k -> l')
(x :: k).
op (f x) (g x) -> Lift op f g x
Lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (x :: u). f x -> g x -> h x
f)
class RFoldMap rs where
rfoldMapAux :: Monoid m
=> (forall x. f x -> m)
-> m
-> Rec f rs
-> m
instance RFoldMap '[] where
rfoldMapAux :: forall m (f :: u -> *).
Monoid m =>
(forall (x :: u). f x -> m) -> m -> Rec f '[] -> m
rfoldMapAux forall (x :: u). f x -> m
_ m
m Rec f '[]
RNil = m
m
{-# INLINE rfoldMapAux #-}
instance RFoldMap xs => RFoldMap (x ': xs) where
rfoldMapAux :: forall m (f :: u -> *).
Monoid m =>
(forall (x :: u). f x -> m) -> m -> Rec f (x : xs) -> m
rfoldMapAux forall (x :: u). f x -> m
f m
m (f r
r :& Rec f rs
rs) = forall {u} (rs :: [u]) m (f :: u -> *).
(RFoldMap rs, Monoid m) =>
(forall (x :: u). f x -> m) -> m -> Rec f rs -> m
rfoldMapAux forall (x :: u). f x -> m
f (forall a. Monoid a => a -> a -> a
mappend m
m (forall (x :: u). f x -> m
f f r
r)) Rec f rs
rs
{-# INLINE rfoldMapAux #-}
rfoldMap :: forall rs m f. (Monoid m, RFoldMap rs)
=> (forall x. f x -> m) -> Rec f rs -> m
rfoldMap :: forall {u} (rs :: [u]) m (f :: u -> *).
(Monoid m, RFoldMap rs) =>
(forall (x :: u). f x -> m) -> Rec f rs -> m
rfoldMap forall (x :: u). f x -> m
f = forall {u} (rs :: [u]) m (f :: u -> *).
(RFoldMap rs, Monoid m) =>
(forall (x :: u). f x -> m) -> m -> Rec f rs -> m
rfoldMapAux forall (x :: u). f x -> m
f forall a. Monoid a => a
mempty
{-# INLINE rfoldMap #-}
class RecordToList rs where
recordToList :: Rec (Const a) rs -> [a]
instance RecordToList '[] where
recordToList :: forall a. Rec (Const a) '[] -> [a]
recordToList Rec (Const a) '[]
RNil = []
{-# INLINE recordToList #-}
instance RecordToList xs => RecordToList (x ': xs) where
recordToList :: forall a. Rec (Const a) (x : xs) -> [a]
recordToList (Const a r
x :& Rec (Const a) rs
xs) = forall k a (b :: k). Const a b -> a
getConst Const a r
x forall a. a -> [a] -> [a]
: forall {u} (rs :: [u]) a.
RecordToList rs =>
Rec (Const a) rs -> [a]
recordToList Rec (Const a) rs
xs
{-# INLINE recordToList #-}
data Dict c a where
Dict
:: c a
=> a
-> Dict c a
class ReifyConstraint c f rs where
reifyConstraint
:: Rec f rs
-> Rec (Dict c :. f) rs
instance ReifyConstraint c f '[] where
reifyConstraint :: Rec f '[] -> Rec (Dict c :. f) '[]
reifyConstraint Rec f '[]
RNil = forall {u} (f :: u -> *). Rec f '[]
RNil
{-# INLINE reifyConstraint #-}
instance (c (f x), ReifyConstraint c f xs)
=> ReifyConstraint c f (x ': xs) where
reifyConstraint :: Rec f (x : xs) -> Rec (Dict c :. f) (x : xs)
reifyConstraint (f r
x :& Rec f rs
xs) = forall l k (f :: l -> *) (g :: k -> l) (x :: k).
f (g x) -> Compose f g x
Compose (forall (c :: * -> Constraint) a. c a => a -> Dict c a
Dict f r
x) forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall {u} (c :: * -> Constraint) (f :: u -> *) (rs :: [u]).
ReifyConstraint c f rs =>
Rec f rs -> Rec (Dict c :. f) rs
reifyConstraint Rec f rs
xs
{-# INLINE reifyConstraint #-}
class RPureConstrained c ts where
rpureConstrained :: (forall a. c a => f a) -> Rec f ts
instance RPureConstrained c '[] where
rpureConstrained :: forall (f :: k -> *). (forall (a :: k). c a => f a) -> Rec f '[]
rpureConstrained forall (a :: k). c a => f a
_ = forall {u} (f :: u -> *). Rec f '[]
RNil
{-# INLINE rpureConstrained #-}
instance (c x, RPureConstrained c xs) => RPureConstrained c (x ': xs) where
rpureConstrained :: forall (f :: a -> *).
(forall (a :: a). c a => f a) -> Rec f (x : xs)
rpureConstrained forall (a :: a). c a => f a
f = forall (a :: a). c a => f a
f forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall {k} (c :: k -> Constraint) (ts :: [k]) (f :: k -> *).
RPureConstrained c ts =>
(forall (a :: k). c a => f a) -> Rec f ts
rpureConstrained @c @xs forall (a :: a). c a => f a
f
{-# INLINE rpureConstrained #-}
data DictOnly (c :: k -> Constraint) a where
DictOnly :: forall c a. c a => DictOnly c a
withPairedDict :: (c a => f a -> r) -> Product (DictOnly c) f a -> r
withPairedDict :: forall {k} (c :: k -> Constraint) (a :: k) (f :: k -> *) r.
(c a => f a -> r) -> Product (DictOnly c) f a -> r
withPairedDict c a => f a -> r
f (Pair DictOnly c a
DictOnly f a
x) = c a => f a -> r
f f a
x
class RPureConstraints cs ts where
rpureConstraints :: (forall a. AllSatisfied cs a => f a) -> Rec f ts
instance RPureConstraints cs '[] where
rpureConstraints :: forall (f :: u -> *).
(forall (a :: u). AllSatisfied cs a => f a) -> Rec f '[]
rpureConstraints forall (a :: u). AllSatisfied cs a => f a
_ = forall {u} (f :: u -> *). Rec f '[]
RNil
{-# INLINE rpureConstraints #-}
instance (AllSatisfied cs t, RPureConstraints cs ts)
=> RPureConstraints cs (t ': ts) where
rpureConstraints :: forall (f :: u -> *).
(forall (a :: u). AllSatisfied cs a => f a) -> Rec f (t : ts)
rpureConstraints forall (a :: u). AllSatisfied cs a => f a
f = forall (a :: u). AllSatisfied cs a => f a
f forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall {k} {u} (cs :: k) (ts :: [u]) (f :: u -> *).
RPureConstraints cs ts =>
(forall (a :: u). AllSatisfied cs a => f a) -> Rec f ts
rpureConstraints @cs @ts forall (a :: u). AllSatisfied cs a => f a
f
{-# INLINE rpureConstraints #-}
instance (RMap rs, ReifyConstraint Show f rs, RecordToList rs)
=> Show (Rec f rs) where
show :: Rec f rs -> String
show Rec f rs
xs =
(\String
str -> String
"{" forall a. Semigroup a => a -> a -> a
<> String
str forall a. Semigroup a => a -> a -> a
<> String
"}")
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [[a]] -> [a]
intercalate String
", "
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {u} (rs :: [u]) a.
RecordToList rs =>
Rec (Const a) rs -> [a]
recordToList
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {u} (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap (\(Compose (Dict f x
x)) -> forall k a (b :: k). a -> Const a b
Const forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show f x
x)
forall a b. (a -> b) -> a -> b
$ forall {u} (c :: * -> Constraint) (f :: u -> *) (rs :: [u]).
ReifyConstraint c f rs =>
Rec f rs -> Rec (Dict c :. f) rs
reifyConstraint @Show Rec f rs
xs
instance Semigroup (Rec f '[]) where
Rec f '[]
RNil <> :: Rec f '[] -> Rec f '[] -> Rec f '[]
<> Rec f '[]
RNil = forall {u} (f :: u -> *). Rec f '[]
RNil
instance (Semigroup (f r), Semigroup (Rec f rs))
=> Semigroup (Rec f (r ': rs)) where
(f r
x :& Rec f rs
xs) <> :: Rec f (r : rs) -> Rec f (r : rs) -> Rec f (r : rs)
<> (f r
y :& Rec f rs
ys) = (f r
x forall a. Semigroup a => a -> a -> a
<> f r
y) forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& (Rec f rs
xs forall a. Semigroup a => a -> a -> a
<> Rec f rs
ys)
instance Monoid (Rec f '[]) where
mempty :: Rec f '[]
mempty = forall {u} (f :: u -> *). Rec f '[]
RNil
Rec f '[]
RNil mappend :: Rec f '[] -> Rec f '[] -> Rec f '[]
`mappend` Rec f '[]
RNil = forall {u} (f :: u -> *). Rec f '[]
RNil
instance (Monoid (f r), Monoid (Rec f rs)) => Monoid (Rec f (r ': rs)) where
mempty :: Rec f (r : rs)
mempty = forall a. Monoid a => a
mempty forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall a. Monoid a => a
mempty
(f r
x :& Rec f rs
xs) mappend :: Rec f (r : rs) -> Rec f (r : rs) -> Rec f (r : rs)
`mappend` (f r
y :& Rec f rs
ys) = (forall a. Monoid a => a -> a -> a
mappend f r
x f r
y) forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& (forall a. Monoid a => a -> a -> a
mappend Rec f rs
xs Rec f rs
ys)
instance Eq (Rec f '[]) where
Rec f '[]
_ == :: Rec f '[] -> Rec f '[] -> Bool
== Rec f '[]
_ = Bool
True
instance (Eq (f r), Eq (Rec f rs)) => Eq (Rec f (r ': rs)) where
(f r
x :& Rec f rs
xs) == :: Rec f (r : rs) -> Rec f (r : rs) -> Bool
== (f r
y :& Rec f rs
ys) = (f r
x forall a. Eq a => a -> a -> Bool
== f r
y) Bool -> Bool -> Bool
&& (Rec f rs
xs forall a. Eq a => a -> a -> Bool
== Rec f rs
ys)
instance Ord (Rec f '[]) where
compare :: Rec f '[] -> Rec f '[] -> Ordering
compare Rec f '[]
_ Rec f '[]
_ = Ordering
EQ
instance (Ord (f r), Ord (Rec f rs)) => Ord (Rec f (r ': rs)) where
compare :: Rec f (r : rs) -> Rec f (r : rs) -> Ordering
compare (f r
x :& Rec f rs
xs) (f r
y :& Rec f rs
ys) = forall a. Monoid a => a -> a -> a
mappend (forall a. Ord a => a -> a -> Ordering
compare f r
x f r
y) (forall a. Ord a => a -> a -> Ordering
compare Rec f rs
xs Rec f rs
ys)
instance Storable (Rec f '[]) where
sizeOf :: Rec f '[] -> Int
sizeOf Rec f '[]
_ = Int
0
alignment :: Rec f '[] -> Int
alignment Rec f '[]
_ = Int
0
peek :: Ptr (Rec f '[]) -> IO (Rec f '[])
peek Ptr (Rec f '[])
_ = forall (m :: * -> *) a. Monad m => a -> m a
return forall {u} (f :: u -> *). Rec f '[]
RNil
poke :: Ptr (Rec f '[]) -> Rec f '[] -> IO ()
poke Ptr (Rec f '[])
_ Rec f '[]
RNil = forall (m :: * -> *) a. Monad m => a -> m a
return ()
instance (Storable (f r), Storable (Rec f rs))
=> Storable (Rec f (r ': rs)) where
sizeOf :: Rec f (r : rs) -> Int
sizeOf Rec f (r : rs)
_ = forall a. Storable a => a -> Int
sizeOf (forall a. HasCallStack => a
undefined :: f r) forall a. Num a => a -> a -> a
+ forall a. Storable a => a -> Int
sizeOf (forall a. HasCallStack => a
undefined :: Rec f rs)
{-# INLINE sizeOf #-}
alignment :: Rec f (r : rs) -> Int
alignment Rec f (r : rs)
_ = forall a. Storable a => a -> Int
alignment (forall a. HasCallStack => a
undefined :: f r)
{-# INLINE alignment #-}
peek :: Ptr (Rec f (r : rs)) -> IO (Rec f (r : rs))
peek Ptr (Rec f (r : rs))
ptr = do !f r
x <- forall a. Storable a => Ptr a -> IO a
peek (forall a b. Ptr a -> Ptr b
castPtr Ptr (Rec f (r : rs))
ptr)
!Rec f rs
xs <- forall a. Storable a => Ptr a -> IO a
peek (Ptr (Rec f (r : rs))
ptr forall a b. Ptr a -> Int -> Ptr b
`plusPtr` forall a. Storable a => a -> Int
sizeOf (forall a. HasCallStack => a
undefined :: f r))
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ f r
x forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& Rec f rs
xs
{-# INLINE peek #-}
poke :: Ptr (Rec f (r : rs)) -> Rec f (r : rs) -> IO ()
poke Ptr (Rec f (r : rs))
ptr (!f r
x :& Rec f rs
xs) = forall a. Storable a => Ptr a -> a -> IO ()
poke (forall a b. Ptr a -> Ptr b
castPtr Ptr (Rec f (r : rs))
ptr) f r
x forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr (Rec f (r : rs))
ptr forall a b. Ptr a -> Int -> Ptr b
`plusPtr` forall a. Storable a => a -> Int
sizeOf (forall a. HasCallStack => a
undefined :: f r)) Rec f rs
xs
{-# INLINE poke #-}
instance Generic (Rec f '[]) where
type Rep (Rec f '[]) =
C1 ('MetaCons "RNil" 'PrefixI 'False)
(S1 ('MetaSel 'Nothing
'NoSourceUnpackedness
'NoSourceStrictness
'DecidedLazy) U1)
from :: forall x. Rec f '[] -> Rep (Rec f '[]) x
from Rec f '[]
RNil = forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 forall k (p :: k). U1 p
U1)
to :: forall x. Rep (Rec f '[]) x -> Rec f '[]
to (M1 (M1 U1 x
U1)) = forall {u} (f :: u -> *). Rec f '[]
RNil
instance (Generic (Rec f rs)) => Generic (Rec f (r ': rs)) where
type Rep (Rec f (r ': rs)) =
C1 ('MetaCons ":&" ('InfixI 'RightAssociative 7) 'False)
(S1 ('MetaSel 'Nothing
'NoSourceUnpackedness
'SourceStrict
'DecidedStrict)
(Rec0 (f r))
:*:
S1 ('MetaSel 'Nothing
'NoSourceUnpackedness
'NoSourceStrictness
'DecidedLazy)
(Rep (Rec f rs)))
from :: forall x. Rec f (r : rs) -> Rep (Rec f (r : rs)) x
from (f r
x :& Rec f rs
xs) = forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (forall k i c (p :: k). c -> K1 i c p
K1 f r
x) forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (forall a x. Generic a => a -> Rep a x
from Rec f rs
xs))
to :: forall x. Rep (Rec f (r : rs)) x -> Rec f (r : rs)
to (M1 (M1 (K1 f r
x) :*: M1 Rep (Rec f rs) x
xs)) = f r
x forall {u} (f :: u -> *) (r :: u) (rs :: [u]).
f r -> Rec f rs -> Rec f (r : rs)
:& forall a x. Generic a => Rep a x -> a
to Rep (Rec f rs) x
xs
instance ReifyConstraint NFData f xs => NFData (Rec f xs) where
rnf :: Rec f xs -> ()
rnf = forall (elems :: [u]). Rec (Dict NFData :. f) elems -> ()
go forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {u} (c :: * -> Constraint) (f :: u -> *) (rs :: [u]).
ReifyConstraint c f rs =>
Rec f rs -> Rec (Dict c :. f) rs
reifyConstraint @NFData
where
go :: forall elems. Rec (Dict NFData :. f) elems -> ()
go :: forall (elems :: [u]). Rec (Dict NFData :. f) elems -> ()
go Rec (Dict NFData :. f) elems
RNil = ()
go (Compose (Dict f r
x) :& Rec (Dict NFData :. f) rs
xs) = forall a. NFData a => a -> ()
rnf f r
x seq :: forall a b. a -> b -> b
`seq` forall (elems :: [u]). Rec (Dict NFData :. f) elems -> ()
go Rec (Dict NFData :. f) rs
xs
type family Head xs where
Head (x ': _) = x
type family Tail xs where
Tail (_ ': xs) = xs
type family AllRepsMatch_ (f :: j -> *) (xs :: [j]) (g :: k -> *) (ys :: [k]) :: Constraint where
AllRepsMatch_ f (x ': xs) g ys =
( ys ~ (Head ys ': Tail ys)
, Coercible (f x) (g (Head ys))
, AllRepsMatch_ f xs g (Tail ys) )
AllRepsMatch_ _ '[] _ ys = ys ~ '[]
type AllRepsMatch f xs g ys = (AllRepsMatch_ f xs g ys, AllRepsMatch_ g ys f xs)
repsMatchCoercion :: AllRepsMatch f xs g ys => Coercion (Rec f xs) (Rec g ys)
repsMatchCoercion :: forall {u} {u} (f :: u -> *) (xs :: [u]) (g :: u -> *) (ys :: [u]).
AllRepsMatch f xs g ys =>
Coercion (Rec f xs) (Rec g ys)
repsMatchCoercion = forall a b. a -> b
unsafeCoerce (forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Coercion :: Coercion () ())
#if __GLASGOW_HASKELL__ >= 806
consMatchCoercion ::
(forall (x :: k). Coercible (f x) (g x)) => Coercion (Rec f xs) (Rec g xs)
#else
consMatchCoercion :: forall k (f :: k -> *) (g :: k -> *) (xs :: [k]).
Forall (Similar f g) => Coercion (Rec f xs) (Rec g xs)
#endif
consMatchCoercion :: forall k (f :: k -> *) (g :: k -> *) (xs :: [k]).
(forall (x :: k). Coercible (f x) (g x)) =>
Coercion (Rec f xs) (Rec g xs)
consMatchCoercion = forall a b. a -> b
unsafeCoerce (forall {k} (a :: k) (b :: k). Coercible a b => Coercion a b
Coercion :: Coercion () ())