-- | UPattern matching on literals for refactorings.
{-# LANGUAGE PatternSynonyms #-}

module Language.Haskell.Tools.Rewrite.Match.Literals where

import Language.Haskell.Tools.AST (ULiteral(..), Ann(..))
import Language.Haskell.Tools.Rewrite.ElementTypes (Literal)

-- | Character literal: @'c'@
pattern CharLit :: Char -> Literal
pattern CharLit c <- Ann _ (UCharLit c)

-- | String literal: @"abc"@
pattern StringLit :: String -> Literal
pattern StringLit s <- Ann _ (UStringLit s)

-- | Integer literal: @12@
pattern IntLit :: Integer -> Literal
pattern IntLit i <- Ann _ (UIntLit i)

-- | Fractional literal: @3.14@
pattern FracLit :: Rational -> Literal
pattern FracLit f <- Ann _ (UFracLit f)

-- | Primitive integer literal (of type @Int#@): @32#@
pattern PrimIntLit :: Integer -> Literal
pattern PrimIntLit i <- Ann _ (UPrimIntLit i)

-- | Primitive word literal (of type @Word#@): @32##@
pattern PrimWordLit :: Integer -> Literal
pattern PrimWordLit i <- Ann _ (UPrimWordLit i)

-- | Primitive float literal (of type @Float#@): @3.14#@
pattern PrimFloatLit :: Rational -> Literal
pattern PrimFloatLit i <- Ann _ (UPrimFloatLit i)

-- | Primitive double literal (of type @Double#@): @3.14##@
pattern PrimDoubleLit :: Rational -> Literal
pattern PrimDoubleLit i <- Ann _ (UPrimDoubleLit i)

-- | Primitive character literal (of type @Char#@): @'c'#@
pattern PrimCharLit :: Char -> Literal
pattern PrimCharLit i <- Ann _ (UPrimCharLit i)

-- | Primitive string literal (of type @Addr#@): @"xxx"#@
pattern PrimStringLit :: String -> Literal
pattern PrimStringLit s <- Ann _ (UPrimStringLit s)