public static AsyncFuncBuilder <DiscordContext> WithPrefix(
            this AsyncFuncBuilder <DiscordContext> asyncFuncBuilder,
            IPrefix prefix,
            Action <AsyncFuncBuilder <PrefixNormalizedDiscordContext> > configuration)
        {
            asyncFuncBuilder.WithAdapter(
                new PrefixTypeParser <DiscordContext, PrefixNormalizedDiscordContext>(
                    prefix,
                    context => context.Message.Content,
                    (context, normalizedMessage) =>
                    new PrefixNormalizedDiscordContext(context, normalizedMessage)),
                configuration);

            return(asyncFuncBuilder);
        }
        public static AsyncFuncBuilder <DiscordContext> WithGroup(
            this AsyncFuncBuilder <DiscordContext> asyncFuncBuilder,
            IPrefix prefix,
            List <Action <AsyncFuncBuilder <PrefixNormalizedDiscordContext> > > configuration)
        {
            // TODO: Optimize by making a new type parser for the specific use case
            asyncFuncBuilder.WithAdapter(
                new PrefixTypeParser <DiscordContext, PrefixNormalizedDiscordContext>(
                    prefix,
                    context => context.Message.Content,
                    (context, normalizedMessage) => new PrefixNormalizedDiscordContext(context, normalizedMessage)),
                group => group.Any(configuration, result => result == Result.Completed || result == Result.Aborted));

            return(asyncFuncBuilder);
        }
        public static AsyncFuncBuilder <TContext> WithGroup <TContext, TContext2>(
            this AsyncFuncBuilder <TContext> asyncFuncBuilder,
            IPrefix prefix,
            Func <TContext, string> message,
            Func <TContext, string, TContext2> typeParser,
            List <Action <AsyncFuncBuilder <TContext2> > > configuration)
        {
            asyncFuncBuilder.WithAdapter(
                new PrefixTypeParser <TContext, TContext2>(
                    prefix,
                    message,
                    typeParser),
                group => group.Any(configuration, result => result == Result.Completed || result == Result.Aborted));

            return(asyncFuncBuilder);
        }
        public static AsyncFuncBuilder <TContext> WithPrefix <TContext, TContext2>(
            this AsyncFuncBuilder <TContext> asyncFuncBuilder,
            IPrefix prefix,
            Func <TContext, string> message,
            Func <TContext, string, TContext2> typeParser,
            Action <AsyncFuncBuilder <TContext2> > configuration)
        {
            asyncFuncBuilder.WithAdapter(
                new PrefixTypeParser <TContext, TContext2>(
                    prefix,
                    message,
                    typeParser),
                configuration);

            return(asyncFuncBuilder);
        }