hpython-0.2: src/Language/Python/Syntax/AugAssign.hs
{-# language DeriveFunctor, DeriveFoldable, DeriveTraversable, DeriveGeneric #-}
{-# language InstanceSigs, ScopedTypeVariables, TypeApplications #-}
{-|
Module : Language.Python.Syntax.AugAssign
Copyright : (C) CSIRO 2017-2019
License : BSD3
Maintainer : Isaac Elliott <isaace71295@gmail.com>
Stability : experimental
Portability : non-portable
-}
module Language.Python.Syntax.AugAssign where
import Control.Lens.Lens (Lens', lens)
import Data.Generics.Product.Typed (typed)
import GHC.Generics
import Language.Python.Syntax.Ann
import Language.Python.Syntax.Whitespace
-- | Augmented assignments (PEP 203), such as:
--
-- @
-- x += y
-- @
--
-- or
--
-- @
-- x <<= 8
-- @
--
-- An 'AugAssign' has an 'AugAssignOp' and trailing whitespace. There is an
-- optional annotation, which can simply be @()@ if no annotation is desired.
data AugAssign a
= MkAugAssign
{ _augAssignAnn :: Ann a
, _augAssignType :: AugAssignOp
, _augAssignWhitespace :: [Whitespace]
}
deriving (Eq, Show, Functor, Foldable, Traversable, Generic)
instance HasAnn AugAssign where
annot :: forall a. Lens' (AugAssign a) (Ann a)
annot = typed @(Ann a)
instance HasTrailingWhitespace (AugAssign a) where
trailingWhitespace =
lens _augAssignWhitespace (\a b -> a { _augAssignWhitespace = b })
-- | Augmented assignment operators
data AugAssignOp
-- | @+=@
= PlusEq
-- | @-=@
| MinusEq
-- | @*=@
| StarEq
-- | @\@=@
| AtEq
-- | @/=@
| SlashEq
-- | @%=@
| PercentEq
-- | @&=@
| AmpersandEq
-- | @|=@
| PipeEq
-- | @^=@
| CaretEq
-- | @<<=@
| ShiftLeftEq
-- | @>>=@
| ShiftRightEq
-- | @**=@
| DoubleStarEq
-- | @//=@
| DoubleSlashEq
deriving (Eq, Show)