imapfilter/src/set.lua
Lefteris Chatzimparmpas 2cafede975 Use session pointer to denote accounts
Instead of the account details, a pointer to the C structure is used in
Lua, stored as light userdata.

The 1.x deprecated configuration format has been removed, partly due to
the above change, and partly because it has been included for long
enough now.
2012-02-14 22:13:15 +01:00

653 lines
15 KiB
Lua

-- A simple implementation of sets.
Set = {}
Set._mt = {}
setmetatable(Set, Set._mt)
function Set._new(self, values)
local object
object = values or {}
object._type = 'set'
for key, value in pairs(Set) do
if type(value) == 'function' then object[key] = value end
end
object._mt = {}
object._mt.__add = object._union
object._mt.__mul = object._intersection
object._mt.__sub = object._difference
setmetatable(object, object._mt)
return object
end
function Set._union(seta, setb)
local set = Set()
local t = {}
for _, v in ipairs(seta) do
b, m = table.unpack(v)
if not t[b] then t[b] = {} end
t[b][m] = true
end
for _, v in ipairs(setb) do
b, m = table.unpack(v)
if not t[b] then t[b] = {} end
t[b][m] = true
end
for b in pairs(t) do
for m in pairs(t[b]) do table.insert(set, { b, m }) end
end
return set
end
function Set._intersection(seta, setb)
local set = Set()
local ta = {}
local tb = {}
for _, v in ipairs(seta) do
b, m = table.unpack(v)
if not ta[b] then ta[b] = {} end
ta[b][m] = true
end
for _, v in ipairs(setb) do
b, m = table.unpack(v)
if not tb[b] then tb[b] = {} end
tb[b][m] = true
end
for b in pairs(ta) do
if tb[b] then
for m in pairs(ta[b]) do
if tb[b][m] then table.insert(set, { b, m }) end
end
end
end
return set
end
function Set._difference(seta, setb)
local set = Set()
local t = {}
for _, v in ipairs(seta) do
b, m = table.unpack(v)
if not t[b] then t[b] = {} end
t[b][m] = true
end
for _, v in ipairs(setb) do
b, m = table.unpack(v)
if t[b] then t[b][m] = nil end
end
for b in pairs(t) do
for m in pairs(t[b]) do table.insert(set, { b, m }) end
end
return set
end
function Set.add_flags(self, flags)
_check_required(flags, 'table')
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.add_flags(mbox, flags, self) then r = false end
end
return r
end
function Set.remove_flags(self, flags)
_check_required(flags, 'table')
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.remove_flags(mbox, flags, self) then r = false end
end
return r
end
function Set.replace_flags(self, flags)
_check_required(flags, 'table')
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.replace_flags(mbox, flags, self) then r = false end
end
return r
end
function Set.mark_answered(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.mark_answered(mbox, self) then r = false end
end
return r
end
function Set.mark_deleted(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.mark_deleted(mbox, self) then r = false end
end
return r
end
function Set.mark_draft(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.mark_draft(mbox, self) then r = false end
end
return r
end
function Set.mark_flagged(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.mark_flagged(mbox, self) then r = false end
end
return r
end
function Set.mark_seen(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.mark_seen(mbox, self) then r = false end
end
return r
end
function Set.unmark_answered(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.unmark_answered(mbox, self) then r = false end
end
return r
end
function Set.unmark_deleted(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.unmark_deleted(mbox, self) then r = false end
end
return r
end
function Set.unmark_draft(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.unmark_draft(mbox, self) then r = false end
end
return r
end
function Set.unmark_flagged(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.unmark_flagged(mbox, self) then r = false end
end
return r
end
function Set.unmark_seen(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.unmark_seen(mbox, self) then r = false end
end
return r
end
function Set.delete_messages(self)
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.delete_messages(mbox, self) then r = false end
end
return r
end
function Set.copy_messages(self, dest)
_check_required(dest, 'table')
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.copy_messages(mbox, dest, self) then r = false end
end
return r
end
function Set.move_messages(self, dest)
_check_required(dest, 'table')
local r = true
for mbox in pairs(_extract_mailboxes(self)) do
if not mbox.move_messages(mbox, dest, self) then r = false end
end
return r
end
function Set.select_all(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.select_all(mbox)
end
return self * set
end
function Set.send_query(self, criteria)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.send_query(mbox, criteria)
end
return self * set
end
function Set.is_answered(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_answered(mbox)
end
return self * set
end
function Set.is_deleted(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_deleted(mbox)
end
return self * set
end
function Set.is_draft(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_draft(mbox)
end
return self * set
end
function Set.is_flagged(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_flagged(mbox)
end
return self * set
end
function Set.is_new(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_new(mbox)
end
return self * set
end
function Set.is_old(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_old(mbox)
end
return self * set
end
function Set.is_recent(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_recent(mbox)
end
return self * set
end
function Set.is_seen(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_seen(mbox)
end
return self * set
end
function Set.is_unanswered(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_unanswered(mbox)
end
return self * set
end
function Set.is_undeleted(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_undeleted(mbox)
end
return self * set
end
function Set.is_undraft(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_undraft(mbox)
end
return self * set
end
function Set.is_unflagged(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_unflagged(mbox)
end
return self * set
end
function Set.is_unseen(self)
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_unseen(mbox)
end
return self * set
end
function Set.is_larger(self, size)
_check_required(size, 'number')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_larger(mbox, size)
end
return self * set
end
function Set.is_smaller(self, size)
_check_required(size, 'number')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_smaller(mbox, size)
end
return self * set
end
function Set.arrived_on(self, date)
_check_required(date, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.arrived_on(mbox, date)
end
return self * set
end
function Set.arrived_before(self, date)
_check_required(date, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.arrived_before(mbox, date)
end
return self * set
end
function Set.arrived_since(self, date)
_check_required(date, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.arrived_since(mbox, date)
end
return self * set
end
function Set.sent_on(self, date)
_check_required(date, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.sent_on(mbox, date)
end
return self * set
end
function Set.sent_before(self, date)
_check_required(date, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.sent_before(mbox, date)
end
return self * set
end
function Set.sent_since(self, date)
_check_required(date, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.sent_since(mbox, date)
end
return self * set
end
function Set.is_newer(self, days)
_check_required(days, 'number')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_newer(mbox, days)
end
return self * set
end
function Set.is_older(self, days)
_check_required(days, 'number')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.is_older(mbox, days)
end
return self * set
end
function Set.has_flag(self, flag)
_check_required(flag, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.has_flag(mbox, flag)
end
return self * set
end
function Set.contain_field(self, field, string)
_check_required(field, 'string')
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_field(mbox, field, string)
end
return self * set
end
function Set.contain_bcc(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_bcc(mbox, string)
end
return self * set
end
function Set.contain_cc(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_cc(mbox, string)
end
return self * set
end
function Set.contain_from(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_from(mbox, string)
end
return self * set
end
function Set.contain_subject(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_subject(mbox, string)
end
return self * set
end
function Set.contain_to(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_to(mbox, string)
end
return self * set
end
function Set.contain_header(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_header(mbox, string)
end
return self * set
end
function Set.contain_body(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_body(mbox, string)
end
return self * set
end
function Set.contain_message(self, string)
_check_required(string, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.contain_message(mbox, string)
end
return self * set
end
function Set.match_bcc(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_bcc(mbox, pattern, self)
end
return self * set
end
function Set.match_cc(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_cc(mbox, pattern, self)
end
return self * set
end
function Set.match_from(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_from(mbox, pattern, self)
end
return self * set
end
function Set.match_subject(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_subject(mbox, pattern, self)
end
return self * set
end
function Set.match_to(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_to(mbox, pattern, self)
end
return self * set
end
function Set.match_field(self, field, pattern)
_check_required(field, 'string')
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_field(mbox, field, pattern, self)
end
return self * set
end
function Set.match_header(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_header(mbox, pattern, self)
end
return self * set
end
function Set.match_body(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_body(mbox, pattern, self)
end
return self * set
end
function Set.match_message(self, pattern)
_check_required(pattern, 'string')
local set = Set()
for mbox in pairs(_extract_mailboxes(self)) do
set = set + mbox.match_message(mbox, pattern, self)
end
return self * set
end
Set._mt.__call = Set._new