Blame data/pandoc.List.lua

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