{-# LANGUAGE GADTs #-}

module GhcTags.CTag.Utils
  ( tagKindToChar
  , charToTagKind
  ) where

import           GhcTags.Tag

tagKindToChar :: CTagKind -> Maybe Char
tagKindToChar :: CTagKind -> Maybe Char
tagKindToChar CTagKind
tk = case CTagKind
tk of
    CTagKind
TkTerm                    -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'`'
    CTagKind
TkFunction                -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'λ'
    CTagKind
TkTypeConstructor         -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'Λ'
    CTagKind
TkDataConstructor         -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'c'
    CTagKind
TkGADTConstructor         -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'g'
    CTagKind
TkRecordField             -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'r'
    CTagKind
TkTypeSynonym             -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'≡'
    CTagKind
TkTypeSignature           -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'⊢'
    CTagKind
TkPatternSynonym          -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'p'
    CTagKind
TkTypeClass               -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'C'
    CTagKind
TkTypeClassMember         -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'm'
    CTagKind
TkTypeClassInstance       -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'i'
    CTagKind
TkTypeFamily              -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'f'
    CTagKind
TkTypeFamilyInstance      -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'F'
    CTagKind
TkDataTypeFamily          -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'd'
    CTagKind
TkDataTypeFamilyInstance  -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'D'
    CTagKind
TkForeignImport           -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'I'
    CTagKind
TkForeignExport           -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'E'

    CharKind Char
c                -> Char -> Maybe Char
forall a. a -> Maybe a
Just Char
c
    CTagKind
NoKind                    -> Maybe Char
forall a. Maybe a
Nothing


charToTagKind :: Char -> CTagKind
charToTagKind :: Char -> CTagKind
charToTagKind Char
c = case Char
c of
     Char
'`' -> CTagKind
TkTerm
     Char
'λ' -> CTagKind
TkFunction
     Char
'Λ' -> CTagKind
TkTypeConstructor
     Char
'c' -> CTagKind
TkDataConstructor
     Char
'g' -> CTagKind
TkGADTConstructor
     Char
'r' -> CTagKind
TkRecordField
     Char
'≡' -> CTagKind
TkTypeSynonym
     Char
'⊢' -> CTagKind
TkTypeSignature
     Char
'p' -> CTagKind
TkPatternSynonym
     Char
'C' -> CTagKind
TkTypeClass
     Char
'm' -> CTagKind
TkTypeClassMember
     Char
'i' -> CTagKind
TkTypeClassInstance
     Char
'f' -> CTagKind
TkTypeFamily
     Char
'F' -> CTagKind
TkTypeFamilyInstance
     Char
'd' -> CTagKind
TkDataTypeFamily
     Char
'D' -> CTagKind
TkDataTypeFamilyInstance
     Char
'I' -> CTagKind
TkForeignImport
     Char
'E' -> CTagKind
TkForeignExport

     Char
_   -> Char -> CTagKind
CharKind Char
c