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

module Cursor.Map.Gen
  ( genMapCursorBy
  ) where

import Data.GenValidity
import Data.GenValidity.Containers ()

import Test.QuickCheck

import Cursor.Map

import Cursor.List.NonEmpty.Gen
import Cursor.Map.KeyValue.Gen

instance (GenUnchecked kc, GenUnchecked vc, GenUnchecked k, GenUnchecked v) =>
         GenUnchecked (MapCursor kc vc k v) where
  genUnchecked = genMapCursorBy genUnchecked genUnchecked genUnchecked genUnchecked

instance (GenValid kc, GenValid vc, GenValid k, GenValid v) => GenValid (MapCursor kc vc k v) where
  genValid = genMapCursorBy genValid genValid genValid genValid
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

genMapCursorBy :: Gen kc -> Gen vc -> Gen k -> Gen v -> Gen (MapCursor kc vc k v)
genMapCursorBy genKC genVC genK genV =
  MapCursor <$>
  genNonEmptyCursorBy (genKeyValueCursorBy genKC genVC genK genV) ((,) <$> genK <*> genV)