::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
method ENCODE.PHONE: Determine phone number encodings.
change Map..Heap..string :Dictionary map from number -> {code, ...}
entry Number string, &Original phone number for display.
Digit string, &Phone number digits before the prefix.
Encode string, &Encoded name so far.
Index word :Index past the the prefix.
exit Partial Bit :Set if any partial matches.
local Tail string, &Remaining digits to match
I word :Index past encoded digits,
:
:...............................................................................
Tail = chop( Digit, Index - 1 ); Remaining digits to match.
DO @Pair from Partial( $, Tail ): DO over partial matches to the digits,
DO Code from Pair`Tag: DO over code word encodings,
IF Encode$: IF any prior encoding,
Code = Encode$ ! " " ! Code; Add a code word.
.
I = Index + length( Pair`Key ); Index past digits consumed.
IF I > length( Digit ): IF all consumed,
PRINT Number ! ":", Code; Phone number with encoding
ELSE: ELSE more trailing digits,
ENCODE.PHONE $, Number, Digit, &Encode with trailing digits.
Code, I, Partial
IF Partial = 0: IF no encoding,
Code != " " ! string{ Digit, I }; Encode with lead digit.
IF I = length( Digit ): IF one last digit,
PRINT Number ! ":", Code; Phone numbers with encoding
ELSE: ELSE no full encoding,
ENCODE.PHONE $, Number, Digit, &Encode with a lead digit.
Code, I + 1, Partial
- . . .
Partial = 1; Exact encoding also covers partial.
-
return