{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Digit.Octal(
  OctDigit(..)
, OctalNoZero
, Octal
, parseOctalNoZero
, parseOctal
-- * Prisms
, _OctDigit0
, _OctDigit1
, _OctDigit2
, _OctDigit3
, _OctDigit4
, _OctDigit5
, _OctDigit6
, _OctDigit7
-- * Re-exports
, module Data.Digit.Class.D0
, module Data.Digit.Class.D1
, module Data.Digit.Class.D2
, module Data.Digit.Class.D3
, module Data.Digit.Class.D4
, module Data.Digit.Class.D5
, module Data.Digit.Class.D6
, module Data.Digit.Class.D7
) where

import Prelude (Eq, Show, Ord, Enum, Bounded)
import Control.Lens.TH (makePrisms)
import Text.Parser.Char(CharParsing)
import Text.Parser.Combinators((<?>), choice)
import Data.Digit.Class.D0
import Data.Digit.Class.D1
import Data.Digit.Class.D2
import Data.Digit.Class.D3
import Data.Digit.Class.D4
import Data.Digit.Class.D5
import Data.Digit.Class.D6
import Data.Digit.Class.D7

data OctDigit
  = OctDigit0
  | OctDigit1
  | OctDigit2
  | OctDigit3
  | OctDigit4
  | OctDigit5
  | OctDigit6
  | OctDigit7
  deriving (Int -> OctDigit -> ShowS
[OctDigit] -> ShowS
OctDigit -> String
(Int -> OctDigit -> ShowS)
-> (OctDigit -> String) -> ([OctDigit] -> ShowS) -> Show OctDigit
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OctDigit] -> ShowS
$cshowList :: [OctDigit] -> ShowS
show :: OctDigit -> String
$cshow :: OctDigit -> String
showsPrec :: Int -> OctDigit -> ShowS
$cshowsPrec :: Int -> OctDigit -> ShowS
Show, OctDigit -> OctDigit -> Bool
(OctDigit -> OctDigit -> Bool)
-> (OctDigit -> OctDigit -> Bool) -> Eq OctDigit
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OctDigit -> OctDigit -> Bool
$c/= :: OctDigit -> OctDigit -> Bool
== :: OctDigit -> OctDigit -> Bool
$c== :: OctDigit -> OctDigit -> Bool
Eq, Eq OctDigit
Eq OctDigit
-> (OctDigit -> OctDigit -> Ordering)
-> (OctDigit -> OctDigit -> Bool)
-> (OctDigit -> OctDigit -> Bool)
-> (OctDigit -> OctDigit -> Bool)
-> (OctDigit -> OctDigit -> Bool)
-> (OctDigit -> OctDigit -> OctDigit)
-> (OctDigit -> OctDigit -> OctDigit)
-> Ord OctDigit
OctDigit -> OctDigit -> Bool
OctDigit -> OctDigit -> Ordering
OctDigit -> OctDigit -> OctDigit
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: OctDigit -> OctDigit -> OctDigit
$cmin :: OctDigit -> OctDigit -> OctDigit
max :: OctDigit -> OctDigit -> OctDigit
$cmax :: OctDigit -> OctDigit -> OctDigit
>= :: OctDigit -> OctDigit -> Bool
$c>= :: OctDigit -> OctDigit -> Bool
> :: OctDigit -> OctDigit -> Bool
$c> :: OctDigit -> OctDigit -> Bool
<= :: OctDigit -> OctDigit -> Bool
$c<= :: OctDigit -> OctDigit -> Bool
< :: OctDigit -> OctDigit -> Bool
$c< :: OctDigit -> OctDigit -> Bool
compare :: OctDigit -> OctDigit -> Ordering
$ccompare :: OctDigit -> OctDigit -> Ordering
$cp1Ord :: Eq OctDigit
Ord, Int -> OctDigit
OctDigit -> Int
OctDigit -> [OctDigit]
OctDigit -> OctDigit
OctDigit -> OctDigit -> [OctDigit]
OctDigit -> OctDigit -> OctDigit -> [OctDigit]
(OctDigit -> OctDigit)
-> (OctDigit -> OctDigit)
-> (Int -> OctDigit)
-> (OctDigit -> Int)
-> (OctDigit -> [OctDigit])
-> (OctDigit -> OctDigit -> [OctDigit])
-> (OctDigit -> OctDigit -> [OctDigit])
-> (OctDigit -> OctDigit -> OctDigit -> [OctDigit])
-> Enum OctDigit
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: OctDigit -> OctDigit -> OctDigit -> [OctDigit]
$cenumFromThenTo :: OctDigit -> OctDigit -> OctDigit -> [OctDigit]
enumFromTo :: OctDigit -> OctDigit -> [OctDigit]
$cenumFromTo :: OctDigit -> OctDigit -> [OctDigit]
enumFromThen :: OctDigit -> OctDigit -> [OctDigit]
$cenumFromThen :: OctDigit -> OctDigit -> [OctDigit]
enumFrom :: OctDigit -> [OctDigit]
$cenumFrom :: OctDigit -> [OctDigit]
fromEnum :: OctDigit -> Int
$cfromEnum :: OctDigit -> Int
toEnum :: Int -> OctDigit
$ctoEnum :: Int -> OctDigit
pred :: OctDigit -> OctDigit
$cpred :: OctDigit -> OctDigit
succ :: OctDigit -> OctDigit
$csucc :: OctDigit -> OctDigit
Enum, OctDigit
OctDigit -> OctDigit -> Bounded OctDigit
forall a. a -> a -> Bounded a
maxBound :: OctDigit
$cmaxBound :: OctDigit
minBound :: OctDigit
$cminBound :: OctDigit
Bounded)

