Chapter 3. Ranges

In this chapter, we will investigate the concept of ranges, which is used throughout the D code. We'll look at the following recipes:

  • Using ranges when implementing an algorithm
  • Creating an input range
  • Creating an output range
  • Creating a higher-order range
  • Putting a range interface on a collection
  • Creating an input range over a tree structure
  • Using runtime polymorphic (class) ranges
  • Storing a range as a data member
  • Sorting ranges efficiently
  • Searching ranges
  • Using functional tools to query data

Introduction

This chapter goes into the details of an artefact central to the Phobos standard library with a little core language support: ranges. Ranges are user-defined objects used to build iterators over a collection of items. The collection may be pre-existing, such as an array, or it may be generated on the fly by the range object.

Ranges are defined in a way that they can be plugged together like building blocks with generic algorithms and other transformations. Command-line pipelines and range code can be very similar.

The Unix command-line command cat file.txt | sort | uniq can be expressed similarly in D, using ranges from std.stdio and std.algorithm and a helper function from std.range, as shown in the following code:

foreach(line; File("file.txt").byLine.map!(a=>a.idup).array.sort.uniq)
    writeln("Unique line: ", line);

Each range feeds into the next, building a system of generic building blocks that can be combined to perform a variety of tasks. In this chapter, we'll look at how to use ranges and how to create our own.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.131.38.14