{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE LinearTypes #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}
{-# OPTIONS_HADDOCK hide #-}
module Data.Unrestricted.Linear.Internal.Consumable
(
Consumable (..),
lseq,
seqUnit,
GConsumable,
genericConsume,
)
where
import Data.List.NonEmpty (NonEmpty)
import qualified Data.Monoid as Monoid
import qualified Data.Replicator.Linear.Internal as Replicator
import qualified Data.Replicator.Linear.Internal.ReplicationStream as ReplicationStream
import qualified Data.Semigroup as Semigroup
import Data.Unrestricted.Linear.Internal.Ur
import qualified Data.Vector as Vector
import Data.Void (Void)
import GHC.Tuple (Solo)
import GHC.Types (Multiplicity (..))
import Generics.Linear
import Prelude.Linear.Generically
import Prelude.Linear.Internal
import qualified Unsafe.Linear as Unsafe
import qualified Prelude as Prelude
class Consumable a where
consume :: a %1 -> ()
seqUnit :: () %1 -> b %1 -> b
seqUnit :: forall b. () %1 -> b %1 -> b
seqUnit () b
b = b
b
lseq :: Consumable a => a %1 -> b %1 -> b
lseq :: forall a b. Consumable a => a %1 -> b %1 -> b
lseq a
a b
b = () %1 -> b %1 -> b
forall b. () %1 -> b %1 -> b
seqUnit (a %1 -> ()
forall a. Consumable a => a %1 -> ()
consume a
a) b
b
infixr 0 `lseq`
instance Consumable (ReplicationStream.ReplicationStream a) where
consume :: ReplicationStream a %1 -> ()
consume = ReplicationStream a %1 -> ()
forall a. ReplicationStream a %1 -> ()
ReplicationStream.consume
instance Consumable (Replicator.Replicator a) where
consume :: Replicator a %1 -> ()
consume = Replicator a %1 -> ()
forall a. Replicator a %1 -> ()
Replicator.consume
instance Consumable a => Consumable (Vector.Vector a) where
consume :: Vector a %1 -> ()
consume Vector a
xs = [a] %1 -> ()
forall a. Consumable a => a %1 -> ()
consume ((Vector a -> [a]) %1 -> Vector a %1 -> [a]
forall a b (p :: Multiplicity) (x :: Multiplicity).
(a %p -> b) %1 -> a %x -> b
Unsafe.toLinear Vector a -> [a]
forall a. Vector a -> [a]
Vector.toList Vector a
xs)
deriving via
Generically Prelude.Char
instance
Consumable Prelude.Char
deriving via
Generically Prelude.Double
instance
Consumable Prelude.Double
deriving via
Generically Prelude.Float
instance
Consumable Prelude.Float
deriving via
Generically Prelude.Int
instance
Consumable Prelude.Int
deriving via
Generically Prelude.Word
instance
Consumable Prelude.Word
deriving via
Generically Prelude.Ordering
instance
Consumable Prelude.Ordering
deriving via
Generically Prelude.Bool
instance
Consumable Prelude.Bool
deriving via
Generically ()
instance
Consumable ()
instance Consumable Void where
consume :: Void %1 -> ()
consume = \case {}
deriving via
Generically (Solo a)
instance
_ => Consumable (Solo a)
deriving via
Generically (a, b)
instance
_ => Consumable (a, b)
deriving via
Generically (a, b, c)
instance
_ => Consumable (a, b, c)
deriving via
Generically (a, b, c, d)
instance
_ => Consumable (a, b, c, d)
deriving via
Generically (a, b, c, d, e)
instance
_ => Consumable (a, b, c, d, e)
deriving via
Generically (Prelude.Maybe a)
instance
_ => Consumable (Prelude.Maybe a)
deriving via
Generically (Prelude.Either e a)
instance
_ => Consumable (Prelude.Either e a)
deriving via
Generically [a]
instance
_ => Consumable [a]
deriving via
Generically (NonEmpty a)
instance
_ => Consumable (NonEmpty a)
deriving via
Generically (Ur a)
instance
Consumable (Ur a)
deriving via
Generically (Semigroup.Arg a b)
instance
_ => Consumable (Semigroup.Arg a b)
deriving newtype instance _ => Consumable (Semigroup.Min a)
deriving newtype instance _ => Consumable (Semigroup.Max a)
deriving newtype instance _ => Consumable (Semigroup.First a)
deriving newtype instance _ => Consumable (Semigroup.Last a)
deriving newtype instance _ => Consumable (Semigroup.WrappedMonoid a)
deriving newtype instance _ => Consumable (Semigroup.Dual a)
deriving newtype instance Consumable Semigroup.All
deriving newtype instance Consumable Semigroup.Any
deriving newtype instance _ => Consumable (Semigroup.Sum a)
deriving newtype instance _ => Consumable (Semigroup.Product a)
deriving newtype instance _ => Consumable (Monoid.First a)
deriving newtype instance _ => Consumable (Monoid.Last a)
deriving newtype instance _ => Consumable (Monoid.Alt f a)
deriving newtype instance _ => Consumable (Monoid.Ap f a)
instance (Generic a, GConsumable (Rep a)) => Consumable (Generically a) where
consume :: Generically a %1 -> ()
consume (Generically a
x) = a %1 -> ()
forall a. (Generic a, GConsumable (Rep a)) => a %1 -> ()
genericConsume a
x
genericConsume :: (Generic a, GConsumable (Rep a)) => a %1 -> ()
genericConsume :: forall a. (Generic a, GConsumable (Rep a)) => a %1 -> ()
genericConsume = Rep a Any %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume (Rep a Any %1 -> ()) -> (a %1 -> Rep a Any) -> a %1 -> ()
forall b c a (q :: Multiplicity) (m :: Multiplicity)
(n :: Multiplicity).
(b %1 -> c) %q -> (a %1 -> b) %m -> a %n -> c
. a %1 -> Rep a Any
forall a p (m :: Multiplicity). Generic a => a %m -> Rep a p
from
{-# INLINEABLE genericConsume #-}
class GConsumable f where
gconsume :: f p %1 -> ()
instance GConsumable V1 where
gconsume :: forall p. V1 p %1 -> ()
gconsume = \case {}
{-# INLINE gconsume #-}
instance GConsumable U1 where
gconsume :: forall p. U1 p %1 -> ()
gconsume U1 p
U1 = ()
{-# INLINE gconsume #-}
instance (GConsumable f, GConsumable g) => GConsumable (f :+: g) where
gconsume :: forall p. (:+:) f g p %1 -> ()
gconsume (L1 f p
a) = f p %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume f p
a
gconsume (R1 g p
a) = g p %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume g p
a
{-# INLINE gconsume #-}
instance (GConsumable f, GConsumable g) => GConsumable (f :*: g) where
gconsume :: forall p. (:*:) f g p %1 -> ()
gconsume (f p
a :*: g p
b) = f p %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume f p
a () %1 -> () %1 -> ()
forall b. () %1 -> b %1 -> b
`seqUnit` g p %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume g p
b
{-# INLINE gconsume #-}
instance Consumable c => GConsumable (K1 i c) where
gconsume :: forall p. K1 i c p %1 -> ()
gconsume (K1 c
c) = c %1 -> ()
forall a. Consumable a => a %1 -> ()
consume c
c
{-# INLINE gconsume #-}
instance GConsumable f => GConsumable (M1 i t f) where
gconsume :: forall p. M1 i t f p %1 -> ()
gconsume (M1 f p
a) = f p %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume f p
a
{-# INLINE gconsume #-}
instance GConsumable (MP1 'Many f) where
gconsume :: forall p. MP1 'Many f p %1 -> ()
gconsume (MP1 f p
_) = ()
{-# INLINE gconsume #-}
instance GConsumable f => GConsumable (MP1 'One f) where
gconsume :: forall p. MP1 'One f p %1 -> ()
gconsume (MP1 f p
x) = f p %1 -> ()
forall (f :: * -> *) p. GConsumable f => f p %1 -> ()
gconsume f p
x
{-# INLINE gconsume #-}
instance GConsumable UChar where
gconsume :: forall p. UChar p %1 -> ()
gconsume (UChar Char#
x) = (Char# -> ()) %1 -> Char# %1 -> ()
forall a b (p :: Multiplicity) (x :: Multiplicity).
(a %p -> b) %1 -> a %x -> b
Unsafe.toLinear (\Char#
_ -> ()) Char#
x
instance GConsumable UDouble where
gconsume :: forall p. UDouble p %1 -> ()
gconsume (UDouble Double#
x) = (Double# -> ()) %1 -> Double# %1 -> ()
forall a b (p :: Multiplicity) (x :: Multiplicity).
(a %p -> b) %1 -> a %x -> b
Unsafe.toLinear (\Double#
_ -> ()) Double#
x
instance GConsumable UFloat where
gconsume :: forall p. UFloat p %1 -> ()
gconsume (UFloat Float#
x) = (Float# -> ()) %1 -> Float# %1 -> ()
forall a b (p :: Multiplicity) (x :: Multiplicity).
(a %p -> b) %1 -> a %x -> b
Unsafe.toLinear (\Float#
_ -> ()) Float#
x
instance GConsumable UInt where
gconsume :: forall p. UInt p %1 -> ()
gconsume (UInt Int#
x) = (Int# -> ()) %1 -> Int# %1 -> ()
forall a b (p :: Multiplicity) (x :: Multiplicity).
(a %p -> b) %1 -> a %x -> b
Unsafe.toLinear (\Int#
_ -> ()) Int#
x
instance GConsumable UWord where
gconsume :: forall p. UWord p %1 -> ()
gconsume (UWord Word#
x) = (Word# -> ()) %1 -> Word# %1 -> ()
forall a b (p :: Multiplicity) (x :: Multiplicity).
(a %p -> b) %1 -> a %x -> b
Unsafe.toLinear (\Word#
_ -> ()) Word#
x