makePrisms ''OctDigit

instance D0 OctDigit where; d0 :: p () (f ()) -> p OctDigit (f OctDigit)
d0 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit0
instance D1 OctDigit where; d1 :: p () (f ()) -> p OctDigit (f OctDigit)
d1 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit1
instance D2 OctDigit where; d2 :: p () (f ()) -> p OctDigit (f OctDigit)
d2 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit2
instance D3 OctDigit where; d3 :: p () (f ()) -> p OctDigit (f OctDigit)
d3 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit3
instance D4 OctDigit where; d4 :: p () (f ()) -> p OctDigit (f OctDigit)
d4 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit4
instance D5 OctDigit where; d5 :: p () (f ()) -> p OctDigit (f OctDigit)
d5 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit5
instance D6 OctDigit where; d6 :: p () (f ()) -> p OctDigit (f OctDigit)
d6 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit6
instance D7 OctDigit where; d7 :: p () (f ()) -> p OctDigit (f OctDigit)
d7 = p () (f ()) -> p OctDigit (f OctDigit)
Prism' OctDigit ()
_OctDigit7

type OctalNoZero d =
  (D1 d, D2 d, D3 d, D4 d, D5 d, D6 d, D7 d)

parseOctalNoZero ::
  (OctalNoZero d, CharParsing p) =>
  p d
parseOctalNoZero :: p d
parseOctalNoZero =
  [p d] -> p d
forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      p d
forall d (p :: * -> *). (D1 d, CharParsing p) => p d
parse1
    , p d
forall d (p :: * -> *). (D2 d, CharParsing p) => p d
parse2
    , p d
forall d (p :: * -> *). (D3 d, CharParsing p) => p d
parse3
    , p d
forall d (p :: * -> *). (D4 d, CharParsing p) => p d
parse4
    , p d
forall d (p :: * -> *). (D5 d, CharParsing p) => p d
parse5
    , p d
forall d (p :: * -> *). (D6 d, CharParsing p) => p d
parse6
    , p d
forall d (p :: * -> *). (D7 d, CharParsing p) => p d
parse7
    ] p d -> String -> p d
forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"OctalNoZero"

type Octal d =
  (D0 d, OctalNoZero d)

parseOctal ::
  (Octal d, CharParsing p) =>
  p d
parseOctal :: p d
parseOctal =
  [p d] -> p d
forall (m :: * -> *) a. Alternative m => [m a] -> m a
choice
    [
      p d
forall d (p :: * -> *). (D0 d, CharParsing p) => p d
parse0
    , p d
forall d (p :: * -> *). (OctalNoZero d, CharParsing p) => p d
parseOctalNoZero
    ] p d -> String -> p d
forall (m :: * -> *) a. Parsing m => m a -> String -> m a
<?> String
"Octal"