packages feed

aihc-parser-1.0.0.2: test/Test/Properties/Arb/Utils.hs

module Test.Properties.Arb.Utils
  ( optional,
    smallList0,
    smallList1,
    smallList2,
    requiredExtensions,
  )
where

import Aihc.Parser.Syntax
import Control.Monad (replicateM)
import Test.QuickCheck

-- | Optionally generate a value, or Nothing.
optional :: Gen a -> Gen (Maybe a)
optional gen = do
  n <- getSize
  if n <= 0 then pure Nothing else oneof [pure Nothing, Just <$> gen]

-- | Generate a list of 0 to 3 elements.
smallList0 :: Gen a -> Gen [a]
smallList0 gen = do
  limit <- getSize
  n <- chooseInt (0, min 3 (max 0 limit))
  replicateM n (scale (`div` n) gen)

-- | Generate a list of 1 to 3 elements.
smallList1 :: Gen a -> Gen [a]
smallList1 gen = do
  limit <- getSize
  n <- chooseInt (1, min 3 (max 1 limit))
  replicateM n (scale (`div` n) gen)

-- | Generate a list of 2 to 3 elements.
smallList2 :: Gen a -> Gen [a]
smallList2 gen = do
  limit <- getSize
  n <- chooseInt (2, min 3 (max 2 limit))
  replicateM n (scale (`div` n) gen)

requiredExtensions :: [Extension]
requiredExtensions = effectiveExtensions GHC2024Edition moduleExtensionSettings
  where
    moduleExtensionSettings :: [ExtensionSetting]
    moduleExtensionSettings =
      map
        EnableExtension
        [ Arrows,
          BlockArguments,
          CApiFFI,
          ExplicitNamespaces,
          ImplicitParams,
          InterruptibleFFI,
          JavaScriptFFI,
          LambdaCase,
          LinearTypes,
          MagicHash,
          MultiWayIf,
          OverloadedLabels,
          OverloadedRecordDot,
          ParallelListComp,
          PatternSynonyms,
          QualifiedDo,
          QuasiQuotes,
          RecursiveDo,
          RequiredTypeArguments,
          TemplateHaskell,
          TransformListComp,
          TupleSections,
          TypeAbstractions,
          TypeApplications,
          UnboxedSums,
          UnboxedTuples,
          UnicodeSyntax,
          ViewPatterns
        ]