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

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

import Data.GenValidity

import Test.QuickCheck

import Cursor.Map.KeyValue

instance (GenUnchecked kc, GenUnchecked vc, GenUnchecked k, GenUnchecked v) =>
         GenUnchecked (KeyValueCursor kc vc k v) where
  genUnchecked = genKeyValueCursorBy genUnchecked genUnchecked genUnchecked genUnchecked

instance (GenValid kc, GenValid vc, GenValid k, GenValid v) =>
         GenValid (KeyValueCursor kc vc k v) where
  genValid = genKeyValueCursorBy genValid genValid genValid genValid
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenUnchecked KeyValueToggle

instance GenValid KeyValueToggle

genKeyValueCursorBy :: Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (KeyValueCursor kc vc k v)
genKeyValueCursorBy genKC genVC genK genV =
  oneof [KeyValueCursorKey <$> genKC <*> genV, KeyValueCursorValue <$> genK <*> genVC]