packages feed

calamity-commands-0.4.1.0: CalamityCommands/Group.hs

{-# LANGUAGE TemplateHaskell #-}

-- | Command groups
module CalamityCommands.Group (Group (..)) where

import CalamityCommands.AliasType
import CalamityCommands.Check
import {-# SOURCE #-} CalamityCommands.Command
import Data.HashMap.Lazy qualified as LH
import Data.List.NonEmpty (NonEmpty)
import Data.List.NonEmpty qualified as NE
import Data.Text qualified as T
import Optics
import TextShow qualified
import TextShow.TH (deriveTextShow)

-- | A group of commands
data Group m c a = Group
  { names :: NonEmpty T.Text
  , parent :: Maybe (Group m c a)
  , hidden :: Bool
  , commands :: LH.HashMap T.Text (Command m c a, AliasType)
  -- ^ Any child commands of this group
  , children :: LH.HashMap T.Text (Group m c a, AliasType)
  -- ^ Any child groups of this group
  , help :: c -> T.Text
  -- ^ A function producing the \'help\' for the group
  , checks :: [Check m c]
  -- ^ A list of checks that must pass
  }

$(makeFieldLabelsNoPrefix ''Group)

data GroupS m c a = GroupS
  { names :: NonEmpty T.Text
  , parent :: Maybe T.Text
  , commands :: [(T.Text, (Command m c a, AliasType))]
  , children :: [(T.Text, (Group m c a, AliasType))]
  , hidden :: Bool
  }
  deriving (Show)

instance (Show a, Show c) => Show (Group m c a) where
  showsPrec d Group {names, parent, commands, children, hidden} =
    showsPrec d $ GroupS names (NE.head <$> parent ^? _Just % #names) (LH.toList commands) (LH.toList children) hidden

$(deriveTextShow ''GroupS)

instance (TextShow.TextShow a, TextShow.TextShow c) => TextShow.TextShow (Group m c a) where
  showbPrec d Group {names, parent, commands, children, hidden} =
    TextShow.showbPrec d $ GroupS names (NE.head <$> parent ^? _Just % #names) (LH.toList commands) (LH.toList children) hidden