{-# OPTIONS_GHC -fno-warn-orphans #-}

module Cursor.Map.KeyValue.Gen
  ( genKeyValueCursorBy,
    genKeyValueCursorByDependent,
  )
where

import Cursor.Map.KeyValue
import Data.GenValidity
import Test.QuickCheck

instance
  (GenValid kc, GenValid vc, GenValid k, GenValid v) =>
  GenValid (KeyValueCursor kc vc k v)
  where
  genValid :: Gen (KeyValueCursor kc vc k v)
genValid = Gen kc
-> Gen vc -> Gen k -> Gen v -> Gen (KeyValueCursor kc vc k v)
forall kc vc k v.
Gen kc
-> Gen vc -> Gen k -> Gen v -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorBy Gen kc
forall a. GenValid a => Gen a
genValid Gen vc
forall a. GenValid a => Gen a
genValid Gen k
forall a. GenValid a => Gen a
genValid Gen v
forall a. GenValid a => Gen a
genValid
  shrinkValid :: KeyValueCursor kc vc k v -> [KeyValueCursor kc vc k v]
shrinkValid = KeyValueCursor kc vc k v -> [KeyValueCursor kc vc k v]
forall a.
(Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurallyWithoutExtraFiltering

instance GenValid KeyValueToggle

genKeyValueCursorBy :: Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorBy :: Gen kc
-> Gen vc -> Gen k -> Gen v -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorBy Gen kc
genKC Gen vc
genVC Gen k
genK Gen v
genV =
  [Gen (KeyValueCursor kc vc k v)] -> Gen (KeyValueCursor kc vc k v)
forall a. [Gen a] -> Gen a
oneof [kc -> v -> KeyValueCursor kc vc k v
forall kc vc k v. kc -> v -> KeyValueCursor kc vc k v
KeyValueCursorKey (kc -> v -> KeyValueCursor kc vc k v)
-> Gen kc -> Gen (v -> KeyValueCursor kc vc k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen kc
genKC Gen (v -> KeyValueCursor kc vc k v)
-> Gen v -> Gen (KeyValueCursor kc vc k v)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen v
genV, k -> vc -> KeyValueCursor kc vc k v
forall kc vc k v. k -> vc -> KeyValueCursor kc vc k v
KeyValueCursorValue (k -> vc -> KeyValueCursor kc vc k v)
-> Gen k -> Gen (vc -> KeyValueCursor kc vc k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen k
genK Gen (vc -> KeyValueCursor kc vc k v)
-> Gen vc -> Gen (KeyValueCursor kc vc k v)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen vc
genVC]

genKeyValueCursorByDependent :: Gen (kc, v) -> Gen (k, vc) -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorByDependent :: Gen (kc, v) -> Gen (k, vc) -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorByDependent Gen (kc, v)
genKVCK Gen (k, vc)
genKVCV =
  [Gen (KeyValueCursor kc vc k v)] -> Gen (KeyValueCursor kc vc k v)
forall a. [Gen a] -> Gen a
oneof [(kc -> v -> KeyValueCursor kc vc k v)
-> (kc, v) -> KeyValueCursor kc vc k v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry kc -> v -> KeyValueCursor kc vc k v
forall kc vc k v. kc -> v -> KeyValueCursor kc vc k v
KeyValueCursorKey ((kc, v) -> KeyValueCursor kc vc k v)
-> Gen (kc, v) -> Gen (KeyValueCursor kc vc k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (kc, v)
genKVCK, (k -> vc -> KeyValueCursor kc vc k v)
-> (k, vc) -> KeyValueCursor kc vc k v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> vc -> KeyValueCursor kc vc k v
forall kc vc k v. k -> vc -> KeyValueCursor kc vc k v
KeyValueCursorValue ((k, vc) -> KeyValueCursor kc vc k v)
-> Gen (k, vc) -> Gen (KeyValueCursor kc vc k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (k, vc)
genKVCV]