-- SPDX-FileCopyrightText: 2022 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- NB: 'genSingletonsType' creates some unused synonyms and GHC complains. To
-- minimize the impact of this option, this is in a separate module.
{-# OPTIONS_GHC -Wno-unused-top-binds #-}

-- | Address kinds.
module Morley.Tezos.Address.Kinds
  ( AddressKind(..)
  , SingAddressKind(..)
  , forEachAddressKind
  ) where

import Fmt (Buildable(..))
import Language.Haskell.TH (ExpQ)

import Morley.Util.Sing

-- | Address "kind"
data AddressKind
  = AddressKindImplicit
  -- ^ an implicit address, @tz1@-@tz3@
  | AddressKindContract
  -- ^ a contract address, @KT1@
  | AddressKindSmartRollup
  -- ^ a smart rollup address, @sr1@
  deriving stock (AddressKind -> AddressKind -> Bool
(AddressKind -> AddressKind -> Bool)
-> (AddressKind -> AddressKind -> Bool) -> Eq AddressKind
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AddressKind -> AddressKind -> Bool
== :: AddressKind -> AddressKind -> Bool
$c/= :: AddressKind -> AddressKind -> Bool
/= :: AddressKind -> AddressKind -> Bool
Eq, AddressKind
AddressKind -> AddressKind -> Bounded AddressKind
forall a. a -> a -> Bounded a
$cminBound :: AddressKind
minBound :: AddressKind
$cmaxBound :: AddressKind
maxBound :: AddressKind
Bounded, Int -> AddressKind
AddressKind -> Int
AddressKind -> [AddressKind]
AddressKind -> AddressKind
AddressKind -> AddressKind -> [AddressKind]
AddressKind -> AddressKind -> AddressKind -> [AddressKind]
(AddressKind -> AddressKind)
-> (AddressKind -> AddressKind)
-> (Int -> AddressKind)
-> (AddressKind -> Int)
-> (AddressKind -> [AddressKind])
-> (AddressKind -> AddressKind -> [AddressKind])
-> (AddressKind -> AddressKind -> [AddressKind])
-> (AddressKind -> AddressKind -> AddressKind -> [AddressKind])
-> Enum AddressKind
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AddressKind -> AddressKind
succ :: AddressKind -> AddressKind
$cpred :: AddressKind -> AddressKind
pred :: AddressKind -> AddressKind
$ctoEnum :: Int -> AddressKind
toEnum :: Int -> AddressKind
$cfromEnum :: AddressKind -> Int
fromEnum :: AddressKind -> Int
$cenumFrom :: AddressKind -> [AddressKind]
enumFrom :: AddressKind -> [AddressKind]
$cenumFromThen :: AddressKind -> AddressKind -> [AddressKind]
enumFromThen :: AddressKind -> AddressKind -> [AddressKind]
$cenumFromTo :: AddressKind -> AddressKind -> [AddressKind]
enumFromTo :: AddressKind -> AddressKind -> [AddressKind]
$cenumFromThenTo :: AddressKind -> AddressKind -> AddressKind -> [AddressKind]
enumFromThenTo :: AddressKind -> AddressKind -> AddressKind -> [AddressKind]
Enum, Eq AddressKind
Eq AddressKind
-> (AddressKind -> AddressKind -> Ordering)
-> (AddressKind -> AddressKind -> Bool)
-> (AddressKind -> AddressKind -> Bool)
-> (AddressKind -> AddressKind -> Bool)
-> (AddressKind -> AddressKind -> Bool)
-> (AddressKind -> AddressKind -> AddressKind)
-> (AddressKind -> AddressKind -> AddressKind)
-> Ord AddressKind
AddressKind -> AddressKind -> Bool
AddressKind -> AddressKind -> Ordering
AddressKind -> AddressKind -> AddressKind
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
$ccompare :: AddressKind -> AddressKind -> Ordering
compare :: AddressKind -> AddressKind -> Ordering
$c< :: AddressKind -> AddressKind -> Bool
< :: AddressKind -> AddressKind -> Bool
$c<= :: AddressKind -> AddressKind -> Bool
<= :: AddressKind -> AddressKind -> Bool
$c> :: AddressKind -> AddressKind -> Bool
> :: AddressKind -> AddressKind -> Bool
$c>= :: AddressKind -> AddressKind -> Bool
>= :: AddressKind -> AddressKind -> Bool
$cmax :: AddressKind -> AddressKind -> AddressKind
max :: AddressKind -> AddressKind -> AddressKind
$cmin :: AddressKind -> AddressKind -> AddressKind
min :: AddressKind -> AddressKind -> AddressKind
Ord, Int -> AddressKind -> ShowS
[AddressKind] -> ShowS
AddressKind -> [Char]
(Int -> AddressKind -> ShowS)
-> (AddressKind -> [Char])
-> ([AddressKind] -> ShowS)
-> Show AddressKind
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AddressKind -> ShowS
showsPrec :: Int -> AddressKind -> ShowS
$cshow :: AddressKind -> [Char]
show :: AddressKind -> [Char]
$cshowList :: [AddressKind] -> ShowS
showList :: [AddressKind] -> ShowS
Show, (forall x. AddressKind -> Rep AddressKind x)
-> (forall x. Rep AddressKind x -> AddressKind)
-> Generic AddressKind
forall x. Rep AddressKind x -> AddressKind
forall x. AddressKind -> Rep AddressKind x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AddressKind -> Rep AddressKind x
from :: forall x. AddressKind -> Rep AddressKind x
$cto :: forall x. Rep AddressKind x -> AddressKind
to :: forall x. Rep AddressKind x -> AddressKind
Generic)

instance NFData AddressKind

instance Buildable AddressKind where
  build :: AddressKind -> Doc
build = \case
    AddressKind
AddressKindImplicit -> Doc
"implicit"
    AddressKind
AddressKindContract -> Doc
"contract"
    AddressKind
AddressKindSmartRollup -> Doc
"smart rollup"

genSingletonsType ''AddressKind

forEachAddressKind :: ExpQ -> ExpQ
forEachAddressKind :: ExpQ -> ExpQ
forEachAddressKind ExpQ
r = [e|
  \case
    SAddressKindImplicit -> $ExpQ
r
    SAddressKindContract -> $ExpQ
r
    SAddressKindSmartRollup -> $ExpQ
r
  |]