module Unison.Runtime.ANF.Serialize.Tags where

import Unison.Runtime.Serialize (Tag (..), unknownTag)

data TmTag
  = VarT
  | ForceT
  | AppT
  | HandleT
  | ShiftT
  | MatchT
  | LitT
  | NameRefT
  | NameVarT
  | LetDirT
  | LetIndT
  | BxLitT

data FnTag
  = FVarT
  | FCombT
  | FContT
  | FConT
  | FReqT
  | FPrimT
  | FForeignT

data MtTag
  = MIntT
  | MTextT
  | MReqT
  | MEmptyT
  | MDataT
  | MSumT
  | MNumT

data LtTag
  = IT
  | NT
  | FT
  | TT
  | CT
  | LMT
  | LYT

data BLTag
  = TextT
  | ListT
  | TmLinkT
  | TyLinkT
  | BytesT
  | QuoteT
  | CodeT
  | BArrT
  | PosT
  | NegT
  | CharT
  | FloatT
  | ArrT
  | CachedCodeT
  | MapT

data VaTag = PartialT | DataT | ContT | BLitT

data CoTag = KET | MarkT | PushT

instance Tag TmTag where
  tag2word :: TmTag -> Word8
tag2word = \case
    TmTag
VarT -> Word8
1
    TmTag
ForceT -> Word8
2
    TmTag
AppT -> Word8
3
    TmTag
HandleT -> Word8
4
    TmTag
ShiftT -> Word8
5
    TmTag
MatchT -> Word8
6
    TmTag
LitT -> Word8
7
    TmTag
NameRefT -> Word8
8
    TmTag
NameVarT -> Word8
9
    TmTag
LetDirT -> Word8
10
    TmTag
LetIndT -> Word8
11
    TmTag
BxLitT -> Word8
12
  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m TmTag
word2tag = \case
    Word8
1 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
VarT
    Word8
2 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
ForceT
    Word8
3 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
AppT
    Word8
4 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
HandleT
    Word8
5 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
ShiftT
    Word8
6 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
MatchT
    Word8
7 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
LitT
    Word8
8 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
NameRefT
    Word8
9 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
NameVarT
    Word8
10 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
LetDirT
    Word8
11 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
LetIndT
    Word8
12 -> TmTag -> m TmTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TmTag
BxLitT
    Word8
n -> String -> Word8 -> m TmTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"TmTag" Word8
n

instance Tag FnTag where
  tag2word :: FnTag -> Word8
tag2word = \case
    FnTag
FVarT -> Word8
0
    FnTag
FCombT -> Word8
1
    FnTag
FContT -> Word8
2
    FnTag
FConT -> Word8
3
    FnTag
FReqT -> Word8
4
    FnTag
FPrimT -> Word8
5
    FnTag
FForeignT -> Word8
6

  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m FnTag
word2tag = \case
    Word8
0 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FVarT
    Word8
1 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FCombT
    Word8
2 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FContT
    Word8
3 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FConT
    Word8
4 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FReqT
    Word8
5 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FPrimT
    Word8
6 -> FnTag -> m FnTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FnTag
FForeignT
    Word8
n -> String -> Word8 -> m FnTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"FnTag" Word8
n

instance Tag MtTag where
  tag2word :: MtTag -> Word8
tag2word = \case
    MtTag
MIntT -> Word8
0
    MtTag
MTextT -> Word8
1
    MtTag
MReqT -> Word8
2
    MtTag
MEmptyT -> Word8
3
    MtTag
MDataT -> Word8
4
    MtTag
MSumT -> Word8
5
    MtTag
MNumT -> Word8
6

  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m MtTag
word2tag = \case
    Word8
0 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MIntT
    Word8
1 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MTextT
    Word8
2 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MReqT
    Word8
3 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MEmptyT
    Word8
4 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MDataT
    Word8
5 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MSumT
    Word8
6 -> MtTag -> m MtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MtTag
MNumT
    Word8
