-- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
-- SPDX-License-Identifier: MIT

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
_ = []