{subway} ← #.compile subway                     ⍝ Compile graph from ⍵.source.

[subway]  is  a reference to a namespace containing a character array: [source].
The  shy  result  is  a reference to the same namespace, which after compilation
contains two additional arrays:

    subway.graph    - nested array representing the network graph.
    subway.labels   - corresponding names of stations and subway-stops.

The  source  editing  function [ed] undoes the effect of compilation by removing
subway.(graph labels).

Technical notes:

This description uses →source← as an example. Try:

      ed notes          ⍝ ... to examine the source.

and trace:

      compile notes     ⍝ ... to watch it working.

The workings of the compiler can be split into four phases:

lex:      extracts line, station identifiers, and line restriction codes from
          the source;

extract:  represents these in terms of indices into vectors of lines, stations
          and platforms and the links between them.

merge:    consolidates the various sections network-wide.

install:  installs graph and label arrays into the target namespace.

Extensive use is made of two auxiliary functions [zip] and [cat].

    zip←{↓⍉↑⍵}      ⍝ transpose nested array.
    cat←{↑,/⍵}      ⍝ concatenate arrays.

See: →zip_cat← for details.

Lexical phase
-------------
The lexical phase results in parallel (having the same ⍴¨) nested vectors:

    lines - service names such as 'Circle' or 'Metro 1'.
    stats - station names: 'Paddington', 'Mælkevejen', ...
    ctrls - one-way '↓', fork '∊' or cross '+' control characters.

    lines stats ctrls←zip zip¨{         ⍝ first pass: source → line sections.
        vecs←{↓⎕FMT↑⍵}                  ⍝ normalise source to vector-of-vectors.
        rcom←{(∧\⍵≠'/')/⍵}              ⍝ remove comments '/ ···' from line.
        rbls←{(∨/¨' '≠⍵)/⍵}             ⍝ remove blanks lines: ''  '' ···
        segt←{(' '≠⊃¨⍵)⊂⍵}              ⍝ segment at non-blank first column.
        trim←{(∨\⍵≠' ')/⍵}{⌽⍺⍺⌽⍺⍺ ⍵}    ⍝ remove blanks, fore and aft.
        tupl←'+↓∊'{⍺(trim ⍵~⍺⍺)(⍺⍺∩⍵)}  ⍝ tupl: (line stat ctrl).
        tups←{(⊂trim⊃⍵)tupl¨1↓⍵}        ⍝ tuples: tupl tupl ···.
        tups¨segt rbls rcom¨vecs ⍵      ⍝ line segments.
    }⍵.source

Each but the last line defines a local function and the final line applies these
to  the  source  argument.  An  alternative  but more obscure coding would be to
replace  the names in the final line, with the definitions themselves, resulting
in a longish one-liner.

Of particular interest:

        vecs←{↓⎕FMT↑⍵}                  ⍝ normalise source to vector-of-vectors.

accepts  any  of: a character matrix, a nested vector of vectors, or a character
vector  with  embedded  line-feeds  and  returns an equivalent nested vector-of-
vectors. Notice also, the functions:

        trim←{(∨\⍵≠' ')/⍵}{⌽⍺⍺⌽⍺⍺ ⍵}    ⍝ remove blanks, fore and aft.

derived from function {(∨\⍵≠' ')/⍵}, bound with operator {⌽⍺⍺⌽⍺⍺ ⍵}. Note also:

        tupl←'+↓∊'{⍺(trim ⍵~⍺⍺)(⍺⍺∩⍵)}  ⍝ tupl: (line stat ctrl).

is  an  [array] '+↓∊', bound with an operator {⍺(trim ⍵~⍺⍺)(⍺⍺∩⍵)}. [tupl] could
have  been  defined  as  the  simple function {⍺(trim ⍵~'+↓∊')('+↓∊'∩⍵)}, at the
expense of duplicating the constant '+↓∊' or naming it in a separate definition.

Function  [tups] distributes the line label at the head (⊃⍵) of each section, to
each station in the remainer (1↓⍵).

          tups←{(⊂trim⊃⍵)tupl¨1↓⍵}      ⍝ tuples: tupl tupl ···.

An alternative, ⎕ML-independent, coding of (⊂trim⊃⍵), would be (trim¨1↑⍵).

