13 struct SequenceParserMarker {};
15 template<
typename... Parsers>
17 :
public ParserBase<SequenceParser<Parsers...>>
18 ,
public SequenceParserMarker {
20 template<
typename... Ps>
21 constexpr explicit SequenceParser(InPlace, Ps&&... parsers) : m_parsers(util::forward<Ps>(parsers)...) {}
23 template<concepts::ParserContext Context>
24 requires(concepts::Parser<Parsers, Context> && ...)
25 constexpr auto parse(Context& context)
const {
30 []<
typename T>(T&&
value) {
33 []<
typename... Types>(Types&&...
values) {
35 util::forward<Types>(values)...);
39 auto& self, Constexpr<index>, Types&&... values) {
40 if constexpr (index >=
sizeof...(Parsers)) {
41 return make_result(util::forward<Types>(values)...);
45 if constexpr (concepts::LanguageVoid<Value>) {
50 return util::get<index>(m_parsers).parse(context).and_then([&](Value&& value) {
51 return self(
c_<index + 1>, util::forward<Types>(values)..., util::forward<Value>(value));
60 Tuple<Parsers...> m_parsers;
63 struct SequenceFunction {
64 template<concepts::DecayConstructible... Parsers>
65 constexpr auto operator()(Parsers&&... parsers)
const {
66 return SequenceParser<meta::Decay<Parsers>...>(
in_place, util::forward<Parsers>(parsers)...);
71constexpr inline auto sequence = detail::SequenceFunction {};
73template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
75constexpr auto operator>>(Left&& left, Right&& right) {
76 return sequence(util::forward<Left>(left), util::forward<Right>(right));
79template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
83constexpr auto operator>>(Left&& left, Right&& right) {
85 [&]<
typename... Rs>(Rs&&... rs) {
86 return sequence(util::forward<Left>(left), util::forward<Rs>(rs)...);
88 util::forward<Right>(right).m_parsers);
91template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
95constexpr auto operator>>(Left&& left, Right&& right) {
97 [&]<
typename... Ls>(Ls&&... ls) {
98 return sequence(util::forward<Ls>(ls)..., util::forward<Right>(right));
100 util::forward<Left>(left).m_parsers);
103template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
107constexpr auto operator>>(Left&& left, Right&& right) {
109 [&]<
typename... Ls>(Ls&&... ls) {
111 [&]<
typename... Rs>(Rs&&... rs) {
112 return sequence(util::forward<Ls>(ls)..., util::forward<Rs>(rs)...);
114 util::forward<Right>(right).m_parsers);
116 util::forward<Left>(left).m_parsers);
Definition operations.h:114
constexpr auto values
Definition values.h:6
constexpr auto ycombinator
Definition ycombinator.h:63
constexpr auto value
Definition value.h:34
constexpr auto overload
Definition overload.h:28
Definition code_point_parser.h:10
constexpr auto parse
Definition parse.h:23
constexpr auto sequence
Definition sequence.h:71
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
Tuple(Types...) -> Tuple< Types... >
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto in_place
Definition in_place.h:8