#!/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_langs(
    *,
    url: str,
    request_params: Dict[str, Union[str, int, bool]]
    ) -> Iterator[str]:

    with requests.Session() as session:
        langs = partial(
            langs_titles,
            session=session,
            url=url,
            **request_params)

        all_langs = langs(cmtitle='Category:Programming_Languages')
        for lang in all_langs:
            print(lang)


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

    """Yields langs 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__':
    langs = all_langs(
        url=URL,
        request_params=REQUEST_PARAMETERS)
