packages feed

quick-process-0.0.1: src/System/Process/Quick/Predicate/LowerCase.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
module System.Process.Quick.Predicate.LowerCase where

import Refined
import System.Process.Quick.Prelude


data LowerCase

instance Predicate LowerCase String where
  validate p value =
    if all isLower value
      then Nothing
      else throwRefineOtherException (typeRep p) "Not all chars are lower-case"

type LowerCaseString = Refined LowerCase String


leftError :: Show a => Text -> Either a b -> b
leftError m = \case
  Right v -> v
  Left e -> error $ m <> "; due: " <> show e

instance {-# OVERLAPPING #-}
  (Arbitrary a, Typeable a, Predicate (SizeEqualTo n) [a], KnownNat n) =>
  Arbitrary (Refined (SizeEqualTo n) [a]) where
  arbitrary =
    leftError "Dead code" . refine <$>
    replicateM (fromIntegral $ natVal (Proxy @n)) arbitrary

  shrink = rights . map refine . shrink . unrefine