Compiling →source←, we get:

          disp lines
    ┌→──────────────────┬─────────────────────────┬───────────────────────────────────────────┐
    │┌→────┬─────┬─────┐│┌→────┬─────┬─────┬─────┐│┌→─────┬──────┬──────┬──────┬──────┬──────┐│
    ││Fruit│Fruit│Fruit│││Fruit│Fruit│Fruit│Fruit│││Veggie│Veggie│Veggie│Veggie│Veggie│Veggie││
    │└────→┴────→┴────→┘│└────→┴────→┴────→┴────→┘│└─────→┴─────→┴─────→┴─────→┴─────→┴─────→┘│
    └──────────────────→┴────────────────────────→┴──────────────────────────────────────────→┘

          disp stats
    ┌→────────────────────┬─────────────────────────┬────────────────────────────────────────────┐
    │┌→────┬──────┬──────┐│┌→────┬──────┬────┬─────┐│┌→──────┬─────┬──────┬───────┬─────┬───────┐│
    ││Apple│Tomato│Banana│││Grape│Tomato│Pear│Grape│││Spinach│Onion│Tomato│Lettuce│Onion│Cabbage││
    │└────→┴─────→┴─────→┘│└────→┴─────→┴───→┴────→┘│└──────→┴────→┴─────→┴──────→┴────→┴──────→┘│
    └────────────────────→┴────────────────────────→┴───────────────────────────────────────────→┘

          disp ctrls
    ┌→──────┬──────────┬─────────────┐
    │┌→┬─┬─┐│┌→┬──┬─┬─┐│┌→┬─┬─┬─┬─┬─┐│
    ││ │∊│ │││↓│↓∊│↓│ │││ │+│ │ │+│ ││
    │└⊖┴→┴⊖┘│└→┴─→┴→┴⊖┘│└⊖┴→┴⊖┴⊖┴→┴⊖┘│
    └──────→┴─────────→┴────────────→┘

Extraction phase
----------------
This  phase generates various working arrays. A particular feature, the "cross",
is  processed  at this stage. Crosses occur where different sections of the same
line  criss-cross a station in different directions. An example is London Under-
ground's  station  at Poplar on the Docklands Light Railway (DLR). The coss stop
is  augmented with extra stops for each line direction. For example, the stop at
Poplar  (DLR  Poplar) is replaced with "virtual" stops (DLR Poplar_N-S) and (DLR
Poplar_E-W).  We do this by marking each stop with an additional label, which is
0 for non-crossing stops and a unique sequence number [csids] for crossing stat-
ions.  In  this  way, the stops remain disctinct in the unique stops vector (see
below).

          seqs←{(⍳¨⍵)+0,+\¯1↓⍵}             ⍝ sequences of sequences.
          csids←{⍵\¨seqs+/¨⍵}'+'∊¨¨ctrls    ⍝ stations marked as cross-tracks.

          disp ctrls
    ┌→──────┬──────────┬─────────────┐
    │┌→┬─┬─┐│┌→┬──┬─┬─┐│┌→┬─┬─┬─┬─┬─┐│
    ││ │∊│ │││↓│↓∊│↓│ │││ │+│ │ │+│ ││
    │└⊖┴→┴⊖┘│└→┴─→┴→┴⊖┘│└⊖┴→┴⊖┴⊖┴→┴⊖┘│
    └──────→┴─────────→┴────────────→┘

          disp csids
    ┌→────┬───────┬───────────┐
    │0 0 0│0 0 0 0│0 1 0 0 2 0│
    └~───→┴~─────→┴~─────────→┘

Next, define [stops], a vector of stops per line section.

          stops←zip¨zip lines stats csids       ⍝ subway stops.

Notice the distinct cross stops: (Veggie Onion 1), (Veggie Onion 2):

          disp stops
    ┌→──────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
    │┌→──────────────┬────────────────┬────────────────┐│┌→──────────────┬────────────────┬──────────────┬───────────────┐│┌→─────────────────┬────────────────┬─────────────────┬──────────────────┬────────────────┬──────────────────┐│
    ││┌→────┬─────┬─┐│┌→────┬──────┬─┐│┌→────┬──────┬─┐│││┌→────┬─────┬─┐│┌→────┬──────┬─┐│┌→────┬────┬─┐│┌→────┬─────┬─┐│││┌→─────┬───────┬─┐│┌→─────┬─────┬─┐│┌→─────┬──────┬─┐│┌→─────┬───────┬─┐│┌→─────┬─────┬─┐│┌→─────┬───────┬─┐││
    │││Fruit│Apple│0│││Fruit│Tomato│0│││Fruit│Banana│0│││││Fruit│Grape│0│││Fruit│Tomato│0│││Fruit│Pear│0│││Fruit│Grape│0│││││Veggie│Spinach│0│││Veggie│Onion│1│││Veggie│Tomato│0│││Veggie│Lettuce│0│││Veggie│Onion│2│││Veggie│Cabbage│0│││
    ││└────→┴────→┴─┘│└────→┴─────→┴─┘│└────→┴─────→┴─┘│││└────→┴────→┴─┘│└────→┴─────→┴─┘│└────→┴───→┴─┘│└────→┴────→┴─┘│││└─────→┴──────→┴─┘│└─────→┴────→┴─┘│└─────→┴─────→┴─┘│└─────→┴──────→┴─┘│└─────→┴────→┴─┘│└─────→┴──────→┴─┘││
    │└──────────────→┴───────────────→┴───────────────→┘│└──────────────→┴───────────────→┴─────────────→┴──────────────→┘│└─────────────────→┴───────────────→┴────────────────→┴─────────────────→┴───────────────→┴─────────────────→┘│
    └──────────────────────────────────────────────────→┴────────────────────────────────────────────────────────────────→┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────→┘

