{-# OPTIONS_GHC -Wno-orphans #-}

module PlutusLedgerApi.Orphans.Common (
  Blake2b256Hash (..),
  Blake2b244Hash (..),
  getBlake2b256Hash,
  getBlake2b244Hash,
  UnsortedAssocMap,
  getUnsortedAssocMap,
) where

import Data.ByteString (ByteString)
import Data.Coerce (coerce)
import Data.Kind (Type)
import Data.Set qualified as Set
import PlutusLedgerApi.QuickCheck.Utils (unSizedByteString)
import PlutusPrelude (Pretty)
import PlutusTx.AssocMap qualified as AssocMap
import PlutusTx.Builtins qualified as Builtins
import PlutusTx.Prelude qualified as PlutusTx
import PlutusTx.Ratio (fromGHC, toGHC)
import Test.QuickCheck (
  Arbitrary (arbitrary, shrink),
  Arbitrary1 (liftArbitrary, liftShrink),
  CoArbitrary (coarbitrary),
  Function (function),
  Gen,
  NonNegative (NonNegative),
  functionMap,
  getNonNegative,
  liftArbitrary,
  oneof,
  scale,
  shuffle,
  sized,
  variant,
 )

-- | @since WIP
instance Arbitrary PlutusTx.Rational where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen Rational
arbitrary = Rational -> Rational
fromGHC (Rational -> Rational) -> Gen Rational -> Gen Rational
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Rational
forall a. Arbitrary a => Gen a
arbitrary
  {-# INLINEABLE shrink #-}
  shrink :: Rational -> [Rational]
shrink = (Rational -> Rational) -> [Rational] -> [Rational]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap Rational -> Rational
fromGHC ([Rational] -> [Rational])
-> (Rational -> [Rational]) -> Rational -> [Rational]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> [Rational]
forall a. Arbitrary a => a -> [a]
shrink (Rational -> [Rational])
-> (Rational -> Rational) -> Rational -> [Rational]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Rational
toGHC

-- | @since 1.0.0
instance Arbitrary PlutusTx.BuiltinByteString where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen BuiltinByteString
arbitrary = forall a. HasToBuiltin a => a -> ToBuiltin a
PlutusTx.toBuiltin @ByteString (ByteString -> BuiltinByteString)
-> Gen ByteString -> Gen BuiltinByteString
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ByteString
forall a. Arbitrary a => Gen a
arbitrary
  {-# INLINEABLE shrink #-}
  shrink :: BuiltinByteString -> [BuiltinByteString]
shrink = (ByteString -> BuiltinByteString)
-> [ByteString] -> [BuiltinByteString]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. HasToBuiltin a => a -> ToBuiltin a
PlutusTx.toBuiltin @ByteString) ([ByteString] -> [BuiltinByteString])
-> (BuiltinByteString -> [ByteString])
-> BuiltinByteString
-> [BuiltinByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [ByteString]
forall a. Arbitrary a => a -> [a]
shrink (ByteString -> [ByteString])
-> (BuiltinByteString -> ByteString)
-> BuiltinByteString
-> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinByteString -> ByteString
BuiltinByteString -> FromBuiltin BuiltinByteString
forall arep. HasFromBuiltin arep => arep -> FromBuiltin arep
PlutusTx.fromBuiltin

-- | @since 1.0.0
instance CoArbitrary PlutusTx.BuiltinByteString where
  {-# INLINEABLE coarbitrary #-}
  coarbitrary :: forall b. BuiltinByteString -> Gen b -> Gen b
coarbitrary = ByteString -> Gen b -> Gen b
forall b. ByteString -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (ByteString -> Gen b -> Gen b)
-> (BuiltinByteString -> ByteString)
-> BuiltinByteString
-> Gen b
-> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinByteString -> ByteString
BuiltinByteString -> FromBuiltin BuiltinByteString
forall arep. HasFromBuiltin arep => arep -> FromBuiltin arep
PlutusTx.fromBuiltin

-- | @since 1.0.0
instance Function PlutusTx.BuiltinByteString where
  {-# INLINEABLE function #-}
  function :: forall b. (BuiltinByteString -> b) -> BuiltinByteString :-> b
function = (BuiltinByteString -> ByteString)
-> (ByteString -> BuiltinByteString)
-> (BuiltinByteString -> b)
-> BuiltinByteString :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap BuiltinByteString -> ByteString
BuiltinByteString -> FromBuiltin BuiltinByteString
forall arep. HasFromBuiltin arep => arep -> FromBuiltin arep
PlutusTx.fromBuiltin (forall a. HasToBuiltin a => a -> ToBuiltin a
PlutusTx.toBuiltin @ByteString)

{- | Wrapper for BLAKE2b-244 hashes for convenience.
@since
-}
newtype Blake2b244Hash = Blake2b244Hash PlutusTx.BuiltinByteString
  deriving (Blake2b244Hash -> Blake2b244Hash -> Bool
(Blake2b244Hash -> Blake2b244Hash -> Bool)
-> (Blake2b244Hash -> Blake2b244Hash -> Bool) -> Eq Blake2b244Hash
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Blake2b244Hash -> Blake2b244Hash -> Bool
== :: Blake2b244Hash -> Blake2b244Hash -> Bool
$c/= :: Blake2b244Hash -> Blake2b244Hash -> Bool
/= :: Blake2b244Hash -> Blake2b244Hash -> Bool
Eq, Eq Blake2b244Hash
Eq Blake2b244Hash =>
(Blake2b244Hash -> Blake2b244Hash -> Ordering)
-> (Blake2b244Hash -> Blake2b244Hash -> Bool)
-> (Blake2b244Hash -> Blake2b244Hash -> Bool)
-> (Blake2b244Hash -> Blake2b244Hash -> Bool)
-> (Blake2b244Hash -> Blake2b244Hash -> Bool)
-> (Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash)
-> (Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash)
-> Ord Blake2b244Hash
Blake2b244Hash -> Blake2b244Hash -> Bool
Blake2b244Hash -> Blake2b244Hash -> Ordering
Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Blake2b244Hash -> Blake2b244Hash -> Ordering
compare :: Blake2b244Hash -> Blake2b244Hash -> Ordering
$c< :: Blake2b244Hash -> Blake2b244Hash -> Bool
< :: Blake2b244Hash -> Blake2b244Hash -> Bool
$c<= :: Blake2b244Hash -> Blake2b244Hash -> Bool
<= :: Blake2b244Hash -> Blake2b244Hash -> Bool
$c> :: Blake2b244Hash -> Blake2b244Hash -> Bool
> :: Blake2b244Hash -> Blake2b244Hash -> Bool
$c>= :: Blake2b244Hash -> Blake2b244Hash -> Bool
>= :: Blake2b244Hash -> Blake2b244Hash -> Bool
$cmax :: Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash
max :: Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash
$cmin :: Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash
min :: Blake2b244Hash -> Blake2b244Hash -> Blake2b244Hash
Ord) via PlutusTx.BuiltinByteString
  deriving stock (Int -> Blake2b244Hash -> ShowS
[Blake2b244Hash] -> ShowS
Blake2b244Hash -> String
(Int -> Blake2b244Hash -> ShowS)
-> (Blake2b244Hash -> String)
-> ([Blake2b244Hash] -> ShowS)
-> Show Blake2b244Hash
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Blake2b244Hash -> ShowS
showsPrec :: Int -> Blake2b244Hash -> ShowS
$cshow :: Blake2b244Hash -> String
show :: Blake2b244Hash -> String
$cshowList :: [Blake2b244Hash] -> ShowS
showList :: [Blake2b244Hash] -> ShowS
Show)

-- No shrinker, as it doesn't make much sense to.
instance Arbitrary Blake2b244Hash where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen Blake2b244Hash
arbitrary =
    BuiltinByteString -> Blake2b244Hash
Blake2b244Hash (BuiltinByteString -> Blake2b244Hash)
-> (SizedByteString 28 -> BuiltinByteString)
-> SizedByteString 28
-> Blake2b244Hash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasToBuiltin a => a -> ToBuiltin a
PlutusTx.toBuiltin @ByteString (ByteString -> BuiltinByteString)
-> (SizedByteString 28 -> ByteString)
-> SizedByteString 28
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat). SizedByteString n -> ByteString
unSizedByteString @28 (SizedByteString 28 -> Blake2b244Hash)
-> Gen (SizedByteString 28) -> Gen Blake2b244Hash
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (SizedByteString 28)
forall a. Arbitrary a => Gen a
arbitrary

deriving via PlutusTx.BuiltinByteString instance CoArbitrary Blake2b244Hash

getBlake2b244Hash :: Blake2b244Hash -> PlutusTx.BuiltinByteString
getBlake2b244Hash :: Blake2b244Hash -> BuiltinByteString
getBlake2b244Hash = Blake2b244Hash -> BuiltinByteString
forall a b. Coercible a b => a -> b
coerce

-- Wrapper for BLAKE2b-256 hashes for convenience.
newtype Blake2b256Hash = Blake2b256Hash PlutusTx.BuiltinByteString
  deriving (Blake2b256Hash -> Blake2b256Hash -> Bool
(Blake2b256Hash -> Blake2b256Hash -> Bool)
-> (Blake2b256Hash -> Blake2b256Hash -> Bool) -> Eq Blake2b256Hash
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Blake2b256Hash -> Blake2b256Hash -> Bool
== :: Blake2b256Hash -> Blake2b256Hash -> Bool
$c/= :: Blake2b256Hash -> Blake2b256Hash -> Bool
/= :: Blake2b256Hash -> Blake2b256Hash -> Bool
Eq, Eq Blake2b256Hash
Eq Blake2b256Hash =>
(Blake2b256Hash -> Blake2b256Hash -> Ordering)
-> (Blake2b256Hash -> Blake2b256Hash -> Bool)
-> (Blake2b256Hash -> Blake2b256Hash -> Bool)
-> (Blake2b256Hash -> Blake2b256Hash -> Bool)
-> (Blake2b256Hash -> Blake2b256Hash -> Bool)
-> (Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash)
-> (Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash)
-> Ord Blake2b256Hash
Blake2b256Hash -> Blake2b256Hash -> Bool
Blake2b256Hash -> Blake2b256Hash -> Ordering
Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Blake2b256Hash -> Blake2b256Hash -> Ordering
compare :: Blake2b256Hash -> Blake2b256Hash -> Ordering
$c< :: Blake2b256Hash -> Blake2b256Hash -> Bool
< :: Blake2b256Hash -> Blake2b256Hash -> Bool
$c<= :: Blake2b256Hash -> Blake2b256Hash -> Bool
<= :: Blake2b256Hash -> Blake2b256Hash -> Bool
$c> :: Blake2b256Hash -> Blake2b256Hash -> Bool
> :: Blake2b256Hash -> Blake2b256Hash -> Bool
$c>= :: Blake2b256Hash -> Blake2b256Hash -> Bool
>= :: Blake2b256Hash -> Blake2b256Hash -> Bool
$cmax :: Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash
max :: Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash
$cmin :: Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash
min :: Blake2b256Hash -> Blake2b256Hash -> Blake2b256Hash
Ord) via PlutusTx.BuiltinByteString
  deriving stock (Int -> Blake2b256Hash -> ShowS
[Blake2b256Hash] -> ShowS
Blake2b256Hash -> String
(Int -> Blake2b256Hash -> ShowS)
-> (Blake2b256Hash -> String)
-> ([Blake2b256Hash] -> ShowS)
-> Show Blake2b256Hash
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Blake2b256Hash -> ShowS
showsPrec :: Int -> Blake2b256Hash -> ShowS
$cshow :: Blake2b256Hash -> String
show :: Blake2b256Hash -> String
$cshowList :: [Blake2b256Hash] -> ShowS
showList :: [Blake2b256Hash] -> ShowS
Show)

-- No shrinker, as it doesn't make much sense to.
instance Arbitrary Blake2b256Hash where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen Blake2b256Hash
arbitrary =
    BuiltinByteString -> Blake2b256Hash
Blake2b256Hash (BuiltinByteString -> Blake2b256Hash)
-> (SizedByteString 32 -> BuiltinByteString)
-> SizedByteString 32
-> Blake2b256Hash
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasToBuiltin a => a -> ToBuiltin a
PlutusTx.toBuiltin @ByteString (ByteString -> BuiltinByteString)
-> (SizedByteString 32 -> ByteString)
-> SizedByteString 32
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat). SizedByteString n -> ByteString
unSizedByteString @32 (SizedByteString 32 -> Blake2b256Hash)
-> Gen (SizedByteString 32) -> Gen Blake2b256Hash
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (SizedByteString 32)
forall a. Arbitrary a => Gen a
arbitrary

deriving via PlutusTx.BuiltinByteString instance CoArbitrary Blake2b256Hash

getBlake2b256Hash :: Blake2b256Hash -> PlutusTx.BuiltinByteString
getBlake2b256Hash :: Blake2b256Hash -> BuiltinByteString
getBlake2b256Hash = Blake2b256Hash -> BuiltinByteString
forall a b. Coercible a b => a -> b
coerce

{- | This is a very general instance, able to produce 'PlutusTx.BuiltinData' of
basically any shape. You probably want something more focused than this.

@since 1.0.0
-}
instance Arbitrary PlutusTx.BuiltinData where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen BuiltinData
arbitrary = (Int -> Gen BuiltinData) -> Gen BuiltinData
forall a. (Int -> Gen a) -> Gen a
sized ((Int -> Gen BuiltinData) -> Gen BuiltinData)
-> (Int -> Gen BuiltinData) -> Gen BuiltinData
forall a b. (a -> b) -> a -> b
$ \Int
size -> Int -> Gen BuiltinData
go Int
size
    where
      scaleDown :: forall (a :: Type). Gen a -> Gen a
      scaleDown :: forall a. Gen a -> Gen a
scaleDown = (Int -> Int) -> Gen a -> Gen a
forall a. (Int -> Int) -> Gen a -> Gen a
scale (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4)
      go :: Int -> Gen PlutusTx.BuiltinData
      go :: Int -> Gen BuiltinData
go Int
size
        | Int
size Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [Gen BuiltinData] -> Gen BuiltinData
forall a. HasCallStack => [Gen a] -> Gen a
oneof [Gen BuiltinData
genB, Gen BuiltinData
genI]
        | Bool
otherwise = [Gen BuiltinData] -> Gen BuiltinData
forall a. HasCallStack => [Gen a] -> Gen a
oneof [Gen BuiltinData
genB, Gen BuiltinData
genI, Gen BuiltinData
genConstr, Gen BuiltinData
genList, Gen BuiltinData
genMap]
      genB :: Gen PlutusTx.BuiltinData
      genB :: Gen BuiltinData
genB = BuiltinByteString -> BuiltinData
Builtins.mkB (BuiltinByteString -> BuiltinData)
-> Gen BuiltinByteString -> Gen BuiltinData
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen BuiltinByteString
forall a. Arbitrary a => Gen a
arbitrary
      genI :: Gen PlutusTx.BuiltinData
      genI :: Gen BuiltinData
genI = Integer -> BuiltinData
Builtins.mkI (Integer -> BuiltinData) -> Gen Integer -> Gen BuiltinData
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
      genConstr :: Gen PlutusTx.BuiltinData
      genConstr :: Gen BuiltinData
genConstr =
        Integer -> [BuiltinData] -> BuiltinData
Builtins.mkConstr (Integer -> [BuiltinData] -> BuiltinData)
-> (NonNegative Integer -> Integer)
-> NonNegative Integer
-> [BuiltinData]
-> BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonNegative Integer -> Integer
forall a. NonNegative a -> a
getNonNegative
          (NonNegative Integer -> [BuiltinData] -> BuiltinData)
-> Gen (NonNegative Integer) -> Gen ([BuiltinData] -> BuiltinData)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (NonNegative Integer)
forall a. Arbitrary a => Gen a
arbitrary
          Gen ([BuiltinData] -> BuiltinData)
-> Gen [BuiltinData] -> Gen BuiltinData
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Gen [BuiltinData] -> Gen [BuiltinData]
forall a. Gen a -> Gen a
scaleDown (Gen BuiltinData -> Gen [BuiltinData]
forall a. Gen a -> Gen [a]
forall (f :: Type -> Type) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen BuiltinData
forall a. Arbitrary a => Gen a
arbitrary)
      genList :: Gen PlutusTx.BuiltinData
      genList :: Gen BuiltinData
genList =
        [BuiltinData] -> BuiltinData
Builtins.mkList ([BuiltinData] -> BuiltinData)
-> Gen [BuiltinData] -> Gen BuiltinData
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [BuiltinData] -> Gen [BuiltinData]
forall a. Gen a -> Gen a
scaleDown (Gen BuiltinData -> Gen [BuiltinData]
forall a. Gen a -> Gen [a]
forall (f :: Type -> Type) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen BuiltinData
forall a. Arbitrary a => Gen a
arbitrary)
      genMap :: Gen PlutusTx.BuiltinData
      genMap :: Gen BuiltinData
genMap =
        [(BuiltinData, BuiltinData)] -> BuiltinData
Builtins.mkMap ([(BuiltinData, BuiltinData)] -> BuiltinData)
-> Gen [(BuiltinData, BuiltinData)] -> Gen BuiltinData
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [(BuiltinData, BuiltinData)]
-> Gen [(BuiltinData, BuiltinData)]
forall a. Gen a -> Gen a
scaleDown (Gen (BuiltinData, BuiltinData) -> Gen [(BuiltinData, BuiltinData)]
forall a. Gen a -> Gen [a]
forall (f :: Type -> Type) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary ((,) (BuiltinData -> BuiltinData -> (BuiltinData, BuiltinData))
-> Gen BuiltinData
-> Gen (BuiltinData -> (BuiltinData, BuiltinData))
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen BuiltinData
forall a. Arbitrary a => Gen a
arbitrary Gen (BuiltinData -> (BuiltinData, BuiltinData))
-> Gen BuiltinData -> Gen (BuiltinData, BuiltinData)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> Gen BuiltinData
forall a. Arbitrary a => Gen a
arbitrary))
  {-# INLINEABLE shrink #-}
  shrink :: BuiltinData -> [BuiltinData]
shrink BuiltinData
dat =
    BuiltinData
-> (Integer -> [BuiltinData] -> [BuiltinData])
-> ([(BuiltinData, BuiltinData)] -> [BuiltinData])
-> ([BuiltinData] -> [BuiltinData])
-> (Integer -> [BuiltinData])
-> (BuiltinByteString -> [BuiltinData])
-> [BuiltinData]
forall r.
BuiltinData
-> (Integer -> [BuiltinData] -> r)
-> ([(BuiltinData, BuiltinData)] -> r)
-> ([BuiltinData] -> r)
-> (Integer -> r)
-> (BuiltinByteString -> r)
-> r
Builtins.matchData
      BuiltinData
dat
      Integer -> [BuiltinData] -> [BuiltinData]
shrinkConstr
      [(BuiltinData, BuiltinData)] -> [BuiltinData]
shrinkMap
      [BuiltinData] -> [BuiltinData]
shrinkList
      ((NonNegative Integer -> BuiltinData)
-> [NonNegative Integer] -> [BuiltinData]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (Integer -> BuiltinData
Builtins.mkI (Integer -> BuiltinData)
-> (NonNegative Integer -> Integer)
-> NonNegative Integer
-> BuiltinData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonNegative Integer -> Integer
forall a. NonNegative a -> a
getNonNegative) ([NonNegative Integer] -> [BuiltinData])
-> (Integer -> [NonNegative Integer]) -> Integer -> [BuiltinData]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonNegative Integer -> [NonNegative Integer]
forall a. Arbitrary a => a -> [a]
shrink (NonNegative Integer -> [NonNegative Integer])
-> (Integer -> NonNegative Integer)
-> Integer
-> [NonNegative Integer]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> NonNegative Integer
forall a. a -> NonNegative a
NonNegative)
      ((BuiltinByteString -> BuiltinData)
-> [BuiltinByteString] -> [BuiltinData]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap BuiltinByteString -> BuiltinData
Builtins.mkB ([BuiltinByteString] -> [BuiltinData])
-> (BuiltinByteString -> [BuiltinByteString])
-> BuiltinByteString
-> [BuiltinData]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinByteString -> [BuiltinByteString]
forall a. Arbitrary a => a -> [a]
shrink)
    where
      shrinkConstr :: Integer -> [PlutusTx.BuiltinData] -> [PlutusTx.BuiltinData]
      shrinkConstr :: Integer -> [BuiltinData] -> [BuiltinData]
shrinkConstr Integer
ix [BuiltinData]
dats = do
        NonNegative Integer
ix' <- NonNegative Integer -> [NonNegative Integer]
forall a. Arbitrary a => a -> [a]
shrink (Integer -> NonNegative Integer
forall a. a -> NonNegative a
NonNegative Integer
ix)
        [BuiltinData]
dats' <- [BuiltinData] -> [[BuiltinData]]
forall a. Arbitrary a => a -> [a]
shrink [BuiltinData]
dats
        BuiltinData -> [BuiltinData]
forall a. a -> [a]
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure (BuiltinData -> [BuiltinData])
-> ([BuiltinData] -> BuiltinData) -> [BuiltinData] -> [BuiltinData]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> [BuiltinData] -> BuiltinData
Builtins.mkConstr Integer
ix' ([BuiltinData] -> [BuiltinData]) -> [BuiltinData] -> [BuiltinData]
forall a b. (a -> b) -> a -> b
$ [BuiltinData]
dats'
      shrinkMap :: [(PlutusTx.BuiltinData, PlutusTx.BuiltinData)] -> [PlutusTx.BuiltinData]
      shrinkMap :: [(BuiltinData, BuiltinData)] -> [BuiltinData]
shrinkMap [(BuiltinData, BuiltinData)]
kvs = [(BuiltinData, BuiltinData)] -> BuiltinData
Builtins.mkMap ([(BuiltinData, BuiltinData)] -> BuiltinData)
-> [[(BuiltinData, BuiltinData)]] -> [BuiltinData]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> [(BuiltinData, BuiltinData)] -> [[(BuiltinData, BuiltinData)]]
forall a. Arbitrary a => a -> [a]
shrink [(BuiltinData, BuiltinData)]
kvs
      shrinkList :: [PlutusTx.BuiltinData] -> [PlutusTx.BuiltinData]
      shrinkList :: [BuiltinData] -> [BuiltinData]
shrinkList [BuiltinData]
ell = [BuiltinData] -> BuiltinData
Builtins.mkList ([BuiltinData] -> BuiltinData) -> [[BuiltinData]] -> [BuiltinData]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> [BuiltinData] -> [[BuiltinData]]
forall a. Arbitrary a => a -> [a]
shrink [BuiltinData]
ell

-- | @since 1.0.0
instance CoArbitrary PlutusTx.BuiltinData where
  {-# INLINEABLE coarbitrary #-}
  coarbitrary :: forall b. BuiltinData -> Gen b -> Gen b
coarbitrary BuiltinData
dat =
    BuiltinData
-> (Integer -> [BuiltinData] -> Gen b -> Gen b)
-> ([(BuiltinData, BuiltinData)] -> Gen b -> Gen b)
-> ([BuiltinData] -> Gen b -> Gen b)
-> (Integer -> Gen b -> Gen b)
-> (BuiltinByteString -> Gen b -> Gen b)
-> Gen b
-> Gen b
forall r.
BuiltinData
-> (Integer -> [BuiltinData] -> r)
-> ([(BuiltinData, BuiltinData)] -> r)
-> ([BuiltinData] -> r)
-> (Integer -> r)
-> (BuiltinByteString -> r)
-> r
Builtins.matchData
      BuiltinData
dat
      (\Integer
ix [BuiltinData]
dats -> Int -> Gen b -> Gen b
forall n a. Integral n => n -> Gen a -> Gen a
variant (Int
0 :: Int) (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Gen b -> Gen b
forall b. Integer -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
ix (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BuiltinData] -> Gen b -> Gen b
forall b. [BuiltinData] -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary [BuiltinData]
dats)
      (\[(BuiltinData, BuiltinData)]
kvs -> Int -> Gen b -> Gen b
forall n a. Integral n => n -> Gen a -> Gen a
variant (Int
1 :: Int) (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(BuiltinData, BuiltinData)] -> Gen b -> Gen b
forall b. [(BuiltinData, BuiltinData)] -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary [(BuiltinData, BuiltinData)]
kvs)
      (\[BuiltinData]
ell -> Int -> Gen b -> Gen b
forall n a. Integral n => n -> Gen a -> Gen a
variant (Int
2 :: Int) (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BuiltinData] -> Gen b -> Gen b
forall b. [BuiltinData] -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary [BuiltinData]
ell)
      (\Integer
i -> Int -> Gen b -> Gen b
forall n a. Integral n => n -> Gen a -> Gen a
variant (Int
3 :: Int) (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Gen b -> Gen b
forall b. Integer -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
i)
      (\BuiltinByteString
bs -> Int -> Gen b -> Gen b
forall n a. Integral n => n -> Gen a -> Gen a
variant (Int
4 :: Int) (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinByteString -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
forall b. BuiltinByteString -> Gen b -> Gen b
coarbitrary BuiltinByteString
bs)

-- | @since 1.0.0
instance Function PlutusTx.BuiltinData where
  {-# INLINEABLE function #-}
  function :: forall b. (BuiltinData -> b) -> BuiltinData :-> b
function = (BuiltinData
 -> Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> (Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString)))
    -> BuiltinData)
-> (BuiltinData -> b)
-> BuiltinData :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap BuiltinData
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
into Either
  (Integer, [BuiltinData])
  (Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> BuiltinData
outOf
    where
      into ::
        PlutusTx.BuiltinData ->
        Either
          (Integer, [PlutusTx.BuiltinData])
          ( Either
              [(PlutusTx.BuiltinData, PlutusTx.BuiltinData)]
              ( Either
                  [PlutusTx.BuiltinData]
                  ( Either Integer PlutusTx.BuiltinByteString
                  )
              )
          )
      into :: BuiltinData
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
into BuiltinData
dat =
        BuiltinData
-> (Integer
    -> [BuiltinData]
    -> Either
         (Integer, [BuiltinData])
         (Either
            [(BuiltinData, BuiltinData)]
            (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> ([(BuiltinData, BuiltinData)]
    -> Either
         (Integer, [BuiltinData])
         (Either
            [(BuiltinData, BuiltinData)]
            (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> ([BuiltinData]
    -> Either
         (Integer, [BuiltinData])
         (Either
            [(BuiltinData, BuiltinData)]
            (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> (Integer
    -> Either
         (Integer, [BuiltinData])
         (Either
            [(BuiltinData, BuiltinData)]
            (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> (BuiltinByteString
    -> Either
         (Integer, [BuiltinData])
         (Either
            [(BuiltinData, BuiltinData)]
            (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall r.
BuiltinData
-> (Integer -> [BuiltinData] -> r)
-> ([(BuiltinData, BuiltinData)] -> r)
-> ([BuiltinData] -> r)
-> (Integer -> r)
-> (BuiltinByteString -> r)
-> r
Builtins.matchData
          BuiltinData
dat
          (\Integer
ix -> (Integer, [BuiltinData])
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall a b. a -> Either a b
Left ((Integer, [BuiltinData])
 -> Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> ([BuiltinData] -> (Integer, [BuiltinData]))
-> [BuiltinData]
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer
ix,))
          (Either
  [(BuiltinData, BuiltinData)]
  (Either [BuiltinData] (Either Integer BuiltinByteString))
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall a b. b -> Either a b
Right (Either
   [(BuiltinData, BuiltinData)]
   (Either [BuiltinData] (Either Integer BuiltinByteString))
 -> Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> ([(BuiltinData, BuiltinData)]
    -> Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> [(BuiltinData, BuiltinData)]
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(BuiltinData, BuiltinData)]
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall a b. a -> Either a b
Left)
          (Either
  [(BuiltinData, BuiltinData)]
  (Either [BuiltinData] (Either Integer BuiltinByteString))
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall a b. b -> Either a b
Right (Either
   [(BuiltinData, BuiltinData)]
   (Either [BuiltinData] (Either Integer BuiltinByteString))
 -> Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> ([BuiltinData]
    -> Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> [BuiltinData]
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either [BuiltinData] (Either Integer BuiltinByteString)
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall a b. b -> Either a b
Right (Either [BuiltinData] (Either Integer BuiltinByteString)
 -> Either
      [(BuiltinData, BuiltinData)]
      (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> ([BuiltinData]
    -> Either [BuiltinData] (Either Integer BuiltinByteString))
-> [BuiltinData]
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BuiltinData]
-> Either [BuiltinData] (Either Integer BuiltinByteString)
forall a b. a -> Either a b
Left)
          (Either
  [(BuiltinData, BuiltinData)]
  (Either [BuiltinData] (Either Integer BuiltinByteString))
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall a b. b -> Either a b
Right (Either
   [(BuiltinData, BuiltinData)]
   (Either [BuiltinData] (Either Integer BuiltinByteString))
 -> Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> (Integer
    -> Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> Integer
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either [BuiltinData] (Either Integer BuiltinByteString)
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall a b. b -> Either a b
Right (Either [BuiltinData] (Either Integer BuiltinByteString)
 -> Either
      [(BuiltinData, BuiltinData)]
      (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> (Integer
    -> Either [BuiltinData] (Either Integer BuiltinByteString))
-> Integer
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either Integer BuiltinByteString
-> Either [BuiltinData] (Either Integer BuiltinByteString)
forall a b. b -> Either a b
Right (Either Integer BuiltinByteString
 -> Either [BuiltinData] (Either Integer BuiltinByteString))
-> (Integer -> Either Integer BuiltinByteString)
-> Integer
-> Either [BuiltinData] (Either Integer BuiltinByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Either Integer BuiltinByteString
forall a b. a -> Either a b
Left)
          (Either
  [(BuiltinData, BuiltinData)]
  (Either [BuiltinData] (Either Integer BuiltinByteString))
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall a b. b -> Either a b
Right (Either
   [(BuiltinData, BuiltinData)]
   (Either [BuiltinData] (Either Integer BuiltinByteString))
 -> Either
      (Integer, [BuiltinData])
      (Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString))))
-> (BuiltinByteString
    -> Either
         [(BuiltinData, BuiltinData)]
         (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> BuiltinByteString
-> Either
     (Integer, [BuiltinData])
     (Either
        [(BuiltinData, BuiltinData)]
        (Either [BuiltinData] (Either Integer BuiltinByteString)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either [BuiltinData] (Either Integer BuiltinByteString)
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall a b. b -> Either a b
Right (Either [BuiltinData] (Either Integer BuiltinByteString)
 -> Either
      [(BuiltinData, BuiltinData)]
      (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> (BuiltinByteString
    -> Either [BuiltinData] (Either Integer BuiltinByteString))
-> BuiltinByteString
-> Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either Integer BuiltinByteString
-> Either [BuiltinData] (Either Integer BuiltinByteString)
forall a b. b -> Either a b
Right (Either Integer BuiltinByteString
 -> Either [BuiltinData] (Either Integer BuiltinByteString))
-> (BuiltinByteString -> Either Integer BuiltinByteString)
-> BuiltinByteString
-> Either [BuiltinData] (Either Integer BuiltinByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinByteString -> Either Integer BuiltinByteString
forall a b. b -> Either a b
Right)
      outOf ::
        Either
          (Integer, [PlutusTx.BuiltinData])
          ( Either
              [(PlutusTx.BuiltinData, PlutusTx.BuiltinData)]
              ( Either
                  [PlutusTx.BuiltinData]
                  ( Either Integer PlutusTx.BuiltinByteString
                  )
              )
          ) ->
        PlutusTx.BuiltinData
      outOf :: Either
  (Integer, [BuiltinData])
  (Either
     [(BuiltinData, BuiltinData)]
     (Either [BuiltinData] (Either Integer BuiltinByteString)))
-> BuiltinData
outOf = \case
        Left (Integer
ix, [BuiltinData]
dats) -> Integer -> [BuiltinData] -> BuiltinData
Builtins.mkConstr Integer
ix [BuiltinData]
dats
        Right (Left [(BuiltinData, BuiltinData)]
kvs) -> [(BuiltinData, BuiltinData)] -> BuiltinData
Builtins.mkMap [(BuiltinData, BuiltinData)]
kvs
        Right (Right (Left [BuiltinData]
ell)) -> [BuiltinData] -> BuiltinData
Builtins.mkList [BuiltinData]
ell
        Right (Right (Right (Left Integer
i))) -> Integer -> BuiltinData
Builtins.mkI Integer
i
        Right (Right (Right (Right BuiltinByteString
bs))) -> BuiltinByteString -> BuiltinData
Builtins.mkB BuiltinByteString
bs

{- | This generates well-defined maps: specifically, there are no duplicate
keys. To ensure that this is preserved, we do not shrink keys: we only drop
whole entries, or shrink values associated with keys.

In order to make this instance even moderately efficient, we require an 'Ord'
constraint on keys. In practice, this isn't a significant limitation, as
basically all Plutus types have such an instance.

@since 1.0.0
-}
instance (Arbitrary k, Ord k) => Arbitrary1 (AssocMap.Map k) where
  {-# INLINEABLE liftArbitrary #-}
  liftArbitrary :: forall a. Gen a -> Gen (Map k a)
liftArbitrary Gen a
genVal =
    [(k, a)] -> Map k a
forall k v. [(k, v)] -> Map k v
AssocMap.unsafeFromList ([(k, a)] -> Map k a) -> Gen [(k, a)] -> Gen (Map k a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> do
      -- First, generate a Set of keys to ensure no duplication
      [k]
keyList <- Set k -> [k]
forall a. Set a -> [a]
Set.toList (Set k -> [k]) -> Gen (Set k) -> Gen [k]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Set k)
forall a. Arbitrary a => Gen a
arbitrary
      -- Then generate a value for each
      (k -> Gen (k, a)) -> [k] -> Gen [(k, a)]
forall (t :: Type -> Type) (f :: Type -> Type) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: Type -> Type) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (\k
key -> (k
key,) (a -> (k, a)) -> Gen a -> Gen (k, a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genVal) [k]
keyList
  {-# INLINEABLE liftShrink #-}
  liftShrink :: forall a. (a -> [a]) -> Map k a -> [Map k a]
liftShrink a -> [a]
shrinkVal Map k a
aMap =
    [(k, a)] -> Map k a
forall k v. [(k, v)] -> Map k v
AssocMap.unsafeFromList ([(k, a)] -> Map k a) -> [[(k, a)]] -> [Map k a]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> do
      let asList :: [(k, a)]
asList = Map k a -> [(k, a)]
forall k v. Map k v -> [(k, v)]
AssocMap.toList Map k a
aMap
      ((k, a) -> [(k, a)]) -> [(k, a)] -> [[(k, a)]]
forall a. (a -> [a]) -> [a] -> [[a]]
forall (f :: Type -> Type) a.
Arbitrary1 f =>
(a -> [a]) -> f a -> [f a]
liftShrink (\(k
key, a
val) -> (k
key,) (a -> (k, a)) -> [a] -> [(k, a)]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> [a]
shrinkVal a
val) [(k, a)]
asList

-- | @since 1.0.0
instance (Arbitrary k, Arbitrary v, Ord k) => Arbitrary (AssocMap.Map k v) where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen (Map k v)
arbitrary = Gen v -> Gen (Map k v)
forall a. Gen a -> Gen (Map k a)
forall (f :: Type -> Type) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen v
forall a. Arbitrary a => Gen a
arbitrary
  {-# INLINEABLE shrink #-}
  shrink :: Map k v -> [Map k v]
shrink = (v -> [v]) -> Map k v -> [Map k v]
forall a. (a -> [a]) -> Map k a -> [Map k a]
forall (f :: Type -> Type) a.
Arbitrary1 f =>
(a -> [a]) -> f a -> [f a]
liftShrink v -> [v]
forall a. Arbitrary a => a -> [a]
shrink

-- | @since 1.0.0
instance (CoArbitrary k, CoArbitrary v) => CoArbitrary (AssocMap.Map k v) where
  {-# INLINEABLE coarbitrary #-}
  coarbitrary :: forall b. Map k v -> Gen b -> Gen b
coarbitrary = [(k, v)] -> Gen b -> Gen b
forall b. [(k, v)] -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary ([(k, v)] -> Gen b -> Gen b)
-> (Map k v -> [(k, v)]) -> Map k v -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map k v -> [(k, v)]
forall k v. Map k v -> [(k, v)]
AssocMap.toList

-- | @since 1.0.0
instance (Function k, Function v) => Function (AssocMap.Map k v) where
  {-# INLINEABLE function #-}
  function :: forall b. (Map k v -> b) -> Map k v :-> b
function = (Map k v -> [(k, v)])
-> ([(k, v)] -> Map k v) -> (Map k v -> b) -> Map k v :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap Map k v -> [(k, v)]
forall k v. Map k v -> [(k, v)]
AssocMap.toList [(k, v)] -> Map k v
forall k v. [(k, v)] -> Map k v
AssocMap.unsafeFromList

-- | @since WIP
newtype UnsortedAssocMap k v = UnsortedAssocMap (AssocMap.Map k v)
  deriving newtype (Int -> UnsortedAssocMap k v -> ShowS
[UnsortedAssocMap k v] -> ShowS
UnsortedAssocMap k v -> String
(Int -> UnsortedAssocMap k v -> ShowS)
-> (UnsortedAssocMap k v -> String)
-> ([UnsortedAssocMap k v] -> ShowS)
-> Show (UnsortedAssocMap k v)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k v.
(Show k, Show v) =>
Int -> UnsortedAssocMap k v -> ShowS
forall k v. (Show k, Show v) => [UnsortedAssocMap k v] -> ShowS
forall k v. (Show k, Show v) => UnsortedAssocMap k v -> String
$cshowsPrec :: forall k v.
(Show k, Show v) =>
Int -> UnsortedAssocMap k v -> ShowS
showsPrec :: Int -> UnsortedAssocMap k v -> ShowS
$cshow :: forall k v. (Show k, Show v) => UnsortedAssocMap k v -> String
show :: UnsortedAssocMap k v -> String
$cshowList :: forall k v. (Show k, Show v) => [UnsortedAssocMap k v] -> ShowS
showList :: [UnsortedAssocMap k v] -> ShowS
Show, UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
(UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool)
-> (UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool)
-> Eq (UnsortedAssocMap k v)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k v.
(Ord k, Eq v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
$c== :: forall k v.
(Ord k, Eq v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
== :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
$c/= :: forall k v.
(Ord k, Eq v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
/= :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
Eq, Eq (UnsortedAssocMap k v)
Eq (UnsortedAssocMap k v) =>
(UnsortedAssocMap k v -> UnsortedAssocMap k v -> Ordering)
-> (UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool)
-> (UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool)
-> (UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool)
-> (UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool)
-> (UnsortedAssocMap k v
    -> UnsortedAssocMap k v -> UnsortedAssocMap k v)
-> (UnsortedAssocMap k v
    -> UnsortedAssocMap k v -> UnsortedAssocMap k v)
-> Ord (UnsortedAssocMap k v)
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Ordering
UnsortedAssocMap k v
-> UnsortedAssocMap k v -> UnsortedAssocMap k v
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall k v. (Ord k, Ord v) => Eq (UnsortedAssocMap k v)
forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Ordering
forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v
-> UnsortedAssocMap k v -> UnsortedAssocMap k v
$ccompare :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Ordering
compare :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Ordering
$c< :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
< :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
$c<= :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
<= :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
$c> :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
> :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
$c>= :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
>= :: UnsortedAssocMap k v -> UnsortedAssocMap k v -> Bool
$cmax :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v
-> UnsortedAssocMap k v -> UnsortedAssocMap k v
max :: UnsortedAssocMap k v
-> UnsortedAssocMap k v -> UnsortedAssocMap k v
$cmin :: forall k v.
(Ord k, Ord v) =>
UnsortedAssocMap k v
-> UnsortedAssocMap k v -> UnsortedAssocMap k v
min :: UnsortedAssocMap k v
-> UnsortedAssocMap k v -> UnsortedAssocMap k v
Ord, (forall ann. UnsortedAssocMap k v -> Doc ann)
-> (forall ann. [UnsortedAssocMap k v] -> Doc ann)
-> Pretty (UnsortedAssocMap k v)
forall ann. [UnsortedAssocMap k v] -> Doc ann
forall ann. UnsortedAssocMap k v -> Doc ann
forall a.
(forall ann. a -> Doc ann)
-> (forall ann. [a] -> Doc ann) -> Pretty a
forall k v ann.
(Pretty k, Pretty v) =>
[UnsortedAssocMap k v] -> Doc ann
forall k v ann.
(Pretty k, Pretty v) =>
UnsortedAssocMap k v -> Doc ann
$cpretty :: forall k v ann.
(Pretty k, Pretty v) =>
UnsortedAssocMap k v -> Doc ann
pretty :: forall ann. UnsortedAssocMap k v -> Doc ann
$cprettyList :: forall k v ann.
(Pretty k, Pretty v) =>
[UnsortedAssocMap k v] -> Doc ann
prettyList :: forall ann. [UnsortedAssocMap k v] -> Doc ann
Pretty)

-- | @since WIP
instance (Arbitrary k, Ord k) => Arbitrary1 (UnsortedAssocMap k) where
  {-# INLINEABLE liftArbitrary #-}
  liftArbitrary :: forall a. Gen a -> Gen (UnsortedAssocMap k a)
liftArbitrary Gen a
genVal =
    Map k a -> UnsortedAssocMap k a
forall k v. Map k v -> UnsortedAssocMap k v
UnsortedAssocMap (Map k a -> UnsortedAssocMap k a)
-> ([(k, a)] -> Map k a) -> [(k, a)] -> UnsortedAssocMap k a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(k, a)] -> Map k a
forall k v. [(k, v)] -> Map k v
AssocMap.unsafeFromList ([(k, a)] -> UnsortedAssocMap k a)
-> Gen [(k, a)] -> Gen (UnsortedAssocMap k a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> do
      [k]
keyList <- Set k -> [k]
forall a. Set a -> [a]
Set.toList (Set k -> [k]) -> Gen (Set k) -> Gen [k]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Set k)
forall a. Arbitrary a => Gen a
arbitrary
      [k]
unsortedKeyList <- [k] -> Gen [k]
forall a. [a] -> Gen [a]
shuffle [k]
keyList
      (k -> Gen (k, a)) -> [k] -> Gen [(k, a)]
forall (t :: Type -> Type) (f :: Type -> Type) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: Type -> Type) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (\k
key -> (k
key,) (a -> (k, a)) -> Gen a -> Gen (k, a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
genVal) [k]
unsortedKeyList

  {-# INLINEABLE liftShrink #-}
  liftShrink :: forall a.
(a -> [a]) -> UnsortedAssocMap k a -> [UnsortedAssocMap k a]
liftShrink a -> [a]
shrinkVal (UnsortedAssocMap Map k a
aMap) =
    Map k a -> UnsortedAssocMap k a
forall k v. Map k v -> UnsortedAssocMap k v
UnsortedAssocMap (Map k a -> UnsortedAssocMap k a)
-> ([(k, a)] -> Map k a) -> [(k, a)] -> UnsortedAssocMap k a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(k, a)] -> Map k a
forall k v. [(k, v)] -> Map k v
AssocMap.unsafeFromList ([(k, a)] -> UnsortedAssocMap k a)
-> [[(k, a)]] -> [UnsortedAssocMap k a]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> do
      let asList :: [(k, a)]
asList = Map k a -> [(k, a)]
forall k v. Map k v -> [(k, v)]
AssocMap.toList Map k a
aMap
      ((k, a) -> [(k, a)]) -> [(k, a)] -> [[(k, a)]]
forall a. (a -> [a]) -> [a] -> [[a]]
forall (f :: Type -> Type) a.
Arbitrary1 f =>
(a -> [a]) -> f a -> [f a]
liftShrink (\(k
key, a
val) -> (k
key,) (a -> (k, a)) -> [a] -> [(k, a)]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> [a]
shrinkVal a
val) [(k, a)]
asList

-- | @since WIP
instance (Arbitrary k, Arbitrary v, Ord k) => Arbitrary (UnsortedAssocMap k v) where
  {-# INLINEABLE arbitrary #-}
  arbitrary :: Gen (UnsortedAssocMap k v)
arbitrary = Gen v -> Gen (UnsortedAssocMap k v)
forall a. Gen a -> Gen (UnsortedAssocMap k a)
forall (f :: Type -> Type) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen v
forall a. Arbitrary a => Gen a
arbitrary

  {-# INLINEABLE shrink #-}
  shrink :: UnsortedAssocMap k v -> [UnsortedAssocMap k v]
shrink = (v -> [v]) -> UnsortedAssocMap k v -> [UnsortedAssocMap k v]
forall a.
(a -> [a]) -> UnsortedAssocMap k a -> [UnsortedAssocMap k a]
forall (f :: Type -> Type) a.
Arbitrary1 f =>
(a -> [a]) -> f a -> [f a]
liftShrink v -> [v]
forall a. Arbitrary a => a -> [a]
shrink

-- | @since WIP
instance (CoArbitrary k, CoArbitrary v) => CoArbitrary (UnsortedAssocMap k v) where
  {-# INLINEABLE coarbitrary #-}
  coarbitrary :: forall b. UnsortedAssocMap k v -> Gen b -> Gen b
coarbitrary (UnsortedAssocMap Map k v
aMap) = Map k v -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
forall b. Map k v -> Gen b -> Gen b
coarbitrary Map k v
aMap

-- | @since WIP
instance (Function k, Function v) => Function (UnsortedAssocMap k v) where
  {-# INLINEABLE function #-}
  function :: forall b. (UnsortedAssocMap k v -> b) -> UnsortedAssocMap k v :-> b
function = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap @(AssocMap.Map k v) UnsortedAssocMap k v -> Map k v
forall a b. Coercible a b => a -> b
coerce Map k v -> UnsortedAssocMap k v
forall a b. Coercible a b => a -> b
coerce

-- | @since WIP
getUnsortedAssocMap :: UnsortedAssocMap k v -> AssocMap.Map k v
getUnsortedAssocMap :: forall k v. UnsortedAssocMap k v -> Map k v
getUnsortedAssocMap = UnsortedAssocMap k v -> Map k v
forall a b. Coercible a b => a -> b
coerce