cursor-gen-0.4.0.0: src/Cursor/Text/Gen.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Cursor.Text.Gen
( genSafeChar,
genTextCursorChar,
textCursorSentenceGen,
textCursorWithGen,
textCursorWithIndex0,
shrinkSentence,
)
where
import Cursor.List
import Cursor.List.Gen
import Cursor.Text
import Cursor.Types
import Data.Char (isSpace)
import Data.GenValidity
import Data.GenValidity.Text ()
import Test.QuickCheck
instance GenValid TextCursor where
genValid = TextCursor <$> listCursorWithGen genTextCursorChar
shrinkValid = shrinkValidStructurally
genSafeChar :: Gen Char
genSafeChar = choose (minBound, maxBound) `suchThat` isSafeChar
genSpaceChar :: Gen Char
genSpaceChar = elements [' ', '\t', '\v']
genTextCursorChar :: Gen Char
genTextCursorChar = genSafeChar `suchThat` (/= '\n')
textCursorWithGen :: Gen Char -> Gen TextCursor
textCursorWithGen gen = TextCursor <$> listCursorWithGen gen
textCursorWithIndex0 :: Gen Char -> Gen TextCursor
textCursorWithIndex0 gen = TextCursor <$> listCursorWithIndex0 gen
textCursorSentenceGen :: Gen TextCursor
textCursorSentenceGen = textCursorWithGen sentenceGen
where
sentenceGen :: Gen Char
sentenceGen = frequency [(1, genSpaceChar), (5, genSafeChar)]
shrinkSentence :: TextCursor -> [TextCursor]
shrinkSentence tc@(TextCursor (ListCursor before after)) =
filter (/= tc) [TextCursor (ListCursor (map f before) (map f after))]
where
f :: Char -> Char
f x
| isSpace x = ' '
| otherwise = 'a'