module Data.Digit.Enum
  ( -- * Binary
    enumBinaryNoZero
  , enumBinary
    -- * Octal
  , enumOctalNoZero
  , enumOctal
    -- * Decimal
  , enumDecimalNoZero
  , enumDecimal
    -- * Hexadecimal
  , enumHexadecimalNoZero
  , enumHexadecimal
    -- * HEXADECIMAL
  , enumHEXADECIMALNoZero
  , enumHEXADECIMAL
  )
where

import Control.Lens.Review ((#))
import Data.Digit.Binary
import Data.Digit.Decimal
import Data.Digit.Hexadecimal.LowerCase
import Data.Digit.Hexadecimal.UpperCase
import Data.Digit.Octal

-- | @[1]@
enumBinaryNoZero :: BinaryNoZero d => [d]
enumBinaryNoZero :: forall d. BinaryNoZero d => [d]
enumBinaryNoZero = [forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()]

-- | @[0, 1]@
enumBinary :: Binary d => [d]
enumBinary :: forall d. Binary d => [d]
enumBinary = [forall d. D0 d => Prism' d ()
d0 forall t b. AReview t b -> b -> t
# (), forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()]

-- | @[1..7]@
enumOctalNoZero :: OctalNoZero d => [d]
enumOctalNoZero :: forall d. OctalNoZero d => [d]
enumOctalNoZero =
  [ forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[0..7]@
enumOctal :: Octal d => [d]
enumOctal :: forall d. Octal d => [d]
enumOctal =
  [ forall d. D0 d => Prism' d ()
d0 forall t b. AReview t b -> b -> t
# ()
  , forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[1..9]@
enumDecimalNoZero :: DecimalNoZero d => [d]
enumDecimalNoZero :: forall d. DecimalNoZero d => [d]
enumDecimalNoZero =
  [ forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  , forall d. D8 d => Prism' d ()
d8 forall t b. AReview t b -> b -> t
# ()
  , forall d. D9 d => Prism' d ()
d9 forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[0..9]@
enumDecimal :: Decimal d => [d]
enumDecimal :: forall d. Decimal d => [d]
enumDecimal =
  [ forall d. D0 d => Prism' d ()
d0 forall t b. AReview t b -> b -> t
# ()
  , forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  , forall d. D8 d => Prism' d ()
d8 forall t b. AReview t b -> b -> t
# ()
  , forall d. D9 d => Prism' d ()
d9 forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[1..9] ++ [a..f]@
enumHexadecimalNoZero :: HexadecimalNoZero d => [d]
enumHexadecimalNoZero :: forall d. HexadecimalNoZero d => [d]
enumHexadecimalNoZero =
  [ forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  , forall d. D8 d => Prism' d ()
d8 forall t b. AReview t b -> b -> t
# ()
  , forall d. D9 d => Prism' d ()
d9 forall t b. AReview t b -> b -> t
# ()
  , forall d. Da d => Prism' d ()
da forall t b. AReview t b -> b -> t
# ()
  , forall d. Db d => Prism' d ()
db forall t b. AReview t b -> b -> t
# ()
  , forall d. Dc d => Prism' d ()
dc forall t b. AReview t b -> b -> t
# ()
  , forall d. Dd d => Prism' d ()
dd forall t b. AReview t b -> b -> t
# ()
  , forall d. De d => Prism' d ()
de forall t b. AReview t b -> b -> t
# ()
  , forall d. Df d => Prism' d ()
df forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[0..9] ++ [a..f]@
enumHexadecimal :: Hexadecimal d => [d]
enumHexadecimal :: forall d. Hexadecimal d => [d]
enumHexadecimal =
  [ forall d. D0 d => Prism' d ()
d0 forall t b. AReview t b -> b -> t
# ()
  , forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  , forall d. D8 d => Prism' d ()
d8 forall t b. AReview t b -> b -> t
# ()
  , forall d. D9 d => Prism' d ()
d9 forall t b. AReview t b -> b -> t
# ()
  , forall d. Da d => Prism' d ()
da forall t b. AReview t b -> b -> t
# ()
  , forall d. Db d => Prism' d ()
db forall t b. AReview t b -> b -> t
# ()
  , forall d. Dc d => Prism' d ()
dc forall t b. AReview t b -> b -> t
# ()
  , forall d. Dd d => Prism' d ()
dd forall t b. AReview t b -> b -> t
# ()
  , forall d. De d => Prism' d ()
de forall t b. AReview t b -> b -> t
# ()
  , forall d. Df d => Prism' d ()
df forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[1..9] ++ [A..F]@
enumHEXADECIMALNoZero :: HEXADECIMALNoZero d => [d]
enumHEXADECIMALNoZero :: forall d. HEXADECIMALNoZero d => [d]
enumHEXADECIMALNoZero =
  [ forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  , forall d. D8 d => Prism' d ()
d8 forall t b. AReview t b -> b -> t
# ()
  , forall d. D9 d => Prism' d ()
d9 forall t b. AReview t b -> b -> t
# ()
  , forall d. DA d => Prism' d ()
dA forall t b. AReview t b -> b -> t
# ()
  , forall d. DB d => Prism' d ()
dB forall t b. AReview t b -> b -> t
# ()
  , forall d. DC d => Prism' d ()
dC forall t b. AReview t b -> b -> t
# ()
  , forall d. DD d => Prism' d ()
dD forall t b. AReview t b -> b -> t
# ()
  , forall d. DE d => Prism' d ()
dE forall t b. AReview t b -> b -> t
# ()
  , forall d. DF d => Prism' d ()
dF forall t b. AReview t b -> b -> t
# ()
  ]

-- | @[0..9] ++ [A..F]@
enumHEXADECIMAL :: HEXADECIMAL d => [d]
enumHEXADECIMAL :: forall d. HEXADECIMAL d => [d]
enumHEXADECIMAL =
  [ forall d. D0 d => Prism' d ()
d0 forall t b. AReview t b -> b -> t
# ()
  , forall d. D1 d => Prism' d ()
d1 forall t b. AReview t b -> b -> t
# ()
  , forall d. D2 d => Prism' d ()
d2 forall t b. AReview t b -> b -> t
# ()
  , forall d. D3 d => Prism' d ()
d3 forall t b. AReview t b -> b -> t
# ()
  , forall d. D4 d => Prism' d ()
d4 forall t b. AReview t b -> b -> t
# ()
  , forall d. D5 d => Prism' d ()
d5 forall t b. AReview t b -> b -> t
# ()
  , forall d. D6 d => Prism' d ()
d6 forall t b. AReview t b -> b -> t
# ()
  , forall d. D7 d => Prism' d ()
d7 forall t b. AReview t b -> b -> t
# ()
  , forall d. D8 d => Prism' d ()
d8 forall t b. AReview t b -> b -> t
# ()
  , forall d. D9 d => Prism' d ()
d9 forall t b. AReview t b -> b -> t
# ()
  , forall d. DA d => Prism' d ()
dA forall t b. AReview t b -> b -> t
# ()
  , forall d. DB d => Prism' d ()
dB forall t b. AReview t b -> b -> t
# ()
  , forall d. DC d => Prism' d ()
dC forall t b. AReview t b -> b -> t
# ()
  , forall d. DD d => Prism' d ()
dD forall t b. AReview t b -> b -> t
# ()
  , forall d. DE d => Prism' d ()
dE forall t b. AReview t b -> b -> t
# ()
  , forall d. DF d => Prism' d ()
dF forall t b. AReview t b -> b -> t
# ()
  ]