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

module Cursor.TextField.Gen where

import Cursor.List.NonEmpty
import Cursor.List.NonEmpty.Gen ()
import Cursor.Text.Gen
import Cursor.TextField
import Data.GenValidity
import Data.GenValidity.Text
import Test.QuickCheck

instance GenValid TextFieldCursor where
  genValid :: Gen TextFieldCursor
genValid =
    (Int -> Gen TextFieldCursor) -> Gen TextFieldCursor
forall a. (Int -> Gen a) -> Gen a
sized ((Int -> Gen TextFieldCursor) -> Gen TextFieldCursor)
-> (Int -> Gen TextFieldCursor) -> Gen TextFieldCursor
forall a b. (a -> b) -> a -> b
$ \Int
n -> do
      (Int
a, Int
b, Int
c) <- Int -> Gen (Int, Int, Int)
genSplit3 Int
n
      [Text]
prevs <- Int -> Gen [Text] -> Gen [Text]
forall a. Int -> Gen a -> Gen a
resize Int
a (Gen [Text] -> Gen [Text]) -> Gen [Text] -> Gen [Text]
forall a b. (a -> b) -> a -> b
$ Gen Text -> Gen [Text]
forall a. Gen a -> Gen [a]
genListOf (Gen Text -> Gen [Text]) -> Gen Text -> Gen [Text]
forall a b. (a -> b) -> a -> b
$ Gen Char -> Gen Text
genTextBy Gen Char
genTextCursorChar
      [Text]
nexts <- Int -> Gen [Text] -> Gen [Text]
forall a. Int -> Gen a -> Gen a
resize Int
b (Gen [Text] -> Gen [Text]) -> Gen [Text] -> Gen [Text]
forall a b. (a -> b) -> a -> b
$ Gen Text -> Gen [Text]
forall a. Gen a -> Gen [a]
genListOf (Gen Text -> Gen [Text]) -> Gen Text -> Gen [Text]
forall a b. (a -> b) -> a -> b
$ Gen Char -> Gen Text
genTextBy Gen Char
genTextCursorChar
      TextCursor
cur <- Int -> Gen TextCursor -> Gen TextCursor
forall a. Int -> Gen a -> Gen a
resize Int
c (Gen TextCursor -> Gen TextCursor)
-> Gen TextCursor -> Gen TextCursor
forall a b. (a -> b) -> a -> b
$ Gen Char -> Gen TextCursor
textCursorWithGen Gen Char
genTextCursorChar
      let nec :: NonEmptyCursor TextCursor Text
nec = [Text] -> TextCursor -> [Text] -> NonEmptyCursor TextCursor Text
forall a b. [b] -> a -> [b] -> NonEmptyCursor a b
NonEmptyCursor [Text]
prevs TextCursor
cur [Text]
nexts
      TextFieldCursor -> Gen TextFieldCursor
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TextFieldCursor -> Gen TextFieldCursor)
-> TextFieldCursor -> Gen TextFieldCursor
forall a b. (a -> b) -> a -> b
$ NonEmptyCursor TextCursor Text -> TextFieldCursor
TextFieldCursor NonEmptyCursor TextCursor Text
nec
  shrinkValid :: TextFieldCursor -> [TextFieldCursor]
shrinkValid = TextFieldCursor -> [TextFieldCursor]
forall a.
(Validity a, Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurally