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

module Cursor.Map.Gen
  ( genMapCursorBy,
    genMapCursorByDependent,
  )
where

import Cursor.List.NonEmpty.Gen
import Cursor.Map
import Cursor.Map.KeyValue.Gen
import Data.GenValidity
import Data.GenValidity.Containers ()
import Test.QuickCheck

instance (GenValid kc, GenValid vc, GenValid k, GenValid v) => GenValid (MapCursor kc vc k v) where
  genValid :: Gen (MapCursor kc vc k v)
genValid = Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (MapCursor kc vc k v)
forall kc vc k v.
Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (MapCursor kc vc k v)
genMapCursorBy 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 :: MapCursor kc vc k v -> [MapCursor kc vc k v]
shrinkValid = MapCursor kc vc k v -> [MapCursor kc vc k v]
forall a.
(Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurallyWithoutExtraFiltering

genMapCursorBy :: Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (MapCursor kc vc k v)
genMapCursorBy :: Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (MapCursor kc vc k v)
genMapCursorBy Gen kc
genKC Gen vc
genVC Gen k
genK Gen v
genV =
  NonEmptyCursor (KeyValueCursor kc vc k v) (k, v)
-> MapCursor kc vc k v
forall kc vc k v.
NonEmptyCursor (KeyValueCursor kc vc k v) (k, v)
-> MapCursor kc vc k v
MapCursor
    (NonEmptyCursor (KeyValueCursor kc vc k v) (k, v)
 -> MapCursor kc vc k v)
-> Gen (NonEmptyCursor (KeyValueCursor kc vc k v) (k, v))
-> Gen (MapCursor kc vc k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (KeyValueCursor kc vc k v)
-> Gen (k, v)
-> Gen (NonEmptyCursor (KeyValueCursor kc vc k v) (k, v))
forall a b. Gen a -> Gen b -> Gen (NonEmptyCursor a b)
genNonEmptyCursorBy (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
genKC Gen vc
genVC Gen k
genK Gen v
genV) ((,) (k -> v -> (k, v)) -> Gen k -> Gen (v -> (k, v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen k
genK Gen (v -> (k, v)) -> Gen v -> Gen (k, v)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen v
genV)

genMapCursorByDependent :: Gen (kc, v) -> Gen (k, vc) -> Gen (k, v) -> Gen (MapCursor kc vc k v)
genMapCursorByDependent :: Gen (kc, v)
-> Gen (k, vc) -> Gen (k, v) -> Gen (MapCursor kc vc k v)
genMapCursorByDependent Gen (kc, v)
genKVCK Gen (k, vc)
genKVCV Gen (k, v)
genKV =
  NonEmptyCursor (KeyValueCursor kc vc k v) (k, v)
-> MapCursor kc vc k v
forall kc vc k v.
NonEmptyCursor (KeyValueCursor kc vc k v) (k, v)
-> MapCursor kc vc k v
MapCursor (NonEmptyCursor (KeyValueCursor kc vc k v) (k, v)
 -> MapCursor kc vc k v)
-> Gen (NonEmptyCursor (KeyValueCursor kc vc k v) (k, v))
-> Gen (MapCursor kc vc k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (KeyValueCursor kc vc k v)
-> Gen (k, v)
-> Gen (NonEmptyCursor (KeyValueCursor kc vc k v) (k, v))
forall a b. Gen a -> Gen b -> Gen (NonEmptyCursor a b)
genNonEmptyCursorBy (Gen (kc, v) -> Gen (k, vc) -> Gen (KeyValueCursor kc vc k v)
forall kc v k vc.
Gen (kc, v) -> Gen (k, vc) -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorByDependent Gen (kc, v)
genKVCK Gen (k, vc)
genKVCV) Gen (k, v)
genKV