packages feed

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'