Most stops have a platform for each direction, the "up-line" '^', and the "down-
line" '∨'. The platform vectors come from the outer product: ···∘.,'^∨'. One-way
sections are processed later.

          plats←{↓⍵∘.,'^∨'}¨stops           ⍝ platform for each direction.

          disp plats
    ┌→──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
    │┌→────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────┐│┌→────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────┬─────────────────────────────────────┐│┌→──────────────────────────────────────────┬───────────────────────────────────────┬─────────────────────────────────────────┬───────────────────────────────────────────┬───────────────────────────────────────┬───────────────────────────────────────────┐│
    ││┌→────────────────┬─────────────────┐│┌→─────────────────┬──────────────────┐│┌→─────────────────┬──────────────────┐│││┌→────────────────┬─────────────────┐│┌→─────────────────┬──────────────────┐│┌→───────────────┬────────────────┐│┌→────────────────┬─────────────────┐│││┌→───────────────────┬────────────────────┐│┌→─────────────────┬──────────────────┐│┌→──────────────────┬───────────────────┐│┌→───────────────────┬────────────────────┐│┌→─────────────────┬──────────────────┐│┌→───────────────────┬────────────────────┐││
    │││┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│││┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│││┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│││││┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│││┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│││┌→────┬────┬─┬─┐│┌→────┬────┬─┬─┐│││┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│││││┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│││┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│││┌→─────┬──────┬─┬─┐│┌→─────┬──────┬─┬─┐│││┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│││┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│││┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│││
    ││││Fruit│Apple│0│^│││Fruit│Apple│0│∨│││││Fruit│Tomato│0│^│││Fruit│Tomato│0│∨│││││Fruit│Banana│0│^│││Fruit│Banana│0│∨│││││││Fruit│Grape│0│^│││Fruit│Grape│0│∨│││││Fruit│Tomato│0│^│││Fruit│Tomato│0│∨│││││Fruit│Pear│0│^│││Fruit│Pear│0│∨│││││Fruit│Grape│0│^│││Fruit│Grape│0│∨│││││││Veggie│Spinach│0│^│││Veggie│Spinach│0│∨│││││Veggie│Onion│1│^│││Veggie│Onion│1│∨│││││Veggie│Tomato│0│^│││Veggie│Tomato│0│∨│││││Veggie│Lettuce│0│^│││Veggie│Lettuce│0│∨│││││Veggie│Onion│2│^│││Veggie│Onion│2│∨│││││Veggie│Cabbage│0│^│││Veggie│Cabbage│0│∨││││
    │││└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│││└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│││└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│││││└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│││└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│││└────→┴───→┴─┴─┘│└────→┴───→┴─┴─┘│││└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│││││└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│││└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│││└─────→┴─────→┴─┴─┘│└─────→┴─────→┴─┴─┘│││└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│││└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│││└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│││
    ││└────────────────→┴────────────────→┘│└─────────────────→┴─────────────────→┘│└─────────────────→┴─────────────────→┘│││└────────────────→┴────────────────→┘│└─────────────────→┴─────────────────→┘│└───────────────→┴───────────────→┘│└────────────────→┴────────────────→┘│││└───────────────────→┴───────────────────→┘│└─────────────────→┴─────────────────→┘│└──────────────────→┴──────────────────→┘│└───────────────────→┴───────────────────→┘│└─────────────────→┴─────────────────→┘│└───────────────────→┴───────────────────→┘││
    │└────────────────────────────────────→┴──────────────────────────────────────→┴──────────────────────────────────────→┘│└────────────────────────────────────→┴──────────────────────────────────────→┴──────────────────────────────────→┴────────────────────────────────────→┘│└──────────────────────────────────────────→┴──────────────────────────────────────→┴────────────────────────────────────────→┴──────────────────────────────────────────→┴──────────────────────────────────────→┴──────────────────────────────────────────→┘│
    └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────→┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────→┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────→┘

