sequence utilities #27
Aliases: sequence utilities, seq_utils, squ
23 verbs · 11 properties · 0 children
Verbs
| Verb | Spec | Flags | Definer | Lines |
|---|---|---|---|---|
add remove | this none this | rxd | #27 | 13 |
contains | this none this | rxd | #27 | 2 |
complement | this none this | rxd | #27 | 16 |
union | this none this | rxd | #27 | 8 |
tostr | this none this | rxd | #27 | 11 |
for | this none this | rxd | #27 | 27 |
extract | this none this | rxd | #27 | 15 |
tolist | this none this | rxd | #27 | 15 |
from_list | this none this | rxd | #27 | 2 |
from_sorted_list | this none this | rxd | #27 | 14 |
first | this none this | rxd | #27 | 1 |
last | this none this | rxd | #27 | 1 |
size | this none this | rxd | #27 | 8 |
from_string | this none this | rxd | #27 | 36 |
firstn | this none this | rxd | #27 | 15 |
lastn | this none this | rxd | #27 | 16 |
range | this none this | rxd | #27 | 2 |
expand | this none this | rxd | #27 | 60 |
contract | this none this | rxd | #27 | 44 |
_union | this none this | rxd | #27 | 97 |
intersection | this none this | rxd | #27 | 8 |
levenshtein | this none this | rxd | #27 | 23 |
random | this none this | rxd | #27 | 19 |
Properties
| Property | Definer | Flags | Owner | Value |
|---|---|---|---|---|
help_msg | #72 | rc | #29 | list of 38{"A sequence is a set of integers (*)", "This package supplies the following verbs:", "", " :add (seq,f,t) => seq with [f..t] interval added", " :remove (seq,f,t) => seq with [f..t] interval removed", " :range (f,t) => sequence corresponding to [f..t]", " {} => empty sequence", " :contains (seq,n) => n in seq", " :size (seq) => number of elements in seq", " :first (seq) => first integer in seq or E_NONE", " :firstn (seq,n) => first n integers in seq (as a sequence)", " :last (seq) => last integer in seq or E_NONE", " :lastn (seq,n) => last n integers in seq (as a sequence)", " :random (seq) => random element of seq", "", " :complement(seq) => sequence consisting of integers not in seq", " :union (seq,seq,...) => union of all sequences", " :intersect(seq,seq,...) => intersection of all sequences", " :contract (seq,cseq) (see `help $seq_utils:contract')", " :expand (seq,eseq[,include]) (see `help $seq_utils:expand')", " ", " :extract(seq,array) => array[@seq]", " :for([n,]seq,obj,verb,@args) => for s in (seq) obj:verb(s,@args); endfor", "", " :tolist(seq) => list corresponding to seq", " :tostr(seq) => contents of seq as a string", " :from_list(list) => sequence corresponding to list", " :from_sorted_list(list) => sequence corresponding to list (assumed sorted)", " :from_string(string) => sequence corresponding to string", "", "For boolean expressions, note that", " the representation of the empty sequence is {} (boolean FALSE) and", " all non-empty sequences are represented as nonempty lists (boolean TRUE).", "", "The representation used works better than the usual list implementation for sets consisting of long uninterrupted ranges of integers. ", "For sparse sets of integers the representation is decidedly non-optimal (though it never takes more than double the space of the usual list representation).", "", "(*) i.e., integers in the range [$minint+1..$maxint]. The implementation depends on $minint never being included in a sequence."} |
aliases | #1 | rc | #29 | {"sequence utilities", "seq_utils", "squ"} |
description | #1 | rc | #29 | {"This is the sequence utilities utility package. See `help $seq_utils' for more details."} |
object_size | #1 | r | #29 | {18857, 1298433815} |
hidden_verbs | #1 | rc | #29 | <clear> |
phelp_msg | #1 | rc | #29 | <clear> |
weight | #1 | rc | #29 | <clear> |
owner_verbs | #1 | rc | #29 | <clear> |
plural_name | #1 | rc | #29 | <clear> |
client_image | #1 | rc | #29 | <clear> |
listening | #1 | rc | #29 | <clear> |
Ancestry
Ancestors (nearest first): #72 Generic Utilities Package → #1 root
Children: none
Call graph
Source
add remove
Referenced by
- #9:from_msg_seq line 19:
$seq_utils:add - #9:%from_msg_seq line 20:
$seq_utils:add - #9:to_msg_seq line 19:
$seq_utils:add - #9:%to_msg_seq line 20:
$seq_utils:add - #9:subject_msg_seq line 14:
$seq_utils:add - #9:body_msg_seq line 14:
$seq_utils:add - #23:from_msg_seq line 16:
$seq_utils:add - #23:to_msg_seq line 15:
$seq_utils:add - #23:%to_msg_seq line 16:
$seq_utils:add - #33:expirable_msg_seq line 12:
$seq_utils:remove - #37:expire_old_messages line 10:
$seq_utils:remove - #38:parse_message_seq line 60:
$seq_utils:remove - #38:parse_message_seq line 62:
$seq_utils:remove - #38:parse_message_seq line 90:
$seq_utils:add - #38:parse_message_seq line 99:
$seq_utils:add - #38:parse_message_seq line 108:
$seq_utils:add - #38:parse_message_seq line 115:
$seq_utils:add - #38:parse_message_seq line 120:
$seq_utils:add - #38:parse_message_seq line 123:
$seq_utils:add - #38:parse_message_seq line 125:
$seq_utils:add - #38:parse_message_seq line 154:
$seq_utils:add - #38:from_msg_seq line 15:
$seq_utils:add - #38:%from_msg_seq line 16:
$seq_utils:add - #38:to_msg_seq line 15:
$seq_utils:add - #38:%to_msg_seq line 16:
$seq_utils:add - #38:subject_msg_seq line 11:
$seq_utils:add - #38:body_msg_seq line 12:
$seq_utils:add - #50:@mine line 15:
$seq_utils:add - #293:_pms line 62:
$seq_utils:remove - #293:_pms line 64:
$seq_utils:remove - #293:_pms line 92:
$seq_utils:add - #293:_pms line 101:
$seq_utils:add - #293:_pms line 110:
$seq_utils:add - #293:_pms line 117:
$seq_utils:add - #293:_pms line 122:
$seq_utils:add - #293:_pms line 125:
$seq_utils:add - #293:_pms line 127:
$seq_utils:add - #293:_pms line 156:
$seq_utils:add - #293:status_msg_seq line 32:
$seq_utils:add - #293:status_msg_seq line 35:
$seq_utils:add - #293:assigned_msg_seq line 18:
$seq_utils:add - #293:minvotes_msg_seq line 18:
$seq_utils:add - #293:comment_msg_seq line 11:
$seq_utils:add - #293:parse_message_seq line 70:
$seq_utils:remove - #293:parse_message_seq line 72:
$seq_utils:remove - #293:parse_message_seq line 128:
$seq_utils:add - #293:parse_message_seq line 137:
$seq_utils:add - #293:parse_message_seq line 146:
$seq_utils:add - #293:parse_message_seq line 153:
$seq_utils:add - #293:parse_message_seq line 158:
$seq_utils:add - #293:parse_message_seq line 161:
$seq_utils:add - #293:parse_message_seq line 163:
$seq_utils:add - #293:parse_message_seq line 204:
$seq_utils:add - #293:display_assigned_allfolders line 10:
$seq_utils:add - #293:unclosed_msg_seq_filter line 14:
$seq_utils:add - #293:pms_old line 70:
$seq_utils:remove - #293:pms_old line 72:
$seq_utils:remove - #293:pms_old line 128:
$seq_utils:add - #293:pms_old line 137:
$seq_utils:add - #293:pms_old line 146:
$seq_utils:add - #293:pms_old line 153:
$seq_utils:add - #293:pms_old line 158:
$seq_utils:add - #293:pms_old line 161:
$seq_utils:add - #293:pms_old line 163:
$seq_utils:add - #293:pms_old line 204:
$seq_utils:add
Source
1" add(seq,start[,end]) => seq with range added."; 2"remove(seq,start[,end]) => seq with range removed."; 3" both assume start<=end."; 4remove = verb == "remove"; 5seq = args[1]; 6start = args[2]; 7s = (start == $minint) ? 1 | $list_utils:find_insert(seq, start - 1); 8if (length(args) < 3) 9return {@seq[1..s - 1], @((s + remove) % 2) ? {start} | {}}; 10else 11e = $list_utils:find_insert(seq, after = args[3] + 1); 12return {@seq[1..s - 1], @((s + remove) % 2) ? {start} | {}, @((e + remove) % 2) ? {after} | {}, @seq[e..$]}; 13endif
contains
Referenced by
none
Source
1":contains(seq,elt) => true iff elt is in seq."; 2return ($list_utils:find_insert(@args) + 1) % 2;
complement
Referenced by
- #9:display_seq_headers line 9:
$seq_utils:complement - #27:intersection line 8:
this:complement - #38:display_seq_headers line 6:
$seq_utils:complement - #38:expunge_rmm line 28:
$seq_utils:complement - #38:keep_message_seq line 13:
$seq_utils:complement - #38:kept_msg_seq line 10:
$seq_utils:complement - #53:rm_current_news line 4:
$seq_utils:complement - #53:rm_news line 10:
$seq_utils:complement
Source
1":complement(seq[,lower[,upper]]) => the sequence containing all integers *not* in seq."; 2"If lower/upper are given, the resulting sequence is restricted to the specified range."; 3"Bad things happen if seq is not a subset of [lower..upper]"; 4{seq, ?lower = $minint, ?upper = $nothing} = args; 5if (upper != $nothing) 6if (seq[$] >= (upper = upper + 1)) 7seq[$..$] = {}; 8else 9seq[$ + 1..$] = {upper}; 10endif 11endif 12if (seq && (seq[1] <= lower)) 13return listdelete(seq, 1); 14else 15return {lower, @seq}; 16endif
union
Referenced by
- #9:undo_rmm line 23:
$seq_utils:union - #27:from_string line 36:
this:union - #38:undo_rmm line 24:
$seq_utils:union - #38:parse_message_seq line 82:
$seq_utils:union - #38:parse_message_seq line 139:
$seq_utils:union - #38:parse_message_seq line 151:
$seq_utils:union - #38:parse_message_seq line 161:
$seq_utils:union - #38:parse_message_seq line 165:
$seq_utils:union - #38:keep_message_seq line 12:
$seq_utils:union - #50:@list*# line 39:
$seq_utils:union - #53:undo_rmm line 5:
$seq_utils:union - #53:add_current_news line 4:
$seq_utils:union - #53:add_news line 10:
$seq_utils:union - #293:_pms line 84:
$seq_utils:union - #293:_pms line 141:
$seq_utils:union - #293:_pms line 153:
$seq_utils:union - #293:_pms line 163:
$seq_utils:union - #293:_pms line 167:
$seq_utils:union - #293:parse_message_seq line 119:
$seq_utils:union - #293:parse_message_seq line 178:
$seq_utils:union - #293:parse_message_seq line 196:
$seq_utils:union - #293:parse_message_seq line 212:
$seq_utils:union - #293:parse_message_seq line 225:
$seq_utils:union - #293:pms_old line 119:
$seq_utils:union - #293:pms_old line 178:
$seq_utils:union - #293:pms_old line 196:
$seq_utils:union - #293:pms_old line 212:
$seq_utils:union - #293:pms_old line 225:
$seq_utils:union
Source
1":union(seq1,seq2,...) => union of all sequences..."; 2if ({} in args) 3args = $list_utils:setremove_all(args, {}); 4endif 5if (length(args) <= 1) 6return args ? args[1] | {}; 7endif 8return this:_union(@args);
tostr
Referenced by
- #9:rm_message_seq line 33:
$seq_utils:tostr - #38:rm_message_seq line 29:
$seq_utils:tostr - #38:keep_message_seq line 23:
$seq_utils:tostr - #38:msg_seq_to_msg_num_string line 3:
$seq_utils:tostr
Source
1"tostr(seq [,delimiter]) -- turns a sequence into a string, delimiting ranges with delimiter, defaulting to .. (e.g. 5..7)"; 2{seq, ?separator = ".."} = args; 3if (!seq) 4return "empty"; 5endif 6e = tostr((seq[1] == $minint) ? "" | seq[1]); 7len = length(seq); 8for i in [2..len] 9e = e + ((i % 2) ? tostr(", ", seq[i]) | ((seq[i] == (seq[i - 1] + 1)) ? "" | tostr(separator, seq[i] - 1))); 10endfor 11return e + ((len % 2) ? separator | "");
for
Referenced by
none
Source
1":for([n,]seq,obj,verb,@args) => for s in (seq) obj:verb(s,@args); endfor"; 2set_task_perms(caller_perms()); 3if (typeof(n = args[1]) == INT) 4args = listdelete(args, 1); 5else 6n = 1; 7endif 8{seq, object, vname, @args} = args; 9if (seq[1] == $minint) 10return E_RANGE; 11endif 12for r in [1..length(seq) / 2] 13for i in [seq[(2 * r) - 1]..seq[2 * r] - 1] 14if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR) 15return; 16endif 17endfor 18endfor 19if (length(seq) % 2) 20i = seq[$]; 21while (1) 22if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR) 23return; 24endif 25i = i + 1; 26endwhile 27endif
extract
Referenced by
- #38:messages_in_seq line 8:
$seq_utils:extract
Source
1"extract(seq,array) => list of elements of array with indices in seq."; 2{seq, array} = args; 3if (alen = length(array)) 4e = $list_utils:find_insert(seq, 1); 5s = $list_utils:find_insert(seq, alen); 6seq = {@(e % 2) ? {} | {1}, @seq[e..s - 1], @(s % 2) ? {} | {alen + 1}}; 7ret = {}; 8for i in [1..length(seq) / 2] 9$command_utils:suspend_if_needed(0); 10ret = {@ret, @array[seq[(2 * i) - 1]..seq[2 * i] - 1]}; 11endfor 12return ret; 13else 14return {}; 15endif
tolist
Referenced by
- #293:add_log line 2:
$seq_utils:tolist - #293:update_vote line 5:
$seq_utils:tolist - #293:update_type line 8:
$seq_utils:tolist - #293:do_combine line 10:
$seq_utils:tolist - #293:_add_to_report line 3:
$seq_utils:tolist
Source
1seq = args[1]; 2if (!seq) 3return {}; 4else 5if (length(seq) % 2) 6seq = {@seq, $minint}; 7endif 8l = {}; 9for i in [1..length(seq) / 2] 10for j in [seq[(2 * i) - 1]..seq[2 * i] - 1] 11l = {@l, j}; 12endfor 13endfor 14return l; 15endif
from_list
Referenced by
- #38:msg_seq_to_msg_num_string line 3:
$seq_utils:from_list
Source
1":fromlist(list) => corresponding sequence."; 2return this:from_sorted_list($list_utils:sort(args[1]));
from_sorted_list
Referenced by
- #27:from_list line 2:
this:from_sorted_list - #293:jdn_msg_seq line 13:
$seq_utils:from_sorted_list
Source
1":from_sorted_list(sorted_list) => corresponding sequence."; 2if (!(lst = args[1])) 3return {}; 4else 5seq = {i = lst[1]}; 6next = i + 1; 7for i in (listdelete(lst, 1)) 8if (i != next) 9seq = {@seq, next, i}; 10endif 11next = i + 1; 12endfor 13return (next == $minint) ? seq | {@seq, next}; 14endif
first
Referenced by
- #33:@unread line 5:
$seq_utils:first
Source
1return (seq = args[1]) ? seq[1] | E_NONE;
last
Referenced by
- #38:expunge_rmm line 28:
$seq_utils:last - #53:set_current_news line 6:
$seq_utils:last
Source
1return (seq = args[1]) ? (length(seq) % 2) ? $minint - 1 | (seq[$] - 1) | E_NONE;
size
Referenced by
- #2:@answer line 13:
$seq_utils:size - #33:@mail line 7:
$seq_utils:size - #33:@read line 12:
$seq_utils:size - #33:@rmm*ail line 15:
$seq_utils:size - #33:@unrmm*ail line 21:
$seq_utils:size - #33:@forward line 6:
$seq_utils:size - #33:@netforw*ard line 15:
$seq_utils:size - #33:@keep-m*ail line 33:
$seq_utils:size - #33:@resend line 9:
$seq_utils:size - #33:@refile line 26:
$seq_utils:size - #33:@quickr*eply line 7:
$seq_utils:size - #33:@mail-all-new*-mail line 16:
$seq_utils:size - #33:@read-all-new*-mail line 21:
$seq_utils:size - #37:folder_and_message line 2:
$seq_utils:size - #37:folder_and_message_and_subject line 2:
$seq_utils:size - #43:y*ank line 11:
$seq_utils:size - #293:_@comment line 14:
$seq_utils:size - #293:_@vote line 12:
$seq_utils:size - #293:_@type line 16:
$seq_utils:size - #293:_@type line 70:
$seq_utils:size - #293:_@assign line 21:
$seq_utils:size - #293:_@combine line 20:
$seq_utils:size - #293:do_retitle line 2:
$seq_utils:size - #293:_@retitle line 11:
$seq_utils:size - #293:_@annotate line 10:
$seq_utils:size - #293:_@attach line 3:
$seq_utils:size - #293:_@mailban line 11:
$seq_utils:size - #293:_@commentban line 6:
$seq_utils:size
Source
1":size(seq) => number of elements in seq"; 2" for sequences consisting of more than half of the 4294967298 available integers, this returns a negative number, which can either be interpreted as (cardinality - 4294967298) or -(size of complement sequence)"; 3n = 0; 4for i in (seq = args[1]) 5yield; 6n = i - n; 7endfor 8return (length(seq) % 2) ? $minint - n | n;
from_string
Referenced by
- #50:@list*# line 35:
$seq_utils:from_string
Source
1":from_string(string) => corresponding sequence or E_INVARG"; 2" string should be a comma separated list of numbers and"; 3" number..number ranges"; 4su = $string_utils; 5if (!(words = su:explode(su:strip_chars(args[1], " "), ","))) 6return {}; 7endif 8parts = {}; 9for word in (words) 10to = index(word, ".."); 11if ((!to) && su:is_numeric(word)) 12part = {toint(word), toint(word) + 1}; 13elseif (to) 14if (to == 1) 15start = $minint; 16elseif (su:is_numeric(start = word[1..to - 1])) 17start = toint(start); 18else 19return E_INVARG; 20endif 21end = word[to + 2..length(word)]; 22if (!end) 23part = {start}; 24elseif (!su:is_numeric(end)) 25return E_INVARG; 26elseif ((end = toint(end)) >= start) 27part = {start, end + 1}; 28else 29part = {}; 30endif 31else 32return E_INVARG; 33endif 34parts = {@parts, part}; 35endfor 36return this:union(@parts);
firstn
Referenced by
none
Source
1":firstn(seq,n) => first n elements of seq as a sequence."; 2if ((n = args[2]) <= 0) 3return {}; 4endif 5l = length(seq = args[1]); 6s = 1; 7while (s <= l) 8n = n + seq[s]; 9if ((s >= l) || (n <= seq[s + 1])) 10return {@seq[1..s], n}; 11endif 12n = n - seq[s + 1]; 13s = s + 2; 14endwhile 15return seq;
lastn
Referenced by
none
Source
1":lastn(seq,n) => last n elements of seq as a sequence."; 2n = args[2]; 3if ((l = length(seq = args[1])) % 2) 4return {$minint - n}; 5else 6s = l; 7while (s) 8n = seq[s] - n; 9if (n >= seq[s - 1]) 10return {n, @seq[s..l]}; 11endif 12n = seq[s - 1] - n; 13s = s - 2; 14endwhile 15return seq; 16endif
range
Referenced by
- #33:@mail-all-new*-mail line 14:
$seq_utils:range - #33:@read-all-new*-mail line 19:
$seq_utils:range - #38:kept_msg_seq line 10:
$seq_utils:range - #53:init_for_core line 3:
$seq_utils:range
Source
1":range(start,end) => sequence corresponding to [start..end] range"; 2return ((start = args[1]) <= (end = args[2])) ? {start, end + 1} | {};
expand
Referenced by
- #9:undo_rmm line 23:
$seq_utils:expand - #38:undo_rmm line 24:
$seq_utils:expand - #53:undo_rmm line 5:
$seq_utils:expand
Source
1":expand(seq,eseq[,include=0])"; 2"eseq is assumed to be a finite sequence consisting of intervals "; 3"[f1..a1-1],[f2..a2-1],... We map each element i of seq to"; 4" i if i < f1"; 5" i+(a1-f1) if f1 <= i < f2-(a1-f1)"; 6" i+(a1-f1+a2-f2) if f2-(a1-f1) <= i < f3-(a2-f2)-(a1-f1)"; 7" ..."; 8"returning the resulting sequence if include=0,"; 9"returning the resulting sequence unioned with eseq if include=1;"; 10{old, insert, ?include = 0} = args; 11exclude = !include; 12if (!insert) 13return old; 14elseif ((length(insert) % 2) || (insert[1] == $minint)) 15return E_TYPE; 16endif 17olast = length(old); 18ilast = length(insert); 19"... find first o for which old[o] >= insert[1]..."; 20ifirst = insert[i = 1]; 21o = $list_utils:find_insert(old, ifirst - 1); 22if (o > olast) 23return ((olast % 2) == exclude) ? {@old, @insert} | old; 24endif 25new = old[1..o - 1]; 26oe = old[o]; 27diff = 0; 28while (1) 29"INVARIANT: oe == old[o]+diff"; 30"INVARIANT: oe >= ifirst == insert[i]"; 31"... at this point we need to dispose of the interval ifirst..insert[i+1]"; 32if (oe == ifirst) 33new = {@new, insert[i + ((o % 2) == exclude)]}; 34if (o >= olast) 35return ((olast % 2) == exclude) ? {@new, @insert[i + 2..ilast]} | new; 36endif 37o = o + 1; 38else 39if ((o % 2) != exclude) 40new = {@new, @insert[i..i + 1]}; 41endif 42endif 43"... advance i..."; 44diff = (diff + insert[i + 1]) - ifirst; 45if ((i = i + 2) > ilast) 46for oe in (old[o..olast]) 47new = {@new, oe + diff}; 48endfor 49return new; 50endif 51ifirst = insert[i]; 52"... find next o for which old[o]+diff >= ifirst )..."; 53while ((oe = old[o] + diff) < ifirst) 54new = {@new, oe}; 55if (o >= olast) 56return ((olast % 2) == exclude) ? {@new, @insert[i..ilast]} | new; 57endif 58o = o + 1; 59endwhile 60endwhile
contract
Referenced by
- #9:display_seq_headers line 9:
$seq_utils:contract - #9:rm_message_seq line 24:
$seq_utils:contract - #38:display_seq_headers line 6:
$seq_utils:contract - #38:rm_message_seq line 21:
$seq_utils:contract - #38:expunge_rmm line 28:
$seq_utils:contract - #53:rm_message_seq line 4:
$seq_utils:contract
Source
1":contract(seq,cseq)"; 2"cseq is assumed to be a finite sequence consisting of intervals "; 3"[f1..a1-1],[f2..a2-1],... From seq, we remove any elements that "; 4"are in those ranges and map each remaining element i to"; 5" i if i < f1"; 6" i-(a1-f1) if a1 <= i < f2"; 7" i-(a1-f1+a2-f2) if a2 <= i < f3 ..."; 8"returning the resulting sequence."; 9""; 10"For any finite sequence cseq, the following always holds:"; 11" :contract(:expand(seq,cseq,include),cseq)==seq"; 12{old, removed} = args; 13if (!removed) 14return old; 15elseif (((rlen = length(removed)) % 2) || (removed[1] == $minint)) 16return E_TYPE; 17endif 18rfirst = removed[1]; 19ofirst = $list_utils:find_insert(old, rfirst - 1); 20new = old[1..ofirst - 1]; 21diff = 0; 22rafter = removed[r = 2]; 23for o in [ofirst..olast = length(old)] 24while (old[o] > rafter) 25if ((o - ofirst) % 2) 26new = {@new, rfirst - diff}; 27ofirst = o; 28endif 29diff = (diff + rafter) - rfirst; 30if (r >= rlen) 31for oe in (old[o..olast]) 32new = {@new, oe - diff}; 33endfor 34return new; 35endif 36rfirst = removed[r + 1]; 37rafter = removed[r = r + 2]; 38endwhile 39if (old[o] < rfirst) 40new = {@new, old[o] - diff}; 41ofirst = o + 1; 42endif 43endfor 44return ((olast - ofirst) % 2) ? new | {@new, rfirst - diff};
_union
Referenced by
- #27:union line 8:
this:_union - #27:intersection line 8:
this:_union
Source
1":_union(seq,seq,...)"; 2"assumes all seqs are nonempty and that there are at least 2"; 3nargs = length(args); 4"args -- list of sequences."; 5"nexts -- nexts[i] is the index in args[i] of the start of the first"; 6" interval not yet incorporated in the return sequence."; 7"heap -- a binary tree of indices into args/nexts represented as a list where"; 8" heap[1] is the root and the left and right children of heap[i]"; 9" are heap[2*i] and heap[2*i+1] respectively. "; 10" Parent index h is <= both children in the sense of args[h][nexts[h]]."; 11" heap[i]==0 indicates a nonexistant child; we fill out the array with"; 12" zeros so that length(heap)>2*length(args)."; 13"...initialize heap..."; 14heap = {0, 0, 0, 0, 0}; 15nexts = {1, 1}; 16hlen2 = 2; 17while (hlen2 < nargs) 18nexts = {@nexts, @nexts}; 19heap = {@heap, @heap}; 20hlen2 = hlen2 * 2; 21endwhile 22for n in [-nargs..-1] 23s1 = args[i = -n][1]; 24while ((hleft = heap[2 * i]) && (s1 > (m = min(la = args[hleft][1], (hright = heap[(2 * i) + 1]) ? args[hright][1] | $maxint)))) 25if (m == la) 26heap[i] = hleft; 27i = 2 * i; 28else 29heap[i] = hright; 30i = (2 * i) + 1; 31endif 32endwhile 33heap[i] = -n; 34endfor 35"..."; 36"...find first interval..."; 37h = heap[1]; 38rseq = {args[h][1]}; 39if (length(args[h]) < 2) 40return rseq; 41endif 42current_end = args[h][2]; 43nexts[h] = 3; 44"..."; 45while (1) 46if (length(args[h]) >= nexts[h]) 47"...this sequence has some more intervals in it..."; 48else 49"...no more intevals left in this sequence, grab another..."; 50h = heap[1] = heap[nargs]; 51heap[nargs] = 0; 52if ((nargs = nargs - 1) > 1) 53elseif (args[h][nexts[h]] > current_end) 54return {@rseq, current_end, @args[h][nexts[h]..$]}; 55elseif ((i = $list_utils:find_insert(args[h], current_end)) % 2) 56return {@rseq, current_end, @args[h][i..$]}; 57else 58return {@rseq, @args[h][i..$]}; 59endif 60endif 61"..."; 62"...sink the top sequence..."; 63i = 1; 64first = args[h][nexts[h]]; 65while ((hleft = heap[2 * i]) && (first > (m = min(la = args[hleft][nexts[hleft]], (hright = heap[(2 * i) + 1]) ? args[hright][nexts[hright]] | $maxint)))) 66if (m == la) 67heap[i] = hleft; 68i = 2 * i; 69else 70heap[i] = hright; 71i = (2 * i) + 1; 72endif 73endwhile 74heap[i] = h; 75"..."; 76"...check new top sequence ..."; 77if (args[h = heap[1]][nexts[h]] > current_end) 78"...hey, a new interval! ..."; 79rseq = {@rseq, current_end, args[h][nexts[h]]}; 80if (length(args[h]) <= nexts[h]) 81return rseq; 82endif 83current_end = args[h][nexts[h] + 1]; 84nexts[h] = nexts[h] + 2; 85else 86"...first interval overlaps with current one ..."; 87i = $list_utils:find_insert(args[h], current_end); 88if (i % 2) 89nexts[h] = i; 90elseif (i > length(args[h])) 91return rseq; 92else 93current_end = args[h][i]; 94nexts[h] = i + 1; 95endif 96endif 97endwhile
intersection
Referenced by
- #6:news line 30:
$seq_utils:intersection - #9:rm_message_seq line 23:
$seq_utils:intersection - #38:rm_message_seq line 19:
$seq_utils:intersection - #38:keep_message_seq line 13:
$seq_utils:intersection - #38:kept_msg_seq line 8:
$seq_utils:intersection - #38:kept_msg_seq line 10:
$seq_utils:intersection - #50:@list*# line 118:
$seq_utils:intersection - #53:rm_message_seq line 3:
$seq_utils:intersection - #53:rm_current_news line 4:
$seq_utils:intersection - #53:rm_news line 10:
$seq_utils:intersection
Source
1":intersection(seq1,seq2,...) => intersection of all sequences..."; 2if ((U = {$minint}) in args) 3args = $list_utils:setremove_all(args, U); 4endif 5if (length(args) <= 1) 6return args ? args[1] | U; 7endif 8return this:complement(this:_union(@$list_utils:map_arg(this, "complement", args)));
levenshtein
Referenced by
none
Source
1":levenshtein(from, to) => Calculate the Levelshtein distance between 'from' and 'to', each of which must either be a list or a string. Note: may call suspend()."; 2{from, to} = args; 3m = length(from); 4n = length(to); 5d = $lu:make(m + 1, $lu:make(n + 1)); 6for i in [1..m + 1] 7d[i][1] = i - 1; 8endfor 9for j in [1..n + 1] 10d[1][j] = j - 1; 11endfor 12for i in [1..m] 13for j in [1..n] 14if (from[i] == to[j]) 15cost = 0; 16else 17cost = 1; 18endif 19d[i + 1][j + 1] = min(d[i][j + 1] + 1, d[i + 1][j] + 1, d[i][j] + cost); 20endfor 21$cu:sin(); 22endfor 23return d[m + 1][n + 1];
random
Referenced by
- #293:parse_message_seq line 180:
$seq_utils:random - #293:parse_message_seq line 198:
$seq_utils:random - #293:parse_message_seq line 214:
$seq_utils:random - #293:parse_message_seq line 234:
$seq_utils:random - #293:pms_old line 180:
$seq_utils:random - #293:pms_old line 198:
$seq_utils:random - #293:pms_old line 214:
$seq_utils:random - #293:pms_old line 234:
$seq_utils:random
Source
1":random(seq) => INT randomly selected from seq."; 2seq = args[1]; 3if (!seq) 4raise(E_INVARG); 5endif 6if (length(seq) % 2) 7seq = {@seq, $minint}; 8endif 9intervals = {}; 10for i in [1..length(seq) / 2] 11yield; 12ivl = {seq[(2 * i) - 1], seq[2 * i]}; 13len = ivl[2] - ivl[1]; 14intervals = {@intervals, {len, ivl}}; 15endfor 16chosen_ivl = $ru:weighted_random(@intervals); 17chosen_len = chosen_ivl[2] - chosen_ivl[1]; 18result = chosen_ivl[1] + (random(chosen_len) - 1); 19return result;