I quite often run into a situation where I want to treat a list as a circular (repeating) list, and want to take a specific sublist of it, such as...

One past the end of the list:

    Append[#, First@#] & @ {a, b, c}

> {a, b, c, a}

An item preceding the list included:

    Prepend[#, Last@#] & @ {a, b, c}

> {c, a, b, c}

Three rounds of the circular list from the start:

    Join[#, #, #] & @ {a, b, c}

> {a, b, c, a, b, c, a, b, c}

Or even every second item on the list, for two rounds:

    Join[#, #][[;; ;; 2]] & @ {a, b, c}

> {a, c, b}

Obviously there are more of these where you can combine extended features of `Part` (the `[[` ... `]]` syntax) over circular lists.

What would be the most practical (short, clean, efficient, maybe even elegant) ways to do this, without writing one-off code every time such a small need arises?