#!/usr/bin/env python3

"""
from: https://codereview.stackexchange.com/q/213026
"""
from functools import partial
from operator import itemgetter
from typing import (
    Dict,
    Iterator,
    Union)

import requests

URL = 'http://www.rosettacode.org/w/api.php'
REQUEST_PARAMETERS = dict(
    action='query',
    list='categorymembers',
    cmlimit=1000,
    cmsort='timestamp',
    rawcontinue=True,
    format='json')


def all_tasks(
    *,
    url: str,
    request_params: Dict[str, Union[str, int, bool]]
    ) -> Iterator[str]:

    with requests.Session() as session:
        tasks = partial(
            tasks_titles,
            session=session,
            url=url,
            **request_params)

        all_tasks = tasks(cmtitle='Category:Programming_Tasks')
        for task in all_tasks:
            print(task)


def tasks_titles(
    *,
    session: requests.Session,
    url: str,
    **params: Union[str, int, bool]) -> Iterator[str]:

    """Yields tasks names for a specified category"""
    while True:
        request = session.get(url, params=params)
        data = request.json()
        yield from map(itemgetter('title'), data['query']['categorymembers'])
        query_continue = data.get('query-continue')
        if query_continue is None:
            return
        params.update(query_continue['categorymembers'])


if __name__ == '__main__':
    tasks = all_tasks(
        url=URL,
        request_params=REQUEST_PARAMETERS)
