{"action":"created","comment":{"url":"https://api.github.com/repos/seqan/seqan3/pulls/comments/182411998","pull_request_review_id":113191269,"id":182411998,"diff_hunk":"@@ -0,0 +1,468 @@\n+// ============================================================================\n+//                 SeqAn - The Library for Sequence Analysis\n+// ============================================================================\n+//\n+// Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin\n+// Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik\n+// All rights reserved.\n+//\n+// Redistribution and use in source and binary forms, with or without\n+// modification, are permitted provided that the following conditions are met:\n+//\n+//     * Redistributions of source code must retain the above copyright\n+//       notice, this list of conditions and the following disclaimer.\n+//     * Redistributions in binary form must reproduce the above copyright\n+//       notice, this list of conditions and the following disclaimer in the\n+//       documentation and/or other materials provided with the distribution.\n+//     * Neither the name of Knut Reinert or the FU Berlin nor the names of\n+//       its contributors may be used to endorse or promote products derived\n+//       from this software without specific prior written permission.\n+//\n+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+// ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE\n+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n+// DAMAGE.\n+//\n+// ============================================================================\n+\n+/*!\\file\n+ * \\brief Provides parse conditions for tokenization.\n+ * \\author Rene Rahn <rene.rahn AT fu-berlin.de>\n+ */\n+\n+#pragma once\n+\n+#include <seqan3/alphabet/all.hpp>\n+#include <seqan3/core/concept/core.hpp>\n+#include <seqan3/core/detail/reflection.hpp>\n+#include <seqan3/range/container/constexpr_string.hpp>\n+\n+#include <cctype>\n+#include <string>\n+\n+namespace seqan3::detail\n+{\n+\n+// ----------------------------------------------------------------------------\n+// condition_message_v\n+// ----------------------------------------------------------------------------\n+\n+/*!\\brief Defines a compound seqan3::detail::constexpr_string consisting of all given conditions separated by the\n+ *        operator-name `op`.\n+ * \\ingroup io\n+ * \\tparam op               non-type template parameter specifying the separator character, e.g. '|'.\n+ * \\tparam condition_head_t The first condition type in the message. Ensures, that there is at least one type.\n+ * \\tparam condition_ts     Remaining list of conditions separated by `op`.\n+ */\n+template <char op, typename condition_head_t, typename ...condition_ts>\n+constexpr constexpr_string condition_message_v\n+{\n+    constexpr_string{\"(\"} +\n+    (condition_head_t::msg + ... +\n+        (constexpr_string{\" \"} + constexpr_string{{op, op, '\\0'}} + constexpr_string{\" \"} + condition_ts::msg)) +\n+    constexpr_string{\")\"}\n+};\n+\n+// ----------------------------------------------------------------------------\n+// parse_condition_concept\n+// ----------------------------------------------------------------------------\n+\n+/*!\\interface seqan3::detail::parse_condition_concept <>\n+ * \\brief An internal concept to check if an object fulfills the requirements of a seqan3::detail::parse_condition.\n+ * \\ingroup io\n+ *\n+ * \\details\n+ *\n+ * The must be invocable with an seqan3::alphabet_concept type and supply a static constexpr `msg` member of type\n+ * seqan3::detail::constexpr_string.\n+ */\n+//!\\cond\n+template <typename condition_t>\n+concept bool parse_condition_concept = invocable_concept<std::remove_reference_t<condition_t>, char> &&\n+                                       requires { std::remove_reference_t<condition_t>::msg; };\n+//!\\endcond\n+\n+// ----------------------------------------------------------------------------\n+// parse_condition\n+// ----------------------------------------------------------------------------\n+\n+//!\\cond\n+template <parse_condition_concept... condition_ts>\n+    requires sizeof...(condition_ts) >= 2\n+struct or_fn;\n+\n+template <parse_condition_concept... condition_ts>\n+    requires sizeof...(condition_ts) >= 2\n+struct and_fn;\n+\n+template <parse_condition_concept condition_t>\n+struct not_fn;\n+//!\\endcond\n+\n+/*!\\brief A CRTP class for parse conditions to add logical conjunction, disjunction and negation operator.\n+ * \\tparam condition_t The parse condition type to be extended with the logical operators.\n+ *                     Must satisfy the seqan3::detail::parse_condition_concept.\n+ * \\ingroup io\n+ */\n+template <typename condition_t>\n+class parse_condition\n+{\n+private:\n+\n+    //!\\brief Auxiliary variable to test if the derived type fulfills the parse_condition_concept.\n+    template <typename t>\n+    static constexpr bool is_parse_condition = parse_condition_concept<t>;\n+\n+    //!\\brief Friend declaration for other seqan3::detail::parse_condition types.\n+    template <typename other_condition_type>\n+    friend class parse_condition;\n+\n+public:\n+    /*!\\name Constructor, destructor and assignment\n+     * \\brief Defaulted all standard constructor.\n+     * \\{\n+     */\n+    constexpr parse_condition() = default;\n+    constexpr parse_condition(parse_condition const &) = default;\n+    constexpr parse_condition(parse_condition &&) = default;\n+    constexpr parse_condition & operator=(parse_condition const &) = default;\n+    constexpr parse_condition & operator=(parse_condition &&) = default;\n+    ~parse_condition() =  default;\n+    //!\\}\n+\n+    /*!\\name Logical operators\n+     * \\brief Adds logical operators to allow logical disjunction, conjunction and negation on parse conditions.\n+     * \\{\n+     */\n+    //!\\brief Combines the result of two seqan3::detail::parse_condition via logical disjunction.\n+    template <parse_condition_concept rhs_condition_t>\n+    constexpr auto operator||(parse_condition<rhs_condition_t> const &) const\n+    {\n+        // using new_condition_t = decltype(or_fn{cond, rhs.cond});\n+        return or_fn<condition_t, rhs_condition_t>{};\n+    }\n+\n+    //!\\brief Combines the result of two seqan3::detail::parse_condition via logical conjunction.\n+    template <parse_condition_concept rhs_condition_t>\n+    constexpr auto operator&&(parse_condition<rhs_condition_t> const &) const\n+    {\n+        // using new_condition_t = decltype(and_fn<condition_t, rhs_condition_t>);\n+        return and_fn<condition_t, rhs_condition_t>{};\n+    }\n+\n+    //!\\brief Negates the result of a seqan3::detail::parse_condition\n+    constexpr auto operator!() const\n+    {\n+        // using new_condition_t = decltype(not_fn{cond});\n+        return not_fn<condition_t>{};\n+    }\n+    //!\\}\n+\n+    /*!\\name Function call operator\n+     * \\{\n+     */\n+    //!\\brief Invokes the condition on `val`.\n+    template <alphabet_concept value_t>\n+    bool operator()(value_t && val) const\n+    {\n+        return std::invoke(condition_t(), std::forward<value_t>(val));\n+    }\n+    //!\\}\n+\n+    /*!\\name Output functions\n+     * \\{\n+     */\n+    //!\\brief Returns the message representing this condition as std::string.\n+    //!\\cond\n+    template <typename t = condition_t>\n+        requires is_parse_condition<t>\n+    //!\\endcond\n+    std::string message() const\n+    {\n+        return condition_t::msg.string();\n+    }\n+    //!\\}\n+};\n+\n+// ----------------------------------------------------------------------------\n+// or_fn\n+// ----------------------------------------------------------------------------\n+\n+/*!\\brief Logical disjunction operator for parse conditions.\n+ * \\implements seqan3::detail::parse_condition_concept\n+ * \\tparam condition_ts Template parameter pack over all parse condition types. Must contain at least 2 template parameters.\n+ *                      Must satisfy the seqan3::detail::parse_condition_concept.\n+ * \\ingroup io\n+ */\n+template <parse_condition_concept... condition_ts>\n+//\\cond\n+    requires sizeof...(condition_ts) >= 2\n+//\\endcond\n+struct or_fn : public parse_condition<or_fn<condition_ts...>>\n+{\n+    //!\\brief The message representing the disjunction of the associated conditions.\n+    static constexpr auto msg = detail::condition_message_v<'|', condition_ts...>;\n+\n+    //!\\brief Calls each parse condition with `val` and returns the logical disjunction of their results.\n+    template <typename value_t>\n+    inline bool operator()(value_t && val) const\n+    {\n+        return (... || std::invoke(condition_ts(), std::forward<value_t>(val)));\n+    }\n+};\n+\n+/*!\\brief Logical conjunction operator for parse conditions.\n+ * \\implements seqan3::detail::parse_condition_concept\n+ * \\tparam condition_ts Template parameter pack over all parse condition types. Must contain at least 2 template parameters.\n+ *                      Must satisfy the seqan3::detail::parse_condition_concept.\n+ * \\ingroup io\n+ */\n+template <parse_condition_concept... condition_ts>\n+//\\cond\n+    requires sizeof...(condition_ts) >= 2\n+//\\endcond\n+struct and_fn : public parse_condition<and_fn<condition_ts...>>\n+{\n+    //!\\brief The message representing the conjunction of the associated conditions.\n+    static constexpr auto msg = detail::condition_message_v<'&', condition_ts...>;\n+\n+    //!\\brief Calls each parse conditions with `val` and returns the logical conjunction.\n+    template <typename value_t>\n+    inline bool operator()(value_t && val) const\n+    {\n+        return (... && std::invoke(condition_ts(), std::forward<value_t>(val)));\n+    }\n+};\n+\n+/*!\\brief Logical not operator for a parse condition.\n+ * \\implements seqan3::detail::parse_condition_concept\n+ * \\tparam condition_t Template parameter to apply the not-operator for.\n+ *                     Must satisfy the seqan3::detail::parse_condition_concept.\n+ * \\ingroup io\n+ */\n+template <parse_condition_concept condition_t>\n+struct not_fn : public parse_condition<not_fn<condition_t>>\n+{\n+    //!\\brief The message representing the negation of the associated condition.\n+    static constexpr auto msg = constexpr_string{'!'} + condition_t::msg;\n+\n+    //!\\brief Calls the stored parse condition with `val` and returns the negated result.\n+    template <typename value_t>\n+    inline bool operator()(value_t && val) const\n+    {\n+        return !std::invoke(condition_t(), std::forward<value_t>(val));\n+    }\n+};\n+\n+// ----------------------------------------------------------------------------\n+// is_in_range\n+// ----------------------------------------------------------------------------\n+\n+/*!\\brief Parse condition that checks if a given value is in the range of `rng_beg` and `rng_end`.\n+ * \\implements seqan3::detail::parse_condition_concept\n+ * \\tparam rng_beg non-type template parameter denoting the begin of the allowed range. Must be less or greater to `rng_end`.\n+ * \\tparam rng_end non-type template parameter denoting the end of the allowed range. Must be greater or equal to `rng_beg`.\n+ * \\ingroup io\n+ */\n+template <char rng_beg, char rng_end>\n+//\\cond\n+    requires rng_beg <= rng_end\n+//\\endcond\n+struct is_in_range : public parse_condition<is_in_range<rng_beg, rng_end>>\n+{\n+    //!\\brief The message representing this condition.\n+    static constexpr constexpr_string msg = constexpr_string{\"is_in_range<\"}+\n+                                            constexpr_string{rng_beg}+\n+                                            constexpr_string{\", \"}+\n+                                            constexpr_string{rng_end}+\n+                                            constexpr_string{\">\"};\n+\n+    using parse_condition<is_in_range<rng_beg, rng_end>>::parse_condition;\n+\n+    //!\\brief Invokes the condition check for `val`. `val` must satisfy the seqan3::alphabet_concept.\n+    template <alphabet_concept alphabet_t>\n+    bool operator()(alphabet_t && val) const\n+    {\n+        return (rng_beg <= to_char(std::forward<alphabet_t>(val))) &&\n+               (to_char(std::forward<alphabet_t>(val)) <= rng_end);\n+    }\n+};\n+\n+// ----------------------------------------------------------------------------\n+// is_in_alphabet\n+// ----------------------------------------------------------------------------\n+\n+/*!\\brief Parse condition that checks if a given value is within the given alphabet `alphabet_t`.\n+ * \\implements seqan3::detail::parse_condition_concept\n+ * \\tparam alphabet_t The alphabet type. Must satisfy the seqan3::alphabet_concept.\n+ * \\ingroup io\n+ */\n+template <alphabet_concept alphabet_t>\n+struct is_in_alphabet : public parse_condition<is_in_alphabet<alphabet_t>>\n+{\n+    //!\\brief The message representing this condition.\n+    static constexpr auto msg = constexpr_string{\"is_in_alphabet<\"} +\n+                                constexpr_string{detail::get_display_name_v<alphabet_t>} +\n+                                constexpr_string{\">\"};\n+\n+    //!\\brief Invokes the condition check for `val`. `val` must satisfy the seqan3::alphabet_concept.\n+    template <alphabet_concept value_t>\n+    bool operator()(value_t && val) const\n+    {\n+        using seqan3::to_char;\n+        using seqan3::assign_char;\n+\n+        if constexpr (std::is_same_v<std::decay_t<value_t>, std::decay_t<alphabet_t>>)\n+            return true;\n+\n+        alphabet_t cmp;\n+        assign_char(cmp, to_char(val));\n+        return to_char(cmp) == std::toupper(static_cast<uint8_t>(to_char(val)));\n+    }\n+};\n+\n+// ----------------------------------------------------------------------------\n+// is_char\n+// ----------------------------------------------------------------------------\n+\n+/*!\\brief Parse condition that checks if a given value is equal to `char_v`.\n+ * \\implements seqan3::detail::parse_condition_concept\n+ * \\tparam alphabet_t non-type template parameter with the value that should be checked against.\n+ * \\ingroup io\n+ */\n+template <char char_v>\n+struct is_char : public parse_condition<is_char<char_v>>\n+{\n+    //!\\brief The message representing this condition.\n+    static constexpr auto msg = constexpr_string{\"is_char<\"} +\n+                                constexpr_string{char_v} +\n+                                constexpr_string(\">\");\n+\n+    //!\\brief Invokes the condition check for `val`. `val` must satisfy the seqan3::alphabet_concept.\n+    template <alphabet_concept value_t>\n+    bool operator()(value_t && val) const\n+    {\n+        return to_char(val) == char_v;\n+    }\n+};\n+\n+} // namespace seqan3::detail\n+\n+namespace seqan3\n+{\n+\n+// ----------------------------------------------------------------------------\n+// Composite Functors\n+// ----------------------------------------------------------------------------\n+// Don't use isblank() or isspace() as it they seem to be slower than our functors (due to inlining)\n+\n+/*\\brief A view that calls seqan3::to_char() on each element in the input range.\n+ * \\tparam irng_t The type of the range being processed. See below for requirements. [template parameter is omitted in pipe notation]\n+ * \\param irange The range being processed. [parameter is omitted in pipe notation]\n+ * \\returns A range of converted elements. See below for the properties of the returned range.\n+ * \\ingroup io\n+ *\n+ * ### View properties\n+ *\n+ * | Composite Functor   | Tested Condition                            |\n+ * |---------------------|---------------------------------------------|\n+ * | is_tab              | v = '\\\\t'                                   |\n+ * | is_space            | v = ' '                                     |\n+ * | is_blank            | v = '\\\\t' \\|\\| ' '                          |\n+ * | is_new_line         | v = '\\\\n' \\|\\| '\\\\r'                        |\n+ * | is_whitespace       | v = ' ' \\|\\| '\\\\t' \\|\\| '\\\\n' \\|\\| '\\\\r'    |\n+ * | is_alpha            | v = 'a'...'z' \\|\\| 'A'...'Z'                |\n+ * | is_digit            | v = '0'...'9'                               |\n+ * | is_alpha_num        | v = 'a'...'z' \\|\\| 'A'...'Z' \\|\\| '0'...'9' |\n+ * | is_graph            | v = '!'...'~'                               |\n+ *\n+ *\n+ * ### Example\n+ * ```cpp\n+ * ```\n+ */\n+//!\\todo write me\n+constexpr detail::is_char<'\\t'> is_tab;\n+//!\\todo write me\n+constexpr detail::is_char<' '> is_space;\n+//!\\todo write me\n+constexpr detail::or_fn<decltype(is_space), decltype(is_tab)> is_blank;\n+//!\\todo write me\n+constexpr detail::or_fn<detail::is_char<'\\n'>, detail::is_char<'\\r'>> is_new_line;\n+//!\\todo write me\n+constexpr detail::or_fn<detail::is_char<' '>, detail::is_char<'\\t'>, detail::is_char<'\\n'>, detail::is_char<'\\r'>>\n+    is_whitespace;\n+//!\\todo write me\n+constexpr detail::is_in_range<'!', '~'> is_graph;\n+//!\\todo write me\n+constexpr detail::or_fn<detail::is_in_range<'a', 'z'>, detail::is_in_range<'A', 'Z'>> is_alpha;\n+//!\\todo write me\n+constexpr detail::is_in_range<'0', '9'> is_digit;\n+//!\\todo write me\n+constexpr detail::or_fn<detail::is_in_range<'a','z'>, detail::is_in_range<'A','Z'>, detail::is_in_range<'0','9'>>\n+    is_alpha_num;\n+\n+//!\\cond\n+//!\\todo write me!\n+template <detail::parse_condition_concept condition_type, typename error_type = std::runtime_error>\n+struct expected\n+{\n+    //!\\todo write me\n+    constexpr expected() = default;\n+    //!\\todo write me\n+    constexpr expected(expected const &) = default;\n+    //!\\todo write me\n+    constexpr expected(expected &&) = default;\n+    //!\\todo write me\n+    constexpr expected & operator=(expected const &) = default;\n+    //!\\todo write me\n+    constexpr expected & operator=(expected &&) = default;\n+    //!\\todo write me\n+    ~expected() = default;\n+\n+    //!\\todo write me\n+    explicit constexpr expected(condition_type /**/)\n+    {}\n+\n+    //!\\todo write me\n+    constexpr expected(condition_type /**/, error_type)\n+    {}\n+\n+    //!\\todo write me\n+    template <alphabet_concept value_type>\n+    void operator()(value_type && val) const\n+    {\n+        if (!std::invoke(condition_type(), std::forward<value_type>(val)))\n+        {\n+            using namespace std::literals;\n+            // I can not assure that all parameters are convertible to val.\n+            throw error_type{\"Parsed value <\"s + to_char(val) +\n+                             \"> which does not fulfill the following condition: \"s +\n+                             condition_type{}.message()};\n+        }\n+    }\n+};\n+\n+/*!\\name Deduction guides\n+ * \\brief Deduces the expected type from it's passed c'tor arguments.","path":"include/seqan3/io/stream/parse_condition.hpp","position":454,"original_position":454,"commit_id":"1e41d0045c180e42f8d7c9678652c4b6d5215987","original_commit_id":"1e41d0045c180e42f8d7c9678652c4b6d5215987","user":{"login":"joergi-w","id":6093784,"avatar_url":"https://avatars3.githubusercontent.com/u/6093784?v=4","gravatar_id":"","url":"https://api.github.com/users/joergi-w","html_url":"https://github.com/joergi-w","followers_url":"https://api.github.com/users/joergi-w/followers","following_url":"https://api.github.com/users/joergi-w/following{/other_user}","gists_url":"https://api.github.com/users/joergi-w/gists{/gist_id}","starred_url":"https://api.github.com/users/joergi-w/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joergi-w/subscriptions","organizations_url":"https://api.github.com/users/joergi-w/orgs","repos_url":"https://api.github.com/users/joergi-w/repos","events_url":"https://api.github.com/users/joergi-w/events{/privacy}","received_events_url":"https://api.github.com/users/joergi-w/received_events","type":"User","site_admin":false},"body":"it's ==> its","created_at":"2018-04-18T12:44:43Z","updated_at":"2018-04-18T12:53:10Z","html_url":"https://github.com/seqan/seqan3/pull/207#discussion_r182411998","pull_request_url":"https://api.github.com/repos/seqan/seqan3/pulls/207","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/comments/182411998"},"html":{"href":"https://github.com/seqan/seqan3/pull/207#discussion_r182411998"},"pull_request":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/207"}}},"pull_request":{"url":"https://api.github.com/repos/seqan/seqan3/pulls/207","id":175085713,"html_url":"https://github.com/seqan/seqan3/pull/207","diff_url":"https://github.com/seqan/seqan3/pull/207.diff","patch_url":"https://github.com/seqan/seqan3/pull/207.patch","issue_url":"https://api.github.com/repos/seqan/seqan3/issues/207","number":207,"state":"open","locked":false,"title":"Feature/parse condition","user":{"login":"rrahn","id":1529364,"avatar_url":"https://avatars2.githubusercontent.com/u/1529364?v=4","gravatar_id":"","url":"https://api.github.com/users/rrahn","html_url":"https://github.com/rrahn","followers_url":"https://api.github.com/users/rrahn/followers","following_url":"https://api.github.com/users/rrahn/following{/other_user}","gists_url":"https://api.github.com/users/rrahn/gists{/gist_id}","starred_url":"https://api.github.com/users/rrahn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rrahn/subscriptions","organizations_url":"https://api.github.com/users/rrahn/orgs","repos_url":"https://api.github.com/users/rrahn/repos","events_url":"https://api.github.com/users/rrahn/events{/privacy}","received_events_url":"https://api.github.com/users/rrahn/received_events","type":"User","site_admin":false},"body":"Initial commit for parse condition functor.","created_at":"2018-03-14T21:08:55Z","updated_at":"2018-04-18T12:53:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a2829dda27eda27ffae30168db94f0384d21a511","assignee":{"login":"h-2","id":2996863,"avatar_url":"https://avatars2.githubusercontent.com/u/2996863?v=4","gravatar_id":"","url":"https://api.github.com/users/h-2","html_url":"https://github.com/h-2","followers_url":"https://api.github.com/users/h-2/followers","following_url":"https://api.github.com/users/h-2/following{/other_user}","gists_url":"https://api.github.com/users/h-2/gists{/gist_id}","starred_url":"https://api.github.com/users/h-2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/h-2/subscriptions","organizations_url":"https://api.github.com/users/h-2/orgs","repos_url":"https://api.github.com/users/h-2/repos","events_url":"https://api.github.com/users/h-2/events{/privacy}","received_events_url":"https://api.github.com/users/h-2/received_events","type":"User","site_admin":false},"assignees":[{"login":"h-2","id":2996863,"avatar_url":"https://avatars2.githubusercontent.com/u/2996863?v=4","gravatar_id":"","url":"https://api.github.com/users/h-2","html_url":"https://github.com/h-2","followers_url":"https://api.github.com/users/h-2/followers","following_url":"https://api.github.com/users/h-2/following{/other_user}","gists_url":"https://api.github.com/users/h-2/gists{/gist_id}","starred_url":"https://api.github.com/users/h-2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/h-2/subscriptions","organizations_url":"https://api.github.com/users/h-2/orgs","repos_url":"https://api.github.com/users/h-2/repos","events_url":"https://api.github.com/users/h-2/events{/privacy}","received_events_url":"https://api.github.com/users/h-2/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":568314043,"url":"https://api.github.com/repos/seqan/seqan3/labels/feature/proposal","name":"feature/proposal","color":"0e8a16","default":false}],"milestone":{"url":"https://api.github.com/repos/seqan/seqan3/milestones/6","html_url":"https://github.com/seqan/seqan3/milestone/6","labels_url":"https://api.github.com/repos/seqan/seqan3/milestones/6/labels","id":3212935,"number":6,"title":"Pre-easter","description":"","creator":{"login":"h-2","id":2996863,"avatar_url":"https://avatars2.githubusercontent.com/u/2996863?v=4","gravatar_id":"","url":"https://api.github.com/users/h-2","html_url":"https://github.com/h-2","followers_url":"https://api.github.com/users/h-2/followers","following_url":"https://api.github.com/users/h-2/following{/other_user}","gists_url":"https://api.github.com/users/h-2/gists{/gist_id}","starred_url":"https://api.github.com/users/h-2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/h-2/subscriptions","organizations_url":"https://api.github.com/users/h-2/orgs","repos_url":"https://api.github.com/users/h-2/repos","events_url":"https://api.github.com/users/h-2/events{/privacy}","received_events_url":"https://api.github.com/users/h-2/received_events","type":"User","site_admin":false},"open_issues":9,"closed_issues":5,"state":"open","created_at":"2018-03-23T17:42:05Z","updated_at":"2018-04-12T12:39:15Z","due_on":"2018-03-29T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/seqan/seqan3/pulls/207/commits","review_comments_url":"https://api.github.com/repos/seqan/seqan3/pulls/207/comments","review_comment_url":"https://api.github.com/repos/seqan/seqan3/pulls/comments{/number}","comments_url":"https://api.github.com/repos/seqan/seqan3/issues/207/comments","statuses_url":"https://api.github.com/repos/seqan/seqan3/statuses/1e41d0045c180e42f8d7c9678652c4b6d5215987","head":{"label":"rrahn:feature/parse_condition","ref":"feature/parse_condition","sha":"1e41d0045c180e42f8d7c9678652c4b6d5215987","user":{"login":"rrahn","id":1529364,"avatar_url":"https://avatars2.githubusercontent.com/u/1529364?v=4","gravatar_id":"","url":"https://api.github.com/users/rrahn","html_url":"https://github.com/rrahn","followers_url":"https://api.github.com/users/rrahn/followers","following_url":"https://api.github.com/users/rrahn/following{/other_user}","gists_url":"https://api.github.com/users/rrahn/gists{/gist_id}","starred_url":"https://api.github.com/users/rrahn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rrahn/subscriptions","organizations_url":"https://api.github.com/users/rrahn/orgs","repos_url":"https://api.github.com/users/rrahn/repos","events_url":"https://api.github.com/users/rrahn/events{/privacy}","received_events_url":"https://api.github.com/users/rrahn/received_events","type":"User","site_admin":false},"repo":{"id":85306117,"name":"seqan3","full_name":"rrahn/seqan3","owner":{"login":"rrahn","id":1529364,"avatar_url":"https://avatars2.githubusercontent.com/u/1529364?v=4","gravatar_id":"","url":"https://api.github.com/users/rrahn","html_url":"https://github.com/rrahn","followers_url":"https://api.github.com/users/rrahn/followers","following_url":"https://api.github.com/users/rrahn/following{/other_user}","gists_url":"https://api.github.com/users/rrahn/gists{/gist_id}","starred_url":"https://api.github.com/users/rrahn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rrahn/subscriptions","organizations_url":"https://api.github.com/users/rrahn/orgs","repos_url":"https://api.github.com/users/rrahn/repos","events_url":"https://api.github.com/users/rrahn/events{/privacy}","received_events_url":"https://api.github.com/users/rrahn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rrahn/seqan3","description":"The modern C++ library for sequence analysis. Contains version 3 of the library and API docs.","fork":true,"url":"https://api.github.com/repos/rrahn/seqan3","forks_url":"https://api.github.com/repos/rrahn/seqan3/forks","keys_url":"https://api.github.com/repos/rrahn/seqan3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rrahn/seqan3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rrahn/seqan3/teams","hooks_url":"https://api.github.com/repos/rrahn/seqan3/hooks","issue_events_url":"https://api.github.com/repos/rrahn/seqan3/issues/events{/number}","events_url":"https://api.github.com/repos/rrahn/seqan3/events","assignees_url":"https://api.github.com/repos/rrahn/seqan3/assignees{/user}","branches_url":"https://api.github.com/repos/rrahn/seqan3/branches{/branch}","tags_url":"https://api.github.com/repos/rrahn/seqan3/tags","blobs_url":"https://api.github.com/repos/rrahn/seqan3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rrahn/seqan3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rrahn/seqan3/git/refs{/sha}","trees_url":"https://api.github.com/repos/rrahn/seqan3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rrahn/seqan3/statuses/{sha}","languages_url":"https://api.github.com/repos/rrahn/seqan3/languages","stargazers_url":"https://api.github.com/repos/rrahn/seqan3/stargazers","contributors_url":"https://api.github.com/repos/rrahn/seqan3/contributors","subscribers_url":"https://api.github.com/repos/rrahn/seqan3/subscribers","subscription_url":"https://api.github.com/repos/rrahn/seqan3/subscription","commits_url":"https://api.github.com/repos/rrahn/seqan3/commits{/sha}","git_commits_url":"https://api.github.com/repos/rrahn/seqan3/git/commits{/sha}","comments_url":"https://api.github.com/repos/rrahn/seqan3/comments{/number}","issue_comment_url":"https://api.github.com/repos/rrahn/seqan3/issues/comments{/number}","contents_url":"https://api.github.com/repos/rrahn/seqan3/contents/{+path}","compare_url":"https://api.github.com/repos/rrahn/seqan3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rrahn/seqan3/merges","archive_url":"https://api.github.com/repos/rrahn/seqan3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rrahn/seqan3/downloads","issues_url":"https://api.github.com/repos/rrahn/seqan3/issues{/number}","pulls_url":"https://api.github.com/repos/rrahn/seqan3/pulls{/number}","milestones_url":"https://api.github.com/repos/rrahn/seqan3/milestones{/number}","notifications_url":"https://api.github.com/repos/rrahn/seqan3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rrahn/seqan3/labels{/name}","releases_url":"https://api.github.com/repos/rrahn/seqan3/releases{/id}","deployments_url":"https://api.github.com/repos/rrahn/seqan3/deployments","created_at":"2017-03-17T11:48:48Z","updated_at":"2017-03-15T02:18:16Z","pushed_at":"2018-04-18T10:07:38Z","git_url":"git://github.com/rrahn/seqan3.git","ssh_url":"git@github.com:rrahn/seqan3.git","clone_url":"https://github.com/rrahn/seqan3.git","svn_url":"https://github.com/rrahn/seqan3","homepage":"http://www.seqan.de","size":861,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"seqan:master","ref":"master","sha":"cbc3bac956251e862572bfe0ba7eaa1fd7643651","user":{"login":"seqan","id":1752144,"avatar_url":"https://avatars2.githubusercontent.com/u/1752144?v=4","gravatar_id":"","url":"https://api.github.com/users/seqan","html_url":"https://github.com/seqan","followers_url":"https://api.github.com/users/seqan/followers","following_url":"https://api.github.com/users/seqan/following{/other_user}","gists_url":"https://api.github.com/users/seqan/gists{/gist_id}","starred_url":"https://api.github.com/users/seqan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seqan/subscriptions","organizations_url":"https://api.github.com/users/seqan/orgs","repos_url":"https://api.github.com/users/seqan/repos","events_url":"https://api.github.com/users/seqan/events{/privacy}","received_events_url":"https://api.github.com/users/seqan/received_events","type":"Organization","site_admin":false},"repo":{"id":55410078,"name":"seqan3","full_name":"seqan/seqan3","owner":{"login":"seqan","id":1752144,"avatar_url":"https://avatars2.githubusercontent.com/u/1752144?v=4","gravatar_id":"","url":"https://api.github.com/users/seqan","html_url":"https://github.com/seqan","followers_url":"https://api.github.com/users/seqan/followers","following_url":"https://api.github.com/users/seqan/following{/other_user}","gists_url":"https://api.github.com/users/seqan/gists{/gist_id}","starred_url":"https://api.github.com/users/seqan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/seqan/subscriptions","organizations_url":"https://api.github.com/users/seqan/orgs","repos_url":"https://api.github.com/users/seqan/repos","events_url":"https://api.github.com/users/seqan/events{/privacy}","received_events_url":"https://api.github.com/users/seqan/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/seqan/seqan3","description":"The modern C++ library for sequence analysis. Contains version 3 of the library and API docs.","fork":false,"url":"https://api.github.com/repos/seqan/seqan3","forks_url":"https://api.github.com/repos/seqan/seqan3/forks","keys_url":"https://api.github.com/repos/seqan/seqan3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/seqan/seqan3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/seqan/seqan3/teams","hooks_url":"https://api.github.com/repos/seqan/seqan3/hooks","issue_events_url":"https://api.github.com/repos/seqan/seqan3/issues/events{/number}","events_url":"https://api.github.com/repos/seqan/seqan3/events","assignees_url":"https://api.github.com/repos/seqan/seqan3/assignees{/user}","branches_url":"https://api.github.com/repos/seqan/seqan3/branches{/branch}","tags_url":"https://api.github.com/repos/seqan/seqan3/tags","blobs_url":"https://api.github.com/repos/seqan/seqan3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/seqan/seqan3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/seqan/seqan3/git/refs{/sha}","trees_url":"https://api.github.com/repos/seqan/seqan3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/seqan/seqan3/statuses/{sha}","languages_url":"https://api.github.com/repos/seqan/seqan3/languages","stargazers_url":"https://api.github.com/repos/seqan/seqan3/stargazers","contributors_url":"https://api.github.com/repos/seqan/seqan3/contributors","subscribers_url":"https://api.github.com/repos/seqan/seqan3/subscribers","subscription_url":"https://api.github.com/repos/seqan/seqan3/subscription","commits_url":"https://api.github.com/repos/seqan/seqan3/commits{/sha}","git_commits_url":"https://api.github.com/repos/seqan/seqan3/git/commits{/sha}","comments_url":"https://api.github.com/repos/seqan/seqan3/comments{/number}","issue_comment_url":"https://api.github.com/repos/seqan/seqan3/issues/comments{/number}","contents_url":"https://api.github.com/repos/seqan/seqan3/contents/{+path}","compare_url":"https://api.github.com/repos/seqan/seqan3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/seqan/seqan3/merges","archive_url":"https://api.github.com/repos/seqan/seqan3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/seqan/seqan3/downloads","issues_url":"https://api.github.com/repos/seqan/seqan3/issues{/number}","pulls_url":"https://api.github.com/repos/seqan/seqan3/pulls{/number}","milestones_url":"https://api.github.com/repos/seqan/seqan3/milestones{/number}","notifications_url":"https://api.github.com/repos/seqan/seqan3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/seqan/seqan3/labels{/name}","releases_url":"https://api.github.com/repos/seqan/seqan3/releases{/id}","deployments_url":"https://api.github.com/repos/seqan/seqan3/deployments","created_at":"2016-04-04T12:39:15Z","updated_at":"2018-04-17T09:30:43Z","pushed_at":"2018-04-18T10:07:40Z","git_url":"git://github.com/seqan/seqan3.git","ssh_url":"git@github.com:seqan/seqan3.git","clone_url":"https://github.com/seqan/seqan3.git","svn_url":"https://github.com/seqan/seqan3","homepage":"http://www.seqan.de","size":725,"stargazers_count":26,"watchers_count":26,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":23,"mirror_url":null,"archived":false,"open_issues_count":67,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":23,"open_issues":67,"watchers":26,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/207"},"html":{"href":"https://github.com/seqan/seqan3/pull/207"},"issue":{"href":"https://api.github.com/repos/seqan/seqan3/issues/207"},"comments":{"href":"https://api.github.com/repos/seqan/seqan3/issues/207/comments"},"review_comments":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/207/comments"},"review_comment":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/seqan/seqan3/pulls/207/commits"},"statuses":{"href":"https://api.github.com/repos/seqan/seqan3/statuses/1e41d0045c180e42f8d7c9678652c4b6d5215987"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"joergi-w"}}