We now have enough information to label all vertices (stations and platforms) of
the final graph.

          verts←∪cat cat¨stats(cat plats)   ⍝ graph vertices.

          disp verts
    ┌→────┬──────┬──────┬─────┬────┬───────┬─────┬───────┬───────┬─────────────────┬─────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬─────────────────┬─────────────────┬────────────────┬────────────────┬────────────────────┬────────────────────┬──────────────────┬──────────────────┬───────────────────┬───────────────────┬────────────────────┬────────────────────┬──────────────────┬──────────────────┬────────────────────┬────────────────────┐
    │     │      │      │     │    │       │     │       │       │┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬──────┬─┬─┐│┌→────┬─────┬─┬─┐│┌→────┬─────┬─┬─┐│┌→────┬────┬─┬─┐│┌→────┬────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬──────┬─┬─┐│┌→─────┬──────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬─────┬─┬─┐│┌→─────┬───────┬─┬─┐│┌→─────┬───────┬─┬─┐│
    │Apple│Tomato│Banana│Grape│Pear│Spinach│Onion│Lettuce│Cabbage││Fruit│Apple│0│^│││Fruit│Apple│0│∨│││Fruit│Tomato│0│^│││Fruit│Tomato│0│∨│││Fruit│Banana│0│^│││Fruit│Banana│0│∨│││Fruit│Grape│0│^│││Fruit│Grape│0│∨│││Fruit│Pear│0│^│││Fruit│Pear│0│∨│││Veggie│Spinach│0│^│││Veggie│Spinach│0│∨│││Veggie│Onion│1│^│││Veggie│Onion│1│∨│││Veggie│Tomato│0│^│││Veggie│Tomato│0│∨│││Veggie│Lettuce│0│^│││Veggie│Lettuce│0│∨│││Veggie│Onion│2│^│││Veggie│Onion│2│∨│││Veggie│Cabbage│0│^│││Veggie│Cabbage│0│∨││
    │     │      │      │     │    │       │     │       │       │└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴─────→┴─┴─┘│└────→┴────→┴─┴─┘│└────→┴────→┴─┴─┘│└────→┴───→┴─┴─┘│└────→┴───→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴─────→┴─┴─┘│└─────→┴─────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴────→┴─┴─┘│└─────→┴──────→┴─┴─┘│└─────→┴──────→┴─┴─┘│
    └────→┴─────→┴─────→┴────→┴───→┴──────→┴────→┴──────→┴──────→┴────────────────→┴────────────────→┴─────────────────→┴─────────────────→┴─────────────────→┴─────────────────→┴────────────────→┴────────────────→┴───────────────→┴───────────────→┴───────────────────→┴───────────────────→┴─────────────────→┴─────────────────→┴──────────────────→┴──────────────────→┴───────────────────→┴───────────────────→┴─────────────────→┴─────────────────→┴───────────────────→┴───────────────────→┘

Before the merging phase, we need vectors of graph-platform indices and pairs of
graph-station indices:

          platx←{↓verts⍳↑⍵}¨plats           ⍝ platform indices within graph.
          statx←{2/¨verts⍳⍵}¨stats          ⍝ station indices within graph.

          disp platx
    ┌→──────────────────┬─────────────────────────┬─────────────────────────────────────┐
    │┌→────┬─────┬─────┐│┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┬─────┬─────┬─────┐│
    ││10 11│12 13│14 15│││16 17│12 13│18 19│16 17│││20 21│22 23│24 25│26 27│28 29│30 31││
    │└~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘│
    └──────────────────→┴────────────────────────→┴────────────────────────────────────→┘

          disp statx
    ┌→────────────┬─────────────────┬─────────────────────────┐
    │┌→──┬───┬───┐│┌→──┬───┬───┬───┐│┌→──┬───┬───┬───┬───┬───┐│
    ││1 1│2 2│3 3│││4 4│2 2│5 5│4 4│││6 6│7 7│2 2│8 8│7 7│9 9││
    │└~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┴~─→┴~─→┘│
    └────────────→┴────────────────→┴────────────────────────→┘

It is convenient at this stage to extract a vector of unique line indices, which
will  be used later to collect the sections of each line. (Sections of track for
a particular line are not necessarily adjacent in the source code).

          linex←{(∪⍵)⍳⍵}⊃¨lines     ⍝ line indices per segment.

          disp linex
    1 1 2

Having accommodated cross-track restrictions, the merging phase is now interest-
ed only in one-way sections and forks, so an array of 2-bools is extracted:

          rests←'↓∊'∘∊¨¨ctrls       ⍝ restrictions: 1-way sects and forks.

          disp rests
    ┌→────────────┬─────────────────┬─────────────────────────┐
    │┌→──┬───┬───┐│┌→──┬───┬───┬───┐│┌→──┬───┬───┬───┬───┬───┐│
    ││0 0│0 1│0 0│││1 0│1 1│1 0│0 0│││0 0│0 0│0 0│0 0│0 0│0 0││
    │└~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┘│└~─→┴~─→┴~─→┴~─→┴~─→┴~─→┘│
    └────────────→┴────────────────→┴────────────────────────→┘

Merging phase
-------------
For  each  section of track, the stops are examined pair-wise, and links between
adjacent  stops  established.  The  links  take  account of one-way sections and
forks.

          plinks←cat¨2{             ⍝ platform-to-platform links / section.
              ···
          }/¨zip¨zip platx rests    ⍝ pairwise for each line section.

The expression (zip¨zip platx rests) produces a vector per line section of pairs
of platform indices and track restrictions. For the middle section (for example)
of the sample →source←:

    Source          Platx             Map
    ------          -----             ---
    ↓ Grape         16 - 17            T
   ∊↓ Tomato        12 - 13          ┌─┴─┐
    ↓ Pear          18 - 19          ↑   ↓
      Grape         16 - 17          │   │
                                     G─←─P

this looks like:

          disp 2⊃zip¨zip platx rests    ⍝ (middle section)
    ┌→──────────┬───────────┬───────────┬───────────┐
    │┌→────┬───┐│┌→────┬───┐│┌→────┬───┐│┌→────┬───┐│
    ││16 17│1 0│││12 13│1 1│││18 19│1 0│││16 17│0 0││
    │└~───→┴~─→┘│└~───→┴~─→┘│└~───→┴~─→┘│└~───→┴~─→┘│
    └──────────→┴──────────→┴──────────→┴──────────→┘

