digit-0.1.0: src/Data/Digit/Digit1_9.hs
{-# LANGUAGE NoImplicitPrelude #-}
-- | A data type with nine nullary constructors [1-9] and combinators.
module Data.Digit.Digit1_9
(
-- * Data type
Digit1_9
-- * Destructors
, foldDigit1_9
-- * Prisms
, digit1_9
, digitC1_9
, digit1_9digit
) where
import Prelude(Show(..), Read(..), Eq, Enum(..), Maybe(..), Bounded, Ord, Int, Char, (.))
import Data.Digit.Digit(Digit, foldDigit, digit, digitC)
import Data.Digit.D1
import Data.Digit.D2
import Data.Digit.D3
import Data.Digit.D4
import Data.Digit.D5
import Data.Digit.D6
import Data.Digit.D7
import Data.Digit.D8
import Data.Digit.D9
import Control.Lens
-- $setup
-- >>> import Prelude
-- >>> import Data.Digit.D0
-- | A data type with nine nullary constructors.
data Digit1_9 =
D1
| D2
| D3
| D4
| D5
| D6
| D7
| D8
| D9
deriving (Eq, Ord, Bounded)
-- | Catamorphism for @Digit1_9@.
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d1 == x1
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d2 == x2
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d3 == x3
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d4 == x4
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d5 == x5
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d6 == x6
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d7 == x7
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d8 == x8
--
-- prop> foldDigit1_9 x1 x2 x3 x4 x5 x6 x7 x8 x9 d9 == x9
foldDigit1_9 ::
a -- ^ One.
-> a -- ^ Two.
-> a -- ^ Three.
-> a -- ^ Four.
-> a -- ^ Five.
-> a -- ^ Six.
-> a -- ^ Seven.
-> a -- ^ Eight.
-> a -- ^ Nine.
-> Digit1_9 -- ^ The digit to fold.
-> a
foldDigit1_9 x1 _ _ _ _ _ _ _ _ D1 =
x1
foldDigit1_9 _ x2 _ _ _ _ _ _ _ D2 =
x2
foldDigit1_9 _ _ x3 _ _ _ _ _ _ D3 =
x3
foldDigit1_9 _ _ _ x4 _ _ _ _ _ D4 =
x4
foldDigit1_9 _ _ _ _ x5 _ _ _ _ D5 =
x5
foldDigit1_9 _ _ _ _ _ x6 _ _ _ D6 =
x6
foldDigit1_9 _ _ _ _ _ _ x7 _ _ D7 =
x7
foldDigit1_9 _ _ _ _ _ _ _ x8 _ D8 =
x8
foldDigit1_9 _ _ _ _ _ _ _ _ x9 D9 =
x9
instance D1 Digit1_9 where
d1 =
D1
instance D2 Digit1_9 where
d2 =
D2
instance D3 Digit1_9 where
d3 =
D3
instance D4 Digit1_9 where
d4 =
D4
instance D5 Digit1_9 where
d5 =
D5
instance D6 Digit1_9 where
d6 =
D6
instance D7 Digit1_9 where
d7 =
D7
instance D8 Digit1_9 where
d8 =
D8
instance D9 Digit1_9 where
d9 =
D9
-- | A prism for using @Int@ as @Digit1_9@.
--
-- >>> 5 ^? digit1_9
-- Just 5
--
-- >>> 0 ^? digit1_9
-- Nothing
--
-- >>> 9 ^? digit1_9
-- Just 9
--
-- >>> 10 ^? digit1_9
-- Nothing
--
-- >>> (-5) ^? digit1_9
-- Nothing
digit1_9 ::
Prism' Int Digit1_9
digit1_9 =
digit . digit1_9digit
-- | A prism for using @Char@ as @Digit1_9@.
--
-- >>> '5' ^? digitC1_9
-- Just 5
--
-- >>> '0' ^? digitC1_9
-- Nothing
--
-- >>> '9' ^? digitC1_9
-- Just 9
--
-- >>> 'x' ^? digitC1_9
-- Nothing
--
-- >>> '*' ^? digitC1_9
-- Nothing
digitC1_9 ::
Prism' Char Digit1_9
digitC1_9 =
digitC . digit1_9digit
-- | A prism for using @Digit@ as @Digit1_9@.
--
-- >>> d5 ^? digit1_9digit
-- Just 5
--
-- >>> d0 ^? digit1_9digit
-- Nothing
--
-- >>> d9 ^? digit1_9digit
-- Just 9
--
-- >>> d1 ^? digit1_9digit
-- Just 1
digit1_9digit ::
Prism' Digit Digit1_9
digit1_9digit =
prism'
(foldDigit1_9
d1
d2
d3
d4
d5
d6
d7
d8
d9)
(foldDigit
Nothing
(Just D1)
(Just D2)
(Just D3)
(Just D4)
(Just D5)
(Just D6)
(Just D7)
(Just D8)
(Just D9))
instance Show Digit1_9 where
show d =
show (digit1_9 # d)
instance Read Digit1_9 where
readsPrec _ ('1':t) =
[(D1, t)]
readsPrec _ ('2':t) =
[(D2, t)]
readsPrec _ ('3':t) =
[(D3, t)]
readsPrec _ ('4':t) =
[(D4, t)]
readsPrec _ ('5':t) =
[(D5, t)]
readsPrec _ ('6':t) =
[(D6, t)]
readsPrec _ ('7':t) =
[(D7, t)]
readsPrec _ ('8':t) =
[(D8, t)]
readsPrec _ ('9':t) =
[(D9, t)]
readsPrec _ _ =
[]