packages feed

calamity-commands-0.4.1.0: CalamityCommands/ParsePrefix.hs

{-# LANGUAGE TemplateHaskell #-}

-- | Command prefix parsing effect
module CalamityCommands.ParsePrefix (
  ParsePrefix (..),
  parsePrefix,
  useConstantPrefix,
) where

import Data.Text qualified as T

import Polysemy qualified as P

-- | An effect for parsing the prefix of a command.
data ParsePrefix msg m a where
  -- | Parse a prefix in a message, returning a tuple of @(prefix, remaining message)@
  ParsePrefix :: msg -> ParsePrefix msg m (Maybe (T.Text, T.Text))

P.makeSem ''ParsePrefix

-- | A default interpretation for 'ParsePrefix' that uses a single constant prefix.
useConstantPrefix :: T.Text -> P.Sem (ParsePrefix T.Text ': r) a -> P.Sem r a
useConstantPrefix pre =
  P.interpret
    ( \case
        ParsePrefix msg -> pure ((pre,) <$> T.stripPrefix pre msg)
    )