Platforms  16 and 17  at the first stop are at the entrance to a one-way section
as  are  platforms 12 and 13 in addition to being on the handle of a fork. Items
of the vector are processed two at a time, delivered as left and right arguments
to the the operand function:

          links((ow fk)_)←zip ⍺ ⍵       ⍝ directions and restrictions.
          rev←{⌽⍵}\                     ⍝ reverse second pair.
          oway←{⍺:1↑⍵ ⋄ rev ⍵}          ⍝ one-way section.
          fork←{⍺:⌽zip rev ⍵ ⋄ zip ⍵}   ⍝ fork.
          ow oway fk fork links         ⍝ ⍺←→⍵ links.

For the first call, the values of the arguments are:

          disp ⍺ ⍵
    ┌→──────────┬───────────┐
    │┌→────┬───┐│┌→────┬───┐│
    ││16 17│1 0│││12 13│1 1││
    │└~───→┴~─→┘│└~───→┴~─→┘│
    └──────────→┴──────────→┘

Notice the use of "structure assignment" to name parts of the link structure. As
restrictions  on only the entry side of the link are relevant, those on the exit
side are ignored by being assigned a "sink" name '_'.

          links((ow fk)_)←zip ⍺ ⍵       ⍝ directions and restrictions.

          disp links
    ┌→────┬─────┐
    │16 17│12 13│
    └~───→┴~───→┘

          disp ow fk                    ⍝ one-way and fork markers.
    1 0

Auxiliary function:

          rev←{⌽⍵}\                     ⍝ reverse second pair.

reverses  the  second link in a pair, to model up-line, down-line directions. In
this example, platforms 16→12, and 13→17, are linked.

          disp rev zip links
    ┌→────┬─────┐
    │16 12│13 17│
    └~───→┴~───→┘

Auxiliary functions: [oway] and [fork] apply corresponding line restrictions:

          oway←{⍺:1↑⍵ ⋄ rev ⍵}          ⍝ one-way section.
          fork←{⍺:⌽zip rev ⍵ ⋄ zip ⍵}   ⍝ fork.

so that expression:

          ow oway fk fork links         ⍝ ⍺←→⍵ links.

returns a vector of one or two links, in this case the single link 16→12:

          disp ow oway fk fork links
    ┌→────┐
    │16 12│
    └~───→┘

The  resulting  vector  [plinks]  is a set of platform-to-platform links for the
whole network.

          disp plinks
    ┌→────────────────────────┬───────────────────┬─────────────────────────────────────────────────────────────┐
    │┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┐│┌→────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐│
    ││10 12│13 11│13 14│15 12│││16 12│13 18│18 16│││20 22│23 21│22 24│25 23│24 26│27 25│26 28│29 27│28 30│31 29││
    │└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘│
    └────────────────────────→┴──────────────────→┴────────────────────────────────────────────────────────────→┘

Next,  using the line section index vector from above, line sections are grouped
by line prior to being consolidated.

          clinks←((∪linex)=⊂linex)/¨⊂plinks   ⍝ link sections collected by line.

          disp clinks
    ┌→──────────────────────────────────────────────┬───────────────────────────────────────────────────────────────┐
    │┌→────────────────────────┬───────────────────┐│┌→────────────────────────────────────────────────────────────┐│
    ││┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┐│││┌→────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐││
    │││10 12│13 11│13 14│15 12│││16 12│13 18│18 16│││││20 22│23 21│22 24│25 23│24 26│27 25│26 28│29 27│28 30│31 29│││
    ││└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┘│││└~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘││
    │└────────────────────────→┴──────────────────→┘│└────────────────────────────────────────────────────────────→┘│
    └──────────────────────────────────────────────→┴──────────────────────────────────────────────────────────────→┘

The  final  sub-phase  is  to  connect  all  sections for the same line. This is
achieved  by  applying a "connecting" reduction along the vector of sub-sections
for each line, after which we can concatenate all line sections, network-wide.

          llinks←cat↑{                  ⍝ connected sections for all lines.
              ···                       ⍝ (connect adjacent link vectors).
          }/¨clinks                     ⍝ for each section of each line.

However, connecting sections by just concatenating the vectors will not work, as
this  might  result  in  the up-line of one sub-section's being connected to the
down-line of its neighbour.

      ···───→───∘───→───∘─→ ? ←─∘───←───∘───←───···
                │       │       │       │
    Line A:     ⎕       ⎕       ⎕       ⎕     Line A:
                │       │       │       │
      ···───←───∘───←───∘─← ? →─∘───→───∘───→───···

In this case, we must twist the direction of links at the join.

      ···───→───∘───┐ ┌─∘─←───←─∘───←───∘───←───···
                │   ↓ ↓ │       │       │
    Line A:     ⎕ ┌─│─┘ ⎕       ⎕       ⎕     Line A:
                │ ↓ ↓   │       │       │
      ···───←───∘─┘ └─→─∘─→───→─∘───→───∘───→───···

