{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE DerivingStrategies #-} module Arbitrary.InvalidBrainfuckText (InvalidBrainfuckText(..)) where import Data.Text (Text) import Test.QuickCheck.Gen (Gen) import Test.QuickCheck.Arbitrary (Arbitrary (arbitrary)) import qualified Data.Text as Text import qualified Test.QuickCheck.Gen as Gen import qualified Arbitrary.ValidBrainfuckText as ValidBrainfuckText newtype InvalidBrainfuckText = InvalidBrainfuckText { get :: Text } deriving stock Show instance Arbitrary InvalidBrainfuckText where arbitrary :: Gen InvalidBrainfuckText arbitrary = do validText <- ValidBrainfuckText.get <$> arbitrary index <- Gen.choose (0, Text.length validText) badBrace <- Gen.oneof $ map pure "[]" let (prefix, suffix) = Text.splitAt index validText pure . InvalidBrainfuckText $ Text.concat [prefix, Text.singleton badBrace, suffix]