{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE QualifiedDo #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TypeData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UnliftedNewtypes #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wno-name-shadowing #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Control.Monad.Borrow.Pure.Copyable (
Copyable (..),
copyMut,
genericCopy,
GenericCopyable,
Copyable1 (..),
AsCopyable1 (..),
GenericCopyable1,
copy1,
genericCopy1,
genericLiftCopy,
) where
import Control.Monad.Borrow.Pure.BO.Internal
import Control.Monad.Borrow.Pure.Utils (coerceLin)
import Data.Array.Mutable.Linear (Array)
import Data.Int
import Data.Kind (Constraint, Type)
import Data.Semigroup qualified as Sem
import Data.Vector.Mutable.Linear (Vector)
import Data.Word
import GHC.TypeError (ErrorMessage (..))
import Generics.Linear
import Numeric.Natural (Natural)
import Prelude.Linear
import Prelude.Linear.Unsatisfiable (Unsatisfiable, unsatisfiable)
class Copyable a where
copy :: Borrow bk α a %1 -> a
instance Copyable (Ur a) where
copy :: forall (bk :: BorrowKind) (α :: Lifetime).
Borrow bk α (Ur a) %1 -> Ur a
copy (UnsafeAlias (Ur !a
a)) = a -> Ur a
forall a. a -> Ur a
Ur a
a
{-# INLINE copy #-}
instance
(Unsatisfiable (ShowType (Array a) :<>: Text " cannot be copied!")) =>
Copyable (Array a)
where
copy :: forall (bk :: BorrowKind) (α :: Lifetime).
Borrow bk α (Array a) %1 -> Array a
copy = Borrow bk α (Array a) %1 -> Array a
forall a. Bottom => a
unsatisfiable
instance
(Unsatisfiable (ShowType (Vector a) :<>: Text " cannot be copied!")) =>
Copyable (Vector a)
where
copy :: forall (bk :: BorrowKind) (α :: Lifetime).
Borrow bk α (Vector a) %1 -> Vector a
copy = Borrow bk α (Vector a) %1 -> Vector a
forall a. Bottom => a
unsatisfiable
newtype UnsafeAssumeNoVar a = UnsafeAssumeNoVar a
instance Copyable (UnsafeAssumeNoVar a) where
copy :: forall (bk :: BorrowKind) (α :: Lifetime).
Borrow bk α (UnsafeAssumeNoVar a) %1 -> UnsafeAssumeNoVar a
copy = \(UnsafeAlias !UnsafeAssumeNoVar a
a) -> UnsafeAssumeNoVar a
a
{-# INLINE copy #-}
deriving via UnsafeAssumeNoVar Int instance Copyable Int
deriving via UnsafeAssumeNoVar Int8 instance Copyable Int8
deriving via UnsafeAssumeNoVar Int16 instance Copyable Int16
deriving via UnsafeAssumeNoVar Int32 instance Copyable Int32
deriving via UnsafeAssumeNoVar Int64 instance Copyable Int64
deriving via UnsafeAssumeNoVar Word instance Copyable Word
deriving via UnsafeAssumeNoVar Word8 instance Copyable Word8
deriving via UnsafeAssumeNoVar Word16 instance Copyable Word16
deriving via UnsafeAssumeNoVar Word32 instance Copyable Word32
deriving via UnsafeAssumeNoVar Word64 instance Copyable Word64
deriving via UnsafeAssumeNoVar Integer instance Copyable Integer
deriving via UnsafeAssumeNoVar Natural instance Copyable Natural
deriving via UnsafeAssumeNoVar Float instance Copyable Float
deriving via UnsafeAssumeNoVar Double instance Copyable Double
deriving via UnsafeAssumeNoVar Char instance Copyable Char
deriving via UnsafeAssumeNoVar Bool instance Copyable Bool
type GenericCopyable a = (Generic a, GCopyable (Rep a))
genericCopy :: (GenericCopyable a) => Borrow bk α a %1 -> a
{-# INLINE genericCopy #-}
genericCopy :: forall a (bk :: BorrowKind) (α :: Lifetime).
GenericCopyable a =>
Borrow bk α a %1 -> a
genericCopy (UnsafeAlias a
x) = Rep a (ZonkAny 0) %1 -> a
forall a p (m :: Multiplicity). Generic a => Rep a p %m -> a
forall p (m :: Multiplicity). Rep a p %m -> a
to (Borrow (ZonkAny 2) (ZonkAny 1) (Rep a (ZonkAny 0))
%1 -> Rep a (ZonkAny 0)
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) x.
Borrow bk α (Rep a x) %1 -> Rep a x
gcopy (Rep a (ZonkAny 0)
-> Borrow (ZonkAny 2) (ZonkAny 1) (Rep a (ZonkAny 0))
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias (a %1 -> Rep a (ZonkAny 0)
forall a p (m :: Multiplicity). Generic a => a %m -> Rep a p
forall p (m :: Multiplicity). a %m -> Rep a p
from a
x)))
type GCopyable :: forall {k}. (k -> Type) -> Constraint
class GCopyable f where
gcopy :: Borrow bk α (f x) %1 -> f x
instance (Copyable a) => GCopyable (K1 i a) where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (K1 i a x) %1 -> K1 i a x
gcopy = \(UnsafeAlias (K1 !a
a)) -> a -> K1 i a x
forall k i c (p :: k). c -> K1 i c p
K1 (Borrow (ZonkAny 18) (ZonkAny 17) a %1 -> a
forall a (bk :: BorrowKind) (α :: Lifetime).
Copyable a =>
Borrow bk α a %1 -> a
forall (bk :: BorrowKind) (α :: Lifetime). Borrow bk α a %1 -> a
copy (a -> Borrow (ZonkAny 18) (ZonkAny 17) a
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias a
a))
{-# INLINE gcopy #-}
instance (GCopyable f, GCopyable g) => GCopyable (f :*: g) where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α ((:*:) f g x) %1 -> (:*:) f g x
gcopy (UnsafeAlias (!f x
f :*: !g x
g)) =
Borrow (ZonkAny 14) (ZonkAny 13) (f x) %1 -> f x
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (f x) %1 -> f x
gcopy (f x -> Borrow (ZonkAny 14) (ZonkAny 13) (f x)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias f x
f) f x -> g x -> (:*:) f g x
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: Borrow (ZonkAny 16) (ZonkAny 15) (g x) %1 -> g x
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (g x) %1 -> g x
gcopy (g x -> Borrow (ZonkAny 16) (ZonkAny 15) (g x)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias g x
g)
instance (GCopyable f) => GCopyable (M1 i c f) where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (M1 i c f x) %1 -> M1 i c f x
gcopy = \case
UnsafeAlias (M1 !f x
x) -> f x -> M1 i c f x
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (Borrow (ZonkAny 12) (ZonkAny 11) (f x) %1 -> f x
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (f x) %1 -> f x
gcopy (f x -> Borrow (ZonkAny 12) (ZonkAny 11) (f x)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias f x
x))
instance (GCopyable f) => GCopyable (MP1 m f) where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (MP1 m f x) %1 -> MP1 m f x
gcopy = \case
UnsafeAlias (MP1 !f x
x) -> f x %m -> MP1 m f x
forall {k} (b :: k -> *) (c :: k) (a :: Multiplicity).
b c %a -> MP1 a b c
MP1 (Borrow (ZonkAny 10) (ZonkAny 9) (f x) %1 -> f x
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (f x) %1 -> f x
gcopy (f x -> Borrow (ZonkAny 10) (ZonkAny 9) (f x)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias f x
x))
instance (GCopyable f, GCopyable g) => GCopyable (f :+: g) where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α ((:+:) f g x) %1 -> (:+:) f g x
gcopy = \case
UnsafeAlias (L1 !f x
x) -> f x -> (:+:) f g x
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (Borrow (ZonkAny 6) (ZonkAny 5) (f x) %1 -> f x
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (f x) %1 -> f x
gcopy (f x -> Borrow (ZonkAny 6) (ZonkAny 5) (f x)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias f x
x))
UnsafeAlias (R1 !g x
x) -> g x -> (:+:) f g x
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (Borrow (ZonkAny 8) (ZonkAny 7) (g x) %1 -> g x
forall {k} (f :: k -> *) (bk :: BorrowKind) (α :: Lifetime)
(x :: k).
GCopyable f =>
Borrow bk α (f x) %1 -> f x
forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (g x) %1 -> g x
gcopy (g x -> Borrow (ZonkAny 8) (ZonkAny 7) (g x)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias g x
x))
instance GCopyable U1 where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (U1 x) %1 -> U1 x
gcopy = \case
UnsafeAlias U1 x
U1 -> U1 x
forall k (p :: k). U1 p
U1
instance GCopyable V1 where
gcopy :: forall (bk :: BorrowKind) (α :: Lifetime) (x :: k).
Borrow bk α (V1 x) %1 -> V1 x
gcopy = \case {} (V1 x %1 -> V1 x)
-> (Alias ('Borrow bk) α (V1 x) %1 -> V1 x)
-> Alias ('Borrow bk) α (V1 x)
%1 -> V1 x
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Alias ('Borrow bk) α (V1 x) %1 -> V1 x
forall (ak :: AliasKind) (α :: Lifetime) a. Alias ak α a %1 -> a
unsafeUnalias
instance (GenericCopyable a) => Copyable (Generically a) where
copy :: forall (bk :: BorrowKind) (α :: Lifetime).
Borrow bk α (Generically a) %1 -> Generically a
copy = a -> Generically a
forall a. a -> Generically a
Generically (a %1 -> Generically a)
-> (Alias ('Borrow bk) α (Generically a) %1 -> a)
-> Alias ('Borrow bk) α (Generically a)
%1 -> Generically a
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Borrow bk α a %1 -> a
forall a (bk :: BorrowKind) (α :: Lifetime).
GenericCopyable a =>
Borrow bk α a %1 -> a
genericCopy (Borrow bk α a %1 -> a)
-> (Alias ('Borrow bk) α (Generically a) %1 -> Borrow bk α a)
-> Alias ('Borrow bk) α (Generically a)
%1 -> a
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. (Generically a %1 -> a)
%1 -> Alias ('Borrow bk) α (Generically a) %1 -> Borrow bk α a
forall a b (ak :: AliasKind) (α :: Lifetime).
(a %1 -> b) %1 -> Alias ak α a %1 -> Alias ak α b
unsafeMapAlias (\(Generically a
x) -> a
x)
deriving via Generically () instance Copyable ()
deriving via
Generically (Sum a)
instance
(Copyable a) => Copyable (Sum a)
deriving via
Generically (Product a)
instance
(Copyable a) => Copyable (Product a)
deriving via
Generically [a]
instance
(Copyable a) => Copyable [a]
deriving via
Generically (Sem.Max a)
instance
(Copyable a) => Copyable (Sem.Max a)
deriving via
Generically (Maybe a)
instance
(Copyable a) => Copyable (Maybe a)
deriving via
Generically (Sem.Min a)
instance
(Copyable a) => Copyable (Sem.Min a)
deriving via
Generically (a, b)
instance
(Copyable a, Copyable b) =>
Copyable (a, b)
deriving via
Generically (a, b, c)
instance
(Copyable a, Copyable b, Copyable c) =>
Copyable (a, b, c)
deriving via
Generically (a, b, c, d)
instance
(Copyable a, Copyable b, Copyable c, Copyable d) =>
Copyable (a, b, c, d)
deriving via
Generically (Either a b)
instance
(Copyable a, Copyable b) => Copyable (Either a b)
deriving via
Generically (Sem.Arg a b)
instance
(Copyable a, Copyable b) => Copyable (Sem.Arg a b)
newtype AsCopyable1 f a = AsCopyable1 (f a)
instance (Copyable1 f, Copyable a) => Copyable (AsCopyable1 f a) where
copy :: forall (bk :: BorrowKind) (α :: Lifetime).
Borrow bk α (AsCopyable1 f a) %1 -> AsCopyable1 f a
copy = f a -> AsCopyable1 f a
forall {k} (f :: k -> *) (a :: k). f a -> AsCopyable1 f a
AsCopyable1 (f a %1 -> AsCopyable1 f a)
-> (Alias ('Borrow bk) α (AsCopyable1 f a) %1 -> f a)
-> Alias ('Borrow bk) α (AsCopyable1 f a)
%1 -> AsCopyable1 f a
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Borrow bk α (f a) %1 -> f a
forall (f :: * -> *) a (bk :: BorrowKind) (α :: Lifetime).
(Copyable1 f, Copyable a) =>
Borrow bk α (f a) %1 -> f a
copy1 (Borrow bk α (f a) %1 -> f a)
-> (Alias ('Borrow bk) α (AsCopyable1 f a) %1 -> Borrow bk α (f a))
-> Alias ('Borrow bk) α (AsCopyable1 f a)
%1 -> f a
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. (AsCopyable1 f a %1 -> f a)
%1 -> Alias ('Borrow bk) α (AsCopyable1 f a)
%1 -> Borrow bk α (f a)
forall a b (ak :: AliasKind) (α :: Lifetime).
(a %1 -> b) %1 -> Alias ak α a %1 -> Alias ak α b
unsafeMapAlias \(AsCopyable1 f a
x) -> f a
x
{-# INLINE copy #-}
class Copyable1 f where
liftCopy :: (Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
type GenericCopyable1 f = (Copyable1 (Rep1 @Type f), Generic1 f)
genericLiftCopy :: forall f bk a b α. (GenericCopyable1 f) => (Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
{-# INLINE genericLiftCopy #-}
genericLiftCopy :: forall (f :: * -> *) (bk :: BorrowKind) a b (α :: Lifetime).
GenericCopyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
genericLiftCopy Borrow bk α a %1 -> b
f (UnsafeAlias f a
x) = Rep1 f b %1 -> f b
forall p (m :: Multiplicity). Rep1 f p %m -> f p
forall {k} (f :: k -> *) (p :: k) (m :: Multiplicity).
Generic1 f =>
Rep1 f p %m -> f p
to1 (Rep1 f b %1 -> f b) -> Rep1 f b %1 -> f b
forall a b (p :: Multiplicity) (q :: Multiplicity).
(a %p -> b) %q -> a %p -> b
$ (Borrow bk α a %1 -> b) -> Borrow bk α (Rep1 f a) %1 -> Rep1 f b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (Rep1 f a) %1 -> Rep1 f b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f (Rep1 f a -> Borrow bk α (Rep1 f a)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias (Rep1 f a %1 -> Borrow bk α (Rep1 f a))
-> Rep1 f a %1 -> Borrow bk α (Rep1 f a)
forall a b (p :: Multiplicity) (q :: Multiplicity).
(a %p -> b) %q -> a %p -> b
$ f a %1 -> Rep1 f a
forall p (m :: Multiplicity). f p %m -> Rep1 f p
forall {k} (f :: k -> *) (p :: k) (m :: Multiplicity).
Generic1 f =>
f p %m -> Rep1 f p
from1 f a
x)
genericCopy1 :: forall f a α. (GenericCopyable1 f, Copyable a) => Share α (f a) %1 -> f a
{-# INLINE genericCopy1 #-}
genericCopy1 :: forall (f :: * -> *) a (α :: Lifetime).
(GenericCopyable1 f, Copyable a) =>
Share α (f a) %1 -> f a
genericCopy1 = (Borrow 'Share α a %1 -> a) -> Borrow 'Share α (f a) %1 -> f a
forall (f :: * -> *) (bk :: BorrowKind) a b (α :: Lifetime).
GenericCopyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
genericLiftCopy Borrow 'Share α a %1 -> a
forall a (bk :: BorrowKind) (α :: Lifetime).
Copyable a =>
Borrow bk α a %1 -> a
forall (bk :: BorrowKind) (α :: Lifetime). Borrow bk α a %1 -> a
copy
copy1 :: (Copyable1 f, Copyable a) => Borrow bk α (f a) %1 -> f a
{-# INLINE copy1 #-}
copy1 :: forall (f :: * -> *) a (bk :: BorrowKind) (α :: Lifetime).
(Copyable1 f, Copyable a) =>
Borrow bk α (f a) %1 -> f a
copy1 = (Borrow bk α a %1 -> a) -> Borrow bk α (f a) %1 -> f a
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> a
forall a (bk :: BorrowKind) (α :: Lifetime).
Copyable a =>
Borrow bk α a %1 -> a
forall (bk :: BorrowKind) (α :: Lifetime). Borrow bk α a %1 -> a
copy
instance (GenericCopyable1 f) => Copyable1 (Generically1 @Type f) where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b)
-> Borrow bk α (Generically1 f a) %1 -> Generically1 f b
liftCopy Borrow bk α a %1 -> b
f = f b -> Generically1 f b
forall {k} (f :: k -> *) (a :: k). f a -> Generically1 f a
Generically1 (f b %1 -> Generically1 f b)
-> (Borrow bk α (Generically1 f a) %1 -> f b)
-> Borrow bk α (Generically1 f a)
%1 -> Generically1 f b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. (Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
forall (f :: * -> *) (bk :: BorrowKind) a b (α :: Lifetime).
GenericCopyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
genericLiftCopy Borrow bk α a %1 -> b
f (Borrow bk α (f a) %1 -> f b)
-> (Borrow bk α (Generically1 f a) %1 -> Borrow bk α (f a))
-> Borrow bk α (Generically1 f a)
%1 -> f b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Borrow bk α (Generically1 f a) %1 -> Borrow bk α (f a)
forall a b. Coercible a b => a %1 -> b
coerceLin
{-# INLINE liftCopy #-}
instance (Copyable c) => Copyable1 (K1 i c) where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (K1 i c a) %1 -> K1 i c b
liftCopy Borrow bk α a %1 -> b
_ = (Borrow (ZonkAny 3) (ZonkAny 4) c %1 -> c)
%1 -> Borrow bk α (K1 i c a) %1 -> K1 i c b
forall a b. Coercible a b => a %1 -> b
coerceLin ((Borrow (ZonkAny 3) (ZonkAny 4) c %1 -> c)
%1 -> Borrow bk α (K1 i c a) %1 -> K1 i c b)
-> (Borrow (ZonkAny 3) (ZonkAny 4) c %1 -> c)
%1 -> Borrow bk α (K1 i c a)
%1 -> K1 i c b
forall a b (p :: Multiplicity) (q :: Multiplicity).
(a %p -> b) %q -> a %p -> b
$! forall a (bk :: BorrowKind) (α :: Lifetime).
Copyable a =>
Borrow bk α a %1 -> a
copy @c
{-# INLINE liftCopy #-}
instance Copyable1 Par1 where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (Par1 a) %1 -> Par1 b
liftCopy Borrow bk α a %1 -> b
f = b -> Par1 b
forall p. p -> Par1 p
Par1 (b %1 -> Par1 b)
-> (Borrow bk α (Par1 a) %1 -> b)
-> Borrow bk α (Par1 a)
%1 -> Par1 b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Borrow bk α a %1 -> b
f (Borrow bk α a %1 -> b)
-> (Borrow bk α (Par1 a) %1 -> Borrow bk α a)
-> Borrow bk α (Par1 a)
%1 -> b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Borrow bk α (Par1 a) %1 -> Borrow bk α a
forall a b. Coercible a b => a %1 -> b
coerceLin
{-# INLINE liftCopy #-}
instance (Copyable1 f) => Copyable1 (M1 i c f) where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b)
-> Borrow bk α (M1 i c f a) %1 -> M1 i c f b
liftCopy Borrow bk α a %1 -> b
f = f b -> M1 i c f b
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
M1 (f b %1 -> M1 i c f b)
-> (Borrow bk α (M1 i c f a) %1 -> f b)
-> Borrow bk α (M1 i c f a)
%1 -> M1 i c f b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. (Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f (Borrow bk α (f a) %1 -> f b)
-> (Borrow bk α (M1 i c f a) %1 -> Borrow bk α (f a))
-> Borrow bk α (M1 i c f a)
%1 -> f b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. Borrow bk α (M1 i c f a) %1 -> Borrow bk α (f a)
forall a b. Coercible a b => a %1 -> b
coerceLin
{-# INLINE liftCopy #-}
instance (Copyable1 l, Copyable1 r) => Copyable1 (l :*: r) where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b)
-> Borrow bk α ((:*:) l r a) %1 -> (:*:) l r b
liftCopy Borrow bk α a %1 -> b
f = \(UnsafeAlias (!l a
l :*: !r a
r)) ->
let !l' :: l b
l' = (Borrow bk α a %1 -> b) -> Borrow bk α (l a) %1 -> l b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (l a) %1 -> l b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f (l a -> Borrow bk α (l a)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias l a
l)
!r' :: r b
r' = (Borrow bk α a %1 -> b) -> Borrow bk α (r a) %1 -> r b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (r a) %1 -> r b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f (r a -> Borrow bk α (r a)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias r a
r)
in l b
l' l b -> r b -> (:*:) l r b
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: r b
r'
{-# INLINE liftCopy #-}
instance (Copyable1 f, Copyable1 g) => Copyable1 (f :.: g) where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b)
-> Borrow bk α ((:.:) f g a) %1 -> (:.:) f g b
liftCopy Borrow bk α a %1 -> b
f = \(UnsafeAlias (Comp1 f (g a)
x)) ->
f (g b) -> (:.:) f g b
forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (x :: k1).
f (g x) -> (:.:) f g x
Comp1 (f (g b) %1 -> (:.:) f g b)
-> (Borrow bk α (f (g a)) %1 -> f (g b))
-> Borrow bk α (f (g a))
%1 -> (:.:) f g b
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. (Borrow bk α (g a) %1 -> g b)
-> Borrow bk α (f (g a)) %1 -> f (g b)
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy ((Borrow bk α a %1 -> b) -> Borrow bk α (g a) %1 -> g b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (g a) %1 -> g b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f) (Borrow bk α (f (g a)) %1 -> (:.:) f g b)
-> Borrow bk α (f (g a)) %1 -> (:.:) f g b
forall a b (p :: Multiplicity) (q :: Multiplicity).
(a %p -> b) %q -> a %p -> b
$ f (g a) -> Borrow bk α (f (g a))
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias f (g a)
x
{-# INLINE liftCopy #-}
instance (Copyable1 l, Copyable1 r) => Copyable1 (l :+: r) where
liftCopy :: forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b)
-> Borrow bk α ((:+:) l r a) %1 -> (:+:) l r b
liftCopy Borrow bk α a %1 -> b
f = \(UnsafeAlias (:+:) l r a
sum) -> case (:+:) l r a
sum of
L1 !l a
l -> l b -> (:+:) l r b
forall k (f :: k -> *) (g :: k -> *) (p :: k). f p -> (:+:) f g p
L1 (l b %1 -> (:+:) l r b) -> l b %1 -> (:+:) l r b
forall a b (p :: Multiplicity) (q :: Multiplicity).
(a %p -> b) %q -> a %p -> b
$! ((Borrow bk α a %1 -> b) -> Borrow bk α (l a) %1 -> l b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (l a) %1 -> l b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f (l a -> Borrow bk α (l a)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias l a
l))
R1 !r a
r -> r b -> (:+:) l r b
forall k (f :: k -> *) (g :: k -> *) (p :: k). g p -> (:+:) f g p
R1 (r b %1 -> (:+:) l r b) -> r b %1 -> (:+:) l r b
forall a b (p :: Multiplicity) (q :: Multiplicity).
(a %p -> b) %q -> a %p -> b
$! ((Borrow bk α a %1 -> b) -> Borrow bk α (r a) %1 -> r b
forall (bk :: BorrowKind) (α :: Lifetime) a b.
(Borrow bk α a %1 -> b) -> Borrow bk α (r a) %1 -> r b
forall (f :: * -> *) (bk :: BorrowKind) (α :: Lifetime) a b.
Copyable1 f =>
(Borrow bk α a %1 -> b) -> Borrow bk α (f a) %1 -> f b
liftCopy Borrow bk α a %1 -> b
f (r a -> Borrow bk α (r a)
forall (ak :: AliasKind) (α :: Lifetime) a. a -> Alias ak α a
UnsafeAlias r a
r))
{-# INLINE liftCopy #-}
copyMut :: (Copyable a) => Mut α a %1 -> Ur a
{-# INLINE copyMut #-}
copyMut :: forall a (α :: Lifetime). Copyable a => Mut α a %1 -> Ur a
copyMut Mut α a
mut =
let !(Ur Share α a
shr) = Mut α a %1 -> Ur (Share α a)
forall (k :: BorrowKind) (α :: Lifetime) a.
Borrow k α a %1 -> Ur (Share α a)
share Mut α a
mut
in a -> Ur a
forall a. a -> Ur a
Ur (Share α a %1 -> a
forall a (bk :: BorrowKind) (α :: Lifetime).
Copyable a =>
Borrow bk α a %1 -> a
forall (bk :: BorrowKind) (α :: Lifetime). Borrow bk α a %1 -> a
copy Share α a
shr)