For the first line of →source←, the two sub-sections are:

          disp ⊃clinks
    ┌→────────────────────────┬───────────────────┐
    │┌→────┬─────┬─────┬─────┐│┌→────┬─────┬─────┐│
    ││10 12│13 11│13 14│15 12│││16 12│13 18│18 16││
    │└~───→┴~───→┴~───→┴~───→┘│└~───→┴~───→┴~───→┘│
    └────────────────────────→┴──────────────────→┘

Notice that there are links: 10→12, 15→12 and 16→12, but no link [from] 12. In
this case there is a clash:

          llinks←cat↑{                  ⍝ connected sections for all lines.

          next←⍺~⍵                      ⍝ next section, duplicates removed.

          disp¨next ⍵
     ┌→────┬─────┬─────┬─────┐  ┌→────┬─────┬─────┐
     │10 12│13 11│13 14│15 12│  │16 12│13 18│18 16│
     └~───→┴~───→┴~───→┴~───→┘  └~───→┴~───→┴~───→┘

          clash←↑∪zip∩⌿↑zip¨next ⍵      ⍝ incompatible directions.

          disp clash
    13 12

We can avoid the clash if we exchange all occurrences of 13 and 12 in the first
set  of  links.  To  take  a  slightly larger example, when connecting London's
Picadilly line (as coded here), there are two clashes:

          disp next
    ┌→──────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
    │444 446│447 445│446 448│449 447│448 450│451 449│450 452│453 451│452 454│455 453│454 456│457 455│456 458│459 457│458 460│461 459│460 462│463 461│462 464│465 463│464 466│467 465│466 468│469 467│468 470│471 469│470 472│473 471│473 474│475 472│474 476│477 475│476 478│479 477│478 480│481 479│480 482│483 481│482 484│485 483│484 486│487 485│486 488│489 487│
    └~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┘

          disp ⍵
    ┌→──────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
    │490 488│489 492│492 490│494 496│497 495│496 498│499 497│498 500│501 499│500 502│503 501│502 504│505 503│504 506│507 505│506 508│509 507│508 510│511 509│510 512│513 511│512 514│515 513│514 516│517 515│516 518│519 517│518 520│521 519│520 522│523 521│522 524│525 523│524 526│527 525│526 528│529 527│528 530│531 529│530 532│533 531│532 534│535 533│534 536│537 535│536 538│539 537│538 540│541 539│540 542│543 541│542 544│545 543│544 546│547 545│546 472│473 547│
    └~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┴~─────→┘

          disp clash
    473 472
    489 488

          disp verts[clash]
    ┌→────────────────────────────┬─────────────────────────────┐
    ↓ ┌→─────────┬──────────┬─┬─┐ │ ┌→─────────┬──────────┬─┬─┐ │
    │ │Piccadilly│Acton Town│0│∨│ │ │Piccadilly│Acton Town│0│^│ │
    │ └─────────→┴─────────→┴─┴─┘ │ └─────────→┴─────────→┴─┴─┘ │
    ├────────────────────────────→┼────────────────────────────→┤
    │┌→─────────┬────────────┬─┬─┐│┌→─────────┬────────────┬─┬─┐│
    ││Piccadilly│Hatton Cross│0│∨│││Piccadilly│Hatton Cross│0│^││
    │└─────────→┴───────────→┴─┴─┘│└─────────→┴───────────→┴─┴─┘│
    └────────────────────────────→┴────────────────────────────→┘

We must exchange all occurrences of 472←→473 and 488←→489. To do this, we make a
difference matrix of the values to [add] to each index.

          diffs←⍉¯1 1∘.×-/clash         ⍝ vertex index differences.

          disp diffs
    ¯1 1
    ¯1 1

[avecs] is then, a vector of adjustments to add to the [next] section indices:

          avecs←↑+/,diffs×clash=⊂next   ⍝ adjustment vectors.

          disp avecs
    ┌→──┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┬────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┐
    │0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 1│¯1 0│¯1 0│0 1│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 0│0 1│¯1 0│
    └~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~──→┴~──→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~─→┴~──→┘

and  finally, the adjusted indices vector is joined to the right argument accum-
ulated link vector for the line.

          (next+avecs),⍵                ⍝ connected line subsections.

As  the  outer  function  reduction proceeds, all sub-sections for each line are
aligned and on exit from the reduction, sections for all lines are consolidated.

          llinks←cat↑{                  ⍝ connected sections for all lines.

For the →source← example, this results in:

          disp llinks
    ┌→────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
    │10 13│12 11│12 14│15 13│16 12│13 18│18 16│20 22│23 21│22 24│25 23│24 26│27 25│26 28│29 27│28 30│31 29│
    └~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┴~───→┘

Installation phase
------------------
In  this  phase,  the  final  [graph]  and [labels] vectors are installed in the
target namespace.

[slinks]  is  a  set  of links (stat plat) (stat plat) ···, from each station to
each of its platforms.

          slinks←cat zip¨zip cat¨statx platx    ⍝ (stat plat) ··· links.

          disp slinks
    ┌→───┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
    │1 10│1 11│2 12│2 13│3 14│3 15│4 16│4 17│2 12│2 13│5 18│5 19│4 16│4 17│6 20│6 21│7 22│7 23│2 24│2 25│8 26│8 27│7 28│7 29│9 30│9 31│
    └~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┘

[elinks] is a matrix with one row for links in each direction:

          elinks←,0 1∘.⌽slinks          ⍝ station-platform each-way links.

          disp elinks
    ┌→───┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
    ↓1 10│1 11│2 12│2 13│3 14│3 15│4 16│4 17│2 12│2 13│5 18│5 19│4 16│4 17│6 20│6 21│7 22│7 23│2 24│2 25│8 26│8 27│7 28│7 29│9 30│9 31│
    ├~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┼~──→┤
    │10 1│11 1│12 2│13 2│14 3│15 3│16 4│17 4│12 2│13 2│18 5│19 5│16 4│17 4│20 6│21 6│22 7│23 7│24 2│25 2│26 8│27 8│28 7│29 7│30 9│31 9│
    └~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┘

[nlinks] is the sorted set of unique links for the whole subway network.

          nlinks←{⍵[⍋↑⍵]}∪(,elinks),llinks      ⍝ combined network-wide links.

          disp nlinks
    ┌→───┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────┬────┬────┬─────┬─────┬────┬─────┬────┬────┬─────┬────┬─────┬────┬────┬─────┬────┬────┬─────┬────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬─────┬────┬────┬─────┐
    │1 10│1 11│2 12│2 13│2 24│2 25│3 14│3 15│4 16│4 17│5 18│5 19│6 20│6 21│7 22│7 23│7 28│7 29│8 26│8 27│9 30│9 31│10 1│10 13│11 1│12 2│12 11│12 14│13 2│13 18│14 3│15 3│15 13│16 4│16 12│17 4│18 5│18 16│19 5│20 6│20 22│21 6│22 7│22 24│23 7│23 21│24 2│24 26│25 2│25 23│26 8│26 28│27 8│27 25│28 7│28 30│29 7│29 27│30 9│31 9│31 29│
    └~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~───→┴~──→┴~──→┴~───→┴~───→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~───→┴~──→┴~──→┴~───→┘

Finally, [⍵.graph] is installed:

          ⍵.graph←↑{(⍺≠¯1⌽⍺)⊂⍵}/zip nlinks      ⍝ network graph.

The  first  item of each pair in [nlinks] determines the position within [graph]
of  the placement of the second item. So graph[1]←10, graph[1],←11, graph[2]←12,
and so on.

          disp ⍵.graph
    ┌→────┬───────────┬─────┬─────┬─────┬─────┬───────────┬─────┬─────┬────┬─┬───────┬────┬─┬────┬────┬─┬────┬─┬────┬─┬────┬────┬────┬────┬────┬────┬────┬────┬─┬────┐
    │10 11│12 13 24 25│14 15│16 17│18 19│20 21│22 23 28 29│26 27│30 31│1 13│1│2 11 14│2 18│3│3 13│4 12│4│5 16│5│6 22│6│7 24│7 21│2 26│2 23│8 28│8 25│7 30│7 27│9│9 29│
    └~───→┴~─────────→┴~───→┴~───→┴~───→┴~───→┴~─────────→┴~───→┴~───→┴~──→┴→┴~─────→┴~──→┴→┴~──→┴~──→┴→┴~──→┴→┴~──→┴→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴~──→┴→┴~──→┘

The  labels  (or tags) vector for each vertex is now produced. Firstly, a set of
labels for each stop:

          stags←2/⌽¨2↑¨∪cat stops               ⍝ (stop line) label pairs.

          disp stags
    ┌→────────────┬─────────────┬──────────────┬──────────────┬──────────────┬──────────────┬─────────────┬─────────────┬────────────┬────────────┬────────────────┬────────────────┬──────────────┬──────────────┬───────────────┬───────────────┬────────────────┬────────────────┬──────────────┬──────────────┬────────────────┬────────────────┐
    │┌→────┬─────┐│┌→────┬─────┐│┌→─────┬─────┐│┌→─────┬─────┐│┌→─────┬─────┐│┌→─────┬─────┐│┌→────┬─────┐│┌→────┬─────┐│┌→───┬─────┐│┌→───┬─────┐│┌→──────┬──────┐│┌→──────┬──────┐│┌→────┬──────┐│┌→────┬──────┐│┌→─────┬──────┐│┌→─────┬──────┐│┌→──────┬──────┐│┌→──────┬──────┐│┌→────┬──────┐│┌→────┬──────┐│┌→──────┬──────┐│┌→──────┬──────┐│
    ││Apple│Fruit│││Apple│Fruit│││Tomato│Fruit│││Tomato│Fruit│││Banana│Fruit│││Banana│Fruit│││Grape│Fruit│││Grape│Fruit│││Pear│Fruit│││Pear│Fruit│││Spinach│Veggie│││Spinach│Veggie│││Onion│Veggie│││Onion│Veggie│││Tomato│Veggie│││Tomato│Veggie│││Lettuce│Veggie│││Lettuce│Veggie│││Onion│Veggie│││Onion│Veggie│││Cabbage│Veggie│││Cabbage│Veggie││
    │└────→┴────→┘│└────→┴────→┘│└─────→┴────→┘│└─────→┴────→┘│└─────→┴────→┘│└─────→┴────→┘│└────→┴────→┘│└────→┴────→┘│└───→┴────→┘│└───→┴────→┘│└──────→┴─────→┘│└──────→┴─────→┘│└────→┴─────→┘│└────→┴─────→┘│└─────→┴─────→┘│└─────→┴─────→┘│└──────→┴─────→┘│└──────→┴─────→┘│└────→┴─────→┘│└────→┴─────→┘│└──────→┴─────→┘│└──────→┴─────→┘│
    └────────────→┴────────────→┴─────────────→┴─────────────→┴─────────────→┴─────────────→┴────────────→┴────────────→┴───────────→┴───────────→┴───────────────→┴───────────────→┴─────────────→┴─────────────→┴──────────────→┴──────────────→┴───────────────→┴───────────────→┴─────────────→┴─────────────→┴───────────────→┴───────────────→┘

Each label is merged with indentation '    ' and separation ' ' vectors. Incorp-
orating  the  blanks  at  this  stage, simpilfies the merging code in the [trip]
function, later.

          slabs←cat¨zip¨zip(⊂4 1↑¨⊂'')stags     ⍝ indented stop labels.

          disp slabs
    ┌→───────────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬────────────────────┬────────────────────┬───────────────────┬───────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
    │┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│
    ││    │Apple│ │Fruit│││    │Apple│ │Fruit│││    │Tomato│ │Fruit│││    │Tomato│ │Fruit│││    │Banana│ │Fruit│││    │Banana│ │Fruit│││    │Grape│ │Fruit│││    │Grape│ │Fruit│││    │Pear│ │Fruit│││    │Pear│ │Fruit│││    │Spinach│ │Veggie│││    │Spinach│ │Veggie│││    │Onion│ │Veggie│││    │Onion│ │Veggie│││    │Tomato│ │Veggie│││    │Tomato│ │Veggie│││    │Lettuce│ │Veggie│││    │Lettuce│ │Veggie│││    │Onion│ │Veggie│││    │Onion│ │Veggie│││    │Cabbage│ │Veggie│││    │Cabbage│ │Veggie││
    │└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│
    └───────────────────→┴───────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴───────────────────→┴───────────────────→┴──────────────────→┴──────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴─────────────────────→┴─────────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴──────────────────────→┴──────────────────────→┘

... prefaced by simple station labels.

          ⍵.labels←(∪cat stats),slabs           ⍝ station/stop labels.

          disp ⍵.labels
    ┌→────┬──────┬──────┬─────┬────┬───────┬─────┬───────┬───────┬────────────────────┬────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬─────────────────────┬────────────────────┬────────────────────┬───────────────────┬───────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┬───────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
    │     │      │      │     │    │       │     │       │       │┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬──────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬─────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬────┬─┬─────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬──────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬─────┬─┬──────┐│┌→───┬───────┬─┬──────┐│┌→───┬───────┬─┬──────┐│
    │Apple│Tomato│Banana│Grape│Pear│Spinach│Onion│Lettuce│Cabbage││    │Apple│ │Fruit│││    │Apple│ │Fruit│││    │Tomato│ │Fruit│││    │Tomato│ │Fruit│││    │Banana│ │Fruit│││    │Banana│ │Fruit│││    │Grape│ │Fruit│││    │Grape│ │Fruit│││    │Pear│ │Fruit│││    │Pear│ │Fruit│││    │Spinach│ │Veggie│││    │Spinach│ │Veggie│││    │Onion│ │Veggie│││    │Onion│ │Veggie│││    │Tomato│ │Veggie│││    │Tomato│ │Veggie│││    │Lettuce│ │Veggie│││    │Lettuce│ │Veggie│││    │Onion│ │Veggie│││    │Onion│ │Veggie│││    │Cabbage│ │Veggie│││    │Cabbage│ │Veggie││
    │     │      │      │     │    │       │     │       │       │└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴─────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴────→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴───→┴→┴────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴─────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│└───→┴──────→┴→┴─────→┘│
    └────→┴─────→┴─────→┴────→┴───→┴──────→┴────→┴──────→┴──────→┴───────────────────→┴───────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴────────────────────→┴───────────────────→┴───────────────────→┴──────────────────→┴──────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴─────────────────────→┴─────────────────────→┴──────────────────────→┴──────────────────────→┴────────────────────→┴────────────────────→┴──────────────────────→┴──────────────────────→┘

The target namespace is returned as a shy result for use by the [trip] function.

          1:shy←⍵                               ⍝ shy result: namespace ref.

See also: →trip← →path← →ed← →zip_cat←

Back to: contents