n -> String -> Word8 -> m MtTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"MtTag" Word8
n

instance Tag LtTag where
  tag2word :: LtTag -> Word8
tag2word = \case
    LtTag
IT -> Word8
0
    LtTag
NT -> Word8
1
    LtTag
FT -> Word8
2
    LtTag
TT -> Word8
3
    LtTag
CT -> Word8
4
    LtTag
LMT -> Word8
5
    LtTag
LYT -> Word8
6

  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m LtTag
word2tag = \case
    Word8
0 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
IT
    Word8
1 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
NT
    Word8
2 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
FT
    Word8
3 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
TT
    Word8
4 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
CT
    Word8
5 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
LMT
    Word8
6 -> LtTag -> m LtTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LtTag
LYT
    Word8
n -> String -> Word8 -> m LtTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"LtTag" Word8
n

instance Tag BLTag where
  tag2word :: BLTag -> Word8
tag2word = \case
    BLTag
TextT -> Word8
0
    BLTag
ListT -> Word8
1
    BLTag
TmLinkT -> Word8
2
    BLTag
TyLinkT -> Word8
3
    BLTag
BytesT -> Word8
4
    BLTag
QuoteT -> Word8
5
    BLTag
CodeT -> Word8
6
    BLTag
BArrT -> Word8
7
    BLTag
PosT -> Word8
8
    BLTag
NegT -> Word8
9
    BLTag
CharT -> Word8
10
    BLTag
FloatT -> Word8
11
    BLTag
ArrT -> Word8
12
    BLTag
CachedCodeT -> Word8
13
    BLTag
MapT -> Word8
14
  {-# INLINE tag2word #-}

  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m BLTag
word2tag = \case
    Word8
0 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
TextT
    Word8
1 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
ListT
    Word8
2 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
TmLinkT
    Word8
3 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
TyLinkT
    Word8
4 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
BytesT
    Word8
5 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
QuoteT
    Word8
6 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
CodeT
    Word8
7 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
BArrT
    Word8
8 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
PosT
    Word8
9 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
NegT
    Word8
10 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
CharT
    Word8
11 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
FloatT
    Word8
12 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
ArrT
    Word8
13 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
CachedCodeT
    Word8
14 -> BLTag -> m BLTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure BLTag
MapT
    Word8
t -> String -> Word8 -> m BLTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"BLTag" Word8
t
  {-# INLINE word2tag #-}

instance Tag VaTag where
  tag2word :: VaTag -> Word8
tag2word = \case
    VaTag
PartialT -> Word8
0
    VaTag
DataT -> Word8
1
    VaTag
ContT -> Word8
2
    VaTag
BLitT -> Word8
3
  {-# INLINE tag2word #-}

  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m VaTag
word2tag = \case
    Word8
0 -> VaTag -> m VaTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure VaTag
PartialT
    Word8
1 -> VaTag -> m VaTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure VaTag
DataT
    Word8
2 -> VaTag -> m VaTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure VaTag
ContT
    Word8
3 -> VaTag -> m VaTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure VaTag
BLitT
    Word8
t -> String -> Word8 -> m VaTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"VaTag" Word8
t
  {-# INLINE word2tag #-}

instance Tag CoTag where
  tag2word :: CoTag -> Word8
tag2word = \case
    CoTag
KET -> Word8
0
    CoTag
MarkT -> Word8
1
    CoTag
PushT -> Word8
2
  word2tag :: forall (m :: * -> *). MonadGet m => Word8 -> m CoTag
word2tag = \case
    Word8
0 -> CoTag -> m CoTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CoTag
KET
    Word8
1 -> CoTag -> m CoTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CoTag
MarkT
    Word8
2 -> CoTag -> m CoTag
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CoTag
PushT
    Word8
t -> String -> Word8 -> m CoTag
forall (m :: * -> *) a. MonadGet m => String -> Word8 -> m a
unknownTag String
"CoTag" Word8
t