module Slots (Slots (..), anonymous) where
import AST
import Data.Text (Text)
class Slots a where
slots :: a -> [Slot]
anonymous :: (Slots a) => a -> Maybe Text
anonymous :: forall a. Slots a => a -> Maybe Text
anonymous a
term = case a -> [Slot]
forall a. Slots a => a -> [Slot]
slots a
term of
[] -> Maybe Text
forall a. Maybe a
Nothing
Slot Text
kind Int
_ : [Slot]
_ -> Text -> Maybe Text
forall a. a -> Maybe a
Just Text
kind
instance (Slots a) => Slots [a] where
slots :: [a] -> [Slot]
slots = (a -> [Slot]) -> [a] -> [Slot]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap a -> [Slot]
forall a. Slots a => a -> [Slot]
slots
instance (Slots a) => Slots (Maybe a) where
slots :: Maybe a -> [Slot]
slots = [Slot] -> (a -> [Slot]) -> Maybe a -> [Slot]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] a -> [Slot]
forall a. Slots a => a -> [Slot]
slots
instance Slots Expression where
slots :: Expression -> [Slot]
slots (ExAny Slot
slot) = [Slot
slot]
slots (ExFormation [Binding]
bds) = [Binding] -> [Slot]
forall a. Slots a => a -> [Slot]
slots [Binding]
bds
slots (ExApplication Expression
expr Argument
arg) = Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr [Slot] -> [Slot] -> [Slot]
forall a. [a] -> [a] -> [a]
++ Argument -> [Slot]
forall a. Slots a => a -> [Slot]
slots Argument
arg
slots (ExDispatch Expression
expr Attribute
attr) = Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr [Slot] -> [Slot] -> [Slot]
forall a. [a] -> [a] -> [a]
++ Attribute -> [Slot]
forall a. Slots a => a -> [Slot]
slots Attribute
attr
slots (ExPhiMeet Maybe String
_ Int
_ Expression
expr) = Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr
slots (ExPhiAgain Maybe String
_ Int
_ Expression
expr) = Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr
slots (ExBytes Bytes
bts) = Bytes -> [Slot]
forall a. Slots a => a -> [Slot]
slots Bytes
bts
slots Expression
_ = []
instance Slots Argument where
slots :: Argument -> [Slot]
slots (ArTau Attribute
attr Expression
expr) = Attribute -> [Slot]
forall a. Slots a => a -> [Slot]
slots Attribute
attr [Slot] -> [Slot] -> [Slot]
forall a. [a] -> [a] -> [a]
++ Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr
slots (ArAlpha Alpha
alpha Expression
expr) = Alpha -> [Slot]
forall a. Slots a => a -> [Slot]
slots Alpha
alpha [Slot] -> [Slot] -> [Slot]
forall a. [a] -> [a] -> [a]
++ Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr
instance Slots Binding where
slots :: Binding -> [Slot]
slots (BiAny Slot
slot) = [Slot
slot]
slots (BiTau Attribute
attr Expression
expr) = Attribute -> [Slot]
forall a. Slots a => a -> [Slot]
slots Attribute
attr [Slot] -> [Slot] -> [Slot]
forall a. [a] -> [a] -> [a]
++ Expression -> [Slot]
forall a. Slots a => a -> [Slot]
slots Expression
expr
slots (BiVoid Attribute
attr) = Attribute -> [Slot]
forall a. Slots a => a -> [Slot]
slots Attribute
attr
slots (BiDelta Bytes
bts) = Bytes -> [Slot]
forall a. Slots a => a -> [Slot]
slots Bytes
bts
slots (BiLambda Function
func) = Function -> [Slot]
forall a. Slots a => a -> [Slot]
slots Function
func
slots (BiMeta Text
_) = []
instance Slots Attribute where
slots :: Attribute -> [Slot]
slots (AtAny Slot
slot) = [Slot
slot]
slots Attribute
_ = []
instance Slots Alpha where
slots :: Alpha -> [Slot]
slots (AlAny Slot
slot) = [Slot
slot]
slots Alpha
_ = []
instance Slots Bytes where
slots :: Bytes -> [Slot]
slots (BtAny Slot
slot) = [Slot
slot]
slots Bytes
_ = []
instance Slots Function where
slots :: Function -> [Slot]
slots (FnAny Slot
slot) = [Slot
slot]
slots (FnFresh Slot
slot) = [Slot
slot]
slots Function
_ = []