{-# LANGUAGE DeriveDataTypeable #-}
-- | Type modifiers for writing properties that quantify over commonly used subsets of standard types.
-- |
-- | Currently there are only a few modifiers, more will be added.
module Data.Modifiers(
-- ** List modifiers
NonEmpty(..),
mkNonEmpty,
-- ** Numeric modifiers
Nat(..),
NonZero(..),
-- ** Character and string modifiers
Unicode(..),
unicodes,
Printable(..),
printables
) where
import Data.Typeable
-- | A type of natural numbers such that @ nat a >= 0 @.
newtype Nat a = Nat {nat :: a}
deriving (Typeable, Show, Eq, Ord)
-- | A type of non-zero integers such that @ nonZero a /= 0 @.
newtype NonZero a = NonZero {nonZero :: a}
deriving (Typeable, Show, Eq, Ord)
-- | A type of non empty lists such that @ nonEmpty xs /= [] @.
newtype NonEmpty a = NonEmpty {nonEmpty :: [a]}
deriving (Typeable, Show)
mkNonEmpty :: a -> [a] -> NonEmpty a
mkNonEmpty x xs = NonEmpty $ x:xs
-- | Any unicode character. Should contain all values of the Char type.
newtype Unicode = Unicode {unicode :: Char}
deriving (Typeable, Show, Eq, Ord)
-- | Access function for unicode strings.
unicodes :: [Unicode] -> String
unicodes = map unicode
-- | Printable ASCII characters.
newtype Printable = Printable {printable :: Char}
deriving (Typeable, Show)
-- | Access function for printable ASCII strings
printables :: [Printable] -> String
printables = map printable