|
Packit |
dda32d |
--[[
|
|
Packit |
dda32d |
List.lua
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
Copyright © 2017 Albert Krewinkel
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
Packit |
dda32d |
with or without fee is hereby granted, provided that the above copyright notice
|
|
Packit |
dda32d |
and this permission notice appear in all copies.
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
Packit |
dda32d |
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
Packit |
dda32d |
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
Packit |
dda32d |
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
Packit |
dda32d |
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
Packit |
dda32d |
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
Packit |
dda32d |
THIS SOFTWARE.
|
|
Packit |
dda32d |
]]
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Pandoc's List type and helper methods
|
|
Packit |
dda32d |
-- @classmod pandoc.List
|
|
Packit |
dda32d |
-- @author Albert Krewinkel
|
|
Packit |
dda32d |
-- @copyright © 2017 Albert Krewinkel
|
|
Packit |
dda32d |
-- @license MIT
|
|
Packit |
dda32d |
local List = {
|
|
Packit |
dda32d |
_VERSION = "0.1.0"
|
|
Packit |
dda32d |
}
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
function List:new (o)
|
|
Packit |
dda32d |
o = o or {}
|
|
Packit |
dda32d |
setmetatable(o, self)
|
|
Packit |
dda32d |
self.__index = self
|
|
Packit |
dda32d |
return o
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
function List:__call (o)
|
|
Packit |
dda32d |
return self:new(o)
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Concatenates two lists.
|
|
Packit |
dda32d |
-- @param list second list concatenated to the first
|
|
Packit |
dda32d |
-- @return a new list containing all elements from list1 and list2
|
|
Packit |
dda32d |
function List:__concat (list)
|
|
Packit |
dda32d |
local res = List.clone(self)
|
|
Packit |
dda32d |
List.extend(res, list)
|
|
Packit |
dda32d |
return res
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Returns a (shallow) copy of the list.
|
|
Packit |
dda32d |
function List:clone ()
|
|
Packit |
dda32d |
local lst = setmetatable({}, getmetatable(self))
|
|
Packit |
dda32d |
List.extend(lst, self)
|
|
Packit |
dda32d |
return lst
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Checks if the list has an item equal to the given needle.
|
|
Packit |
dda32d |
-- @param needle item to search for
|
|
Packit |
dda32d |
-- @param init index at which the search is started
|
|
Packit |
dda32d |
-- @return true if a list item is equal to the needle, false otherwise
|
|
Packit |
dda32d |
function List:includes (needle, init)
|
|
Packit |
dda32d |
return not (List.find(self, needle, init) == nil)
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Returns the value and index of the first occurrence of the given item.
|
|
Packit |
dda32d |
-- @param needle item to search for
|
|
Packit |
dda32d |
-- @param init index at which the search is started
|
|
Packit |
dda32d |
-- @return first item equal to the needle, or nil if no such item exists.
|
|
Packit |
dda32d |
-- @return index of that element
|
|
Packit |
dda32d |
function List:find (needle, init)
|
|
Packit |
dda32d |
return List.find_if(self, function(x) return x == needle end, init)
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Returns the value and index of the first element for which the predicate
|
|
Packit |
dda32d |
--- holds true.
|
|
Packit |
dda32d |
-- @param pred the predicate function
|
|
Packit |
dda32d |
-- @param init index at which the search is started
|
|
Packit |
dda32d |
-- @return first item for which `test` succeeds, or nil if no such item exists.
|
|
Packit |
dda32d |
-- @return index of that element
|
|
Packit |
dda32d |
function List:find_if (pred, init)
|
|
Packit |
dda32d |
init = (init == nil and 1) or (init < 0 and #self - init) or init
|
|
Packit |
dda32d |
for i = init, #self do
|
|
Packit |
dda32d |
if pred(self[i], i) then
|
|
Packit |
dda32d |
return self[i], i
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
return nil
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Adds the given list to the end of this list.
|
|
Packit |
dda32d |
-- @param list list to appended
|
|
Packit |
dda32d |
function List:extend (list)
|
|
Packit |
dda32d |
for i = 1, #list do
|
|
Packit |
dda32d |
self[#self + 1] = list[i]
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Returns a copy of the current list by applying the given function to all
|
|
Packit |
dda32d |
-- elements.
|
|
Packit |
dda32d |
-- @param fn function which is applied to all list items.
|
|
Packit |
dda32d |
function List:map (fn)
|
|
Packit |
dda32d |
local res = setmetatable({}, getmetatable(self))
|
|
Packit |
dda32d |
for i = 1, #self do
|
|
Packit |
dda32d |
res[i] = fn(self[i], i)
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
return res
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
--- Returns a new list containing all items satisfying a given condition.
|
|
Packit |
dda32d |
-- @param pred condition items must satisfy.
|
|
Packit |
dda32d |
-- @return a new list containing all items for which `test` was true.
|
|
Packit |
dda32d |
function List:filter (pred)
|
|
Packit |
dda32d |
local res = setmetatable({}, getmetatable(self))
|
|
Packit |
dda32d |
for i = 1, #self do
|
|
Packit |
dda32d |
if pred(self[i], i) then
|
|
Packit |
dda32d |
res[#res + 1] = self[i]
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
return res
|
|
Packit |
dda32d |
end
|
|
Packit |
dda32d |
|
|
Packit |
dda32d |
return List
|