{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Trustworthy #-}
module ReWire.Builtins (Builtin (..), builtins, builtinName) where
import ReWire.Orphans ()
import ReWire.Pretty (TextShow (showt), FromGeneric (..), Pretty (pretty))
import Control.Arrow ((&&&))
import Control.DeepSeq (NFData (..))
import Data.Data (Typeable, Data (..))
import Data.Hashable (Hashable (..))
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Data.Tuple (swap)
import GHC.Generics (Generic (..))
data Builtin = Error | Extern | Cryptol
| Bind | Return
| Put | Get
| Signal | Lift | Extrude
| VecFromList | VecReplicate | VecReverse | VecSlice | VecRSlice
| VecIndex | VecIndexProxy
| VecConcat
| VecMap | VecGenerate
| Finite | FiniteMinBound | FiniteMaxBound | ToFinite | ToFiniteMod | FromFinite
| NatVal
| Bits | Resize | BitSlice | BitIndex
| Add | Sub | Mul | Div | Mod | Pow
| LAnd | LOr
| And | Or
| XOr | XNor
| LShift | RShift | RShiftArith
| Eq | Gt | GtEq | Lt | LtEq
| LNot | Not
| RAnd | RNAnd | ROr | RNor | RXOr | RXNor
| MSBit
deriving (Builtin -> Builtin -> Bool
(Builtin -> Builtin -> Bool)
-> (Builtin -> Builtin -> Bool) -> Eq Builtin
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Builtin -> Builtin -> Bool
== :: Builtin -> Builtin -> Bool
$c/= :: Builtin -> Builtin -> Bool
/= :: Builtin -> Builtin -> Bool
Eq, Eq Builtin
Eq Builtin =>
(Builtin -> Builtin -> Ordering)
-> (Builtin -> Builtin -> Bool)
-> (Builtin -> Builtin -> Bool)
-> (Builtin -> Builtin -> Bool)
-> (Builtin -> Builtin -> Bool)
-> (Builtin -> Builtin -> Builtin)
-> (Builtin -> Builtin -> Builtin)
-> Ord Builtin
Builtin -> Builtin -> Bool
Builtin -> Builtin -> Ordering
Builtin -> Builtin -> Builtin
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 :: Builtin -> Builtin -> Ordering
compare :: Builtin -> Builtin -> Ordering
$c< :: Builtin -> Builtin -> Bool
< :: Builtin -> Builtin -> Bool
$c<= :: Builtin -> Builtin -> Bool
<= :: Builtin -> Builtin -> Bool
$c> :: Builtin -> Builtin -> Bool
> :: Builtin -> Builtin -> Bool
$c>= :: Builtin -> Builtin -> Bool
>= :: Builtin -> Builtin -> Bool
$cmax :: Builtin -> Builtin -> Builtin
max :: Builtin -> Builtin -> Builtin
$cmin :: Builtin -> Builtin -> Builtin
min :: Builtin -> Builtin -> Builtin
Ord, (forall x. Builtin -> Rep Builtin x)
-> (forall x. Rep Builtin x -> Builtin) -> Generic Builtin
forall x. Rep Builtin x -> Builtin
forall x. Builtin -> Rep Builtin x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Builtin -> Rep Builtin x
from :: forall x. Builtin -> Rep Builtin x
$cto :: forall x. Rep Builtin x -> Builtin
to :: forall x. Rep Builtin x -> Builtin
Generic, Int -> Builtin -> ShowS
[Builtin] -> ShowS
Builtin -> String
(Int -> Builtin -> ShowS)
-> (Builtin -> String) -> ([Builtin] -> ShowS) -> Show Builtin
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Builtin -> ShowS
showsPrec :: Int -> Builtin -> ShowS
$cshow :: Builtin -> String
show :: Builtin -> String
$cshowList :: [Builtin] -> ShowS
showList :: [Builtin] -> ShowS
Show, Typeable, Typeable Builtin
Typeable Builtin =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Builtin -> c Builtin)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Builtin)
-> (Builtin -> Constr)
-> (Builtin -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Builtin))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Builtin))
-> ((forall b. Data b => b -> b) -> Builtin -> Builtin)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r)
-> (forall u. (forall d. Data d => d -> u) -> Builtin -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Builtin -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin)
-> Data Builtin
Builtin -> Constr
Builtin -> DataType
(forall b. Data b => b -> b) -> Builtin -> Builtin
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Builtin -> u
forall u. (forall d. Data d => d -> u) -> Builtin -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Builtin
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Builtin -> c Builtin
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Builtin)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Builtin)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Builtin -> c Builtin
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Builtin -> c Builtin
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Builtin
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Builtin
$ctoConstr :: Builtin -> Constr
toConstr :: Builtin -> Constr
$cdataTypeOf :: Builtin -> DataType
dataTypeOf :: Builtin -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Builtin)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Builtin)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Builtin)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Builtin)
$cgmapT :: (forall b. Data b => b -> b) -> Builtin -> Builtin
gmapT :: (forall b. Data b => b -> b) -> Builtin -> Builtin
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Builtin -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Builtin -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> Builtin -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Builtin -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Builtin -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Builtin -> m Builtin
Data, Builtin
Builtin -> Builtin -> Bounded Builtin
forall a. a -> a -> Bounded a
$cminBound :: Builtin
minBound :: Builtin
$cmaxBound :: Builtin
maxBound :: Builtin
Bounded, Int -> Builtin
Builtin -> Int
Builtin -> [Builtin]
Builtin -> Builtin
Builtin -> Builtin -> [Builtin]
Builtin -> Builtin -> Builtin -> [Builtin]
(Builtin -> Builtin)
-> (Builtin -> Builtin)
-> (Int -> Builtin)
-> (Builtin -> Int)
-> (Builtin -> [Builtin])
-> (Builtin -> Builtin -> [Builtin])
-> (Builtin -> Builtin -> [Builtin])
-> (Builtin -> Builtin -> Builtin -> [Builtin])
-> Enum Builtin
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 :: Builtin -> Builtin
succ :: Builtin -> Builtin
$cpred :: Builtin -> Builtin
pred :: Builtin -> Builtin
$ctoEnum :: Int -> Builtin
toEnum :: Int -> Builtin
$cfromEnum :: Builtin -> Int
fromEnum :: Builtin -> Int
$cenumFrom :: Builtin -> [Builtin]
enumFrom :: Builtin -> [Builtin]
$cenumFromThen :: Builtin -> Builtin -> [Builtin]
enumFromThen :: Builtin -> Builtin -> [Builtin]
$cenumFromTo :: Builtin -> Builtin -> [Builtin]
enumFromTo :: Builtin -> Builtin -> [Builtin]
$cenumFromThenTo :: Builtin -> Builtin -> Builtin -> [Builtin]
enumFromThenTo :: Builtin -> Builtin -> Builtin -> [Builtin]
Enum)
deriving Int -> Builtin -> Text
Int -> Builtin -> Text
Int -> Builtin -> Builder
[Builtin] -> Text
[Builtin] -> Text
[Builtin] -> Builder
Builtin -> Text
Builtin -> Text
Builtin -> Builder
(Int -> Builtin -> Builder)
-> (Builtin -> Builder)
-> ([Builtin] -> Builder)
-> (Int -> Builtin -> Text)
-> (Builtin -> Text)
-> ([Builtin] -> Text)
-> (Int -> Builtin -> Text)
-> (Builtin -> Text)
-> ([Builtin] -> Text)
-> TextShow Builtin
forall a.
(Int -> a -> Builder)
-> (a -> Builder)
-> ([a] -> Builder)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> TextShow a
$cshowbPrec :: Int -> Builtin -> Builder
showbPrec :: Int -> Builtin -> Builder
$cshowb :: Builtin -> Builder
showb :: Builtin -> Builder
$cshowbList :: [Builtin] -> Builder
showbList :: [Builtin] -> Builder
$cshowtPrec :: Int -> Builtin -> Text
showtPrec :: Int -> Builtin -> Text
$cshowt :: Builtin -> Text
showt :: Builtin -> Text
$cshowtList :: [Builtin] -> Text
showtList :: [Builtin] -> Text
$cshowtlPrec :: Int -> Builtin -> Text
showtlPrec :: Int -> Builtin -> Text
$cshowtl :: Builtin -> Text
showtl :: Builtin -> Text
$cshowtlList :: [Builtin] -> Text
showtlList :: [Builtin] -> Text
TextShow via FromGeneric Builtin
instance Hashable Builtin
instance NFData Builtin
instance Pretty Builtin where
pretty :: forall ann. Builtin -> Doc ann
pretty = Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Text -> Doc ann
pretty (Text -> Doc ann) -> (Builtin -> Text) -> Builtin -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin -> Text
builtinName
builtinName :: Builtin -> Text
builtinName :: Builtin -> Text
builtinName Builtin
b = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ Builtin -> [(Builtin, Text)] -> Maybe Text
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Builtin
b ([(Builtin, Text)] -> Maybe Text)
-> [(Builtin, Text)] -> Maybe Text
forall a b. (a -> b) -> a -> b
$ ((Text, Builtin) -> (Builtin, Text))
-> [(Text, Builtin)] -> [(Builtin, Text)]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Builtin) -> (Builtin, Text)
forall a b. (a, b) -> (b, a)
swap [(Text, Builtin)]
builtins
builtins :: [(Text, Builtin)]
builtins :: [(Text, Builtin)]
builtins = (Builtin -> (Text, Builtin)) -> [Builtin] -> [(Text, Builtin)]
forall a b. (a -> b) -> [a] -> [b]
map (((Text
"rwPrim" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) (Text -> Text) -> (Builtin -> Text) -> Builtin -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builtin -> Text
forall a. TextShow a => a -> Text
showt) (Builtin -> Text)
-> (Builtin -> Builtin) -> Builtin -> (Text, Builtin)
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Builtin -> Builtin
forall a. a -> a
id) [Builtin
forall a. Bounded a => a
minBound .. Builtin
forall a. Bounded a => a
maxBound]