Array class added to ease common operations.

Class = require "nyaa.class"

local Array

---
-- @fixme Some of those operations are not very efficient.
Array = Class "Array",
	__init: (arg) =>
		for i = 1, #arg
			rawset self, i, arg[i]

	push: (value) =>
		self[#self + 1] = value

	pop: =>
		last = self[#self]

		self[#self] = nil

		return last

	map: (f) =>
		Array [f x for x in ipairs self]

	filter: (filter) =>
		newArray = Array {}

		for i = 1, #self
			value = self[i]

			if filter value
				newArray\push value

		newArray

	concat: (separator) =>
		table.concat self, separator

Array

error: pathspec 'nyaa/array.moon' did not match any file(s) known to git


list: new module, list commands and patterns in commands

Former-commit-id: 2e66e6bddc700e0f8476b94428cf272544bfbb4a [formerly 75deee7bb3533f48313fab2bca7c10e234857a2f]
Former-commit-id: 5e79f9206e44b6ba59f7b5b66fc448751ec8d87b

listModules = (source, destination, arg) =>
  out = {}
  for moduleName, moduleTable in next, @Events!['PRIVMSG']
    unless @IsModuleDisabled moduleName, destination
      table.insert out, moduleName
  if #out > 0
    @Msg 'privmsg', destination, source, "Modules: %s", table.concat(out, ', ')

listPatterns = (source, destination, moduleName) =>
  moduleTable = @Events!['PRIVMSG'][moduleName]
  unless moduleTable
    return

  if @IsModuleDisabled moduleName, destination
    return

  out = {}
  for pattern, callback in next, moduleTable
    table.insert out, pattern

  if #out > 0
    @Msg 'privmsg', destination, source, "%s patterns: %s", moduleName, table.concat(out, ', ')

PRIVMSG:
  '%plist$': listModules
  '%plist (%w+)$': listPatterns

error: pathspec 'modules/list.moon' did not match any file(s) known to git


test table#last out of range

test table#last out of range

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alexherbo2/funcmay.moon.git/'


Add pwd as an alias for cwd (or vice versa)

error: pathspec 'terminal/filesystem/root/bin/pwd.moon' did not match any file(s) known to git


Add generic audio source

Add generic audio source

Gdx = sauce3.java.require "com.badlogic.gdx.Gdx"

class
  new: (filename, a_type, f_type) =>
    file = sauce3.File filename, f_type

    @static = a_type != "stream"
    @volume = 1

    @looping = false
    @playing = false
    @paused  = false

    if @static
      @source = Gdx.audio\newMusic file.file
    else
      @source = Gdx.audio\newSound file.file

  play: =>
    if @static
      @sound_id = @source\play!
    else
      @source\play!

    @playing = false

  pause: =>
    unless @paused
      if @static
        @source\pause @sound_id
      else
        @source\pause!

      @paused = true

  resume: =>
    unless @paused
      if @static
        @source\pause @sound_id
      else
        @source\pause!

  stop: =>
    if @playing
      if @static
        @source\stop @sound_id
      else
        @source\stop!

      @playing = true

  get_type: =>
    @static and "static" or "stream"

  set_looping: (@looping) =>
    if @static
      @source\setLooping @sound_id, @looping
    else
      @source\setLooping @looping

  set_volume: (@volume) =>
    if @static
      @source\setVolume @sound_id, @volume
    else
      @source\setVolume @volume

  dispose: =>
    @source\dispose!

error: pathspec 'src/sauce3/utils/Source.moon' did not match any file(s) known to git


Alot: new module

Alot: new module

Former-commit-id: d3b7c8d1263184f10ffbf83c2e7188d29fa1e3cb [formerly 60645da3eeccc07794bc1778717ec097c88471b0]
Former-commit-id: f57e63d9122b2ed9fb60a0752ef42c667d75c085

alot = (source, destination) =>
  @Msg 'privmsg', destination, source, 'http://hyperboleandahalf.blogspot.no/2010/04/alot-is-better-than-you-at-everything.html'
PRIVMSG:
  ' [aA][lL][oO][tT] ': alot
  '^[aA][lL][oO][tT] ': alot
  ' [aA][lL][oO][tT]$': alot
  '[aA][lL][oO][tT]%p': alot
  '%p[aA][lL][oO][tT]%p': alot
  '^[aA][lL][oO][tT]$': alot

error: pathspec 'modules/alot.moon' did not match any file(s) known to git


clue: new module

clue: new module

Former-commit-id: 2f768c4bf207aad157d2682f2a354d85bd8d16e6 [formerly a1afa6d750933dba439f2cc4163a61935efceb26]
Former-commit-id: dba21f9bc3e427cd271a038ec029cdd2c9fc5333

-- Clue module requires clue data files and tosql.py from emnh/clue2

dbi = require 'DBI'
require'logging.console'
log = logging.console()
conn = false

attrs = {'grammar','reference', 'country', 'context', 'text'}

connect = ->
  conn, err = DBI.Connect('PostgreSQL', ivar2.config.dbname, ivar2.config.dbuser, ivar2.config.dbpass, ivar2.config.dbhost, ivar2.config.dbport)
  unless conn
    log\error "Unable to connect to DB: #{err}"
    return

  conn\autocommit(true)

dbh = ->
  connect! unless conn

  -- Check if connection is alive
  alive = conn\ping!
  connect! unless alive

  success, err = DBI.Do(conn, 'SELECT NOW()')
  unless success
    log\error "SQL Connection :#{err}"
    connect!

  return conn

lookup = (source, destination, lookup) =>
  stmt = dbh!\prepare [[
    SELECT
      tablename
    from
      pg_catalog.pg_tables
    where
      tablename like 'cl%'
    ]]
  stmt\execute!
  tables = {}
  for row in stmt\rows(true) -- true for column names
    tables[#tables+1] = row.tablename

  out = {}
  for dict in *tables
    out[dict] = {}
    stmt = dbh!\prepare [[
      SELECT
        *
      FROM
        ]]..dict..[[
      WHERE
        word = ?
      ]]
    stmt\execute lookup
    for row in stmt\rows(true) -- true for column names
      table.insert(out[dict], row)

  i = 0
  for dict, rows in pairs out
    res = {}
    dfrom = dict\sub(3, 4)
    to = dict\sub(5, 6)
    first = true
    for row in *rows
      i += 1
      if first
        table.insert(res, "[#{ivar2.util.bold row.word}]")
        table.insert(res, "(#{ivar2.util.italic dfrom}")
        table.insert(res, "-> #{ivar2.util.italic to})")
        first = false
      for attr in *attrs
        if row[attr] != nil and row[attr] != ''
          if attr == 'grammar'
            table.insert(res, "(#{row[attr]}. )")
          else
            table.insert(res, row[attr])
    say table.concat(res, ' ')
  if i == 0
    reply 'Nope.'

PRIVMSG:
  '^%pclue (.+)$': lookup

error: pathspec 'modules/clue.moon' did not match any file(s) known to git


textutils: new module with some helpful trix for filters

PRIVMSG:
  '^%pupper (.+)$': (source, destination, arg) =>
    say arg\upper!
  '^%plower (.+)$': (source, destination, arg) =>
    say arg\lower!
  '^%preverse (.+)$': (source, destination, arg) =>
    say arg\reverse!
  '^%plen (.+)$': (source, destination, arg) =>
    say tostring(arg\len!)
  '^%pnicks$': (source, destination) =>
    say table.concat([n for n,k in pairs(ivar2.channels[destination].nicks)], ' ')
  '^%prandom (.+)$': (source, destination, arg) =>
    words = [word for word in arg\gmatch('%S+')]
    say words[math.random(1, #words)]

error: pathspec 'modules/textutils.moon' did not match any file(s) known to git


svada: new module

svada: new module

Former-commit-id: 74289c1c0403919df45d491d0a1cb2d4bb33c8f4 [formerly ad076744568ffa41fa6a84b3538a4b3019ad0ae1]
Former-commit-id: d77a9b58a6d51318e33adab3fa75da6277ca348f

-- svadagenerator.no/data/svadagenerator.csv

svada = {
  {"Gitt","en integrert","målsetting","synliggjøres","potensialet","innenfor rammen av","en samlet vurdering"},
  {"Under hensyntagen til","en optimal","effekt","tas det høyde for","risikofaktorene","som en følge av","forholdene"},
  {"I lys av","en sømløs","struktur","iverksettes","fokus","for så vidt gjelder","konseptet"},
  {"Vedrørende","en implisitt","agenda","identifiseres","synergieffekten","med henblikk på","ressurssituasjonen"},
  {"Grunnet","en proaktiv","tidshorisont","initieres","incitamentet","i forhold til","tilgjengeliggjøringen"},
  {"I betraktning av","en betydelig","overveielse","lokaliseres","forankringen","hva angår","føringene"},
  {"Forutsatt","en økt","mobilitet","kommuniseres","insentivene","parallelt med","evalueringen"},
  {"Med utgangspunkt i","en vesentlig","treffsikkerhet","styrkes","innsatsen","i relasjon til","implementeringen"},
  {"I forhold til","en ikke ubetydelig","innsats","realiseres","erfaringsutvekslingen","i tilknytning til","kjernevirksomheten"},
  {"Sett hen til","en kostnadseffektiv","kvalitetssikring","effektueres","informasjonsflyten","på bakgrunn av","visjonen"},
  {"I henhold til","en avtagende","problematikk","forankres","kriteriene","avhengig av","satsingsområdet"},
  {"Med tanke på","en vedvarende","ressursbruk","maksimeres","strategien","hva gjelder","problemstillingen"},
  {"Uavhengig av","en tiltagende","avveining","konkretiseres","økningen","eller sagt på en annen måte:","beskaffenheten"},
  {"Sett på bakgrunn av","en gjeldende","avklaring","tilgjengeliggjøres","egenarten","på samme måte som","vesentligheten"},
  {"Sammenholdt med","en helhetlig","implementering","utvides","tilstedeværelsen","i motsetning til","egenarten"},
  {"På grunn av","en manglende","styringsinnsats","dokumenteres","oppfølgingen","innenfor","målområdet"},
  {"Med hensyn til","en særlig","innovasjon","spores","resultatene","i tillegg til","verdiene"},
  {"Under forutsetning av","en løpende","effektivisering","innhentes","kunnskapene","gjennom","realitetsorienteringen"},
  {"Etter en totalvurdering av","en langsiktig","kvalitetsheving","revitaliseres","betydningen","ut fra","resultatoppnåelsen"},
  {"Uten hensyn til","en bærekraftig","utvikling","stabiliseres","kompetansehevingen","med sikte på","behovene"},
  {"Avhengig av","en resultatorientert","måloppnåelse","genereres","instrumentet","på tvers av","løsningen"},
  {"På grunnlag av","en tverrfaglig","oppgaveløsning","stimuleres","scenarioet","på linje med","parametrene"},
  {"I og med","en kommunikativ","arbeidsmodell","balanseres","spisskompetansen","utenom","ressursinnsatsen"},
  {"Under henvisning til","en inkluderende","organisasjon","ivaretas","relasjonene","i forlengelsen av","konsekvensaspektet"},
  {"Gitt","en plutselig","fornyelse","omfattes","fornyelsen","innenfor rammen av","oppgjøret"},
  {"Under hensyntagen til","en uforutsett","risikovurdering","utstedes","forsikringsbehovet","som en følge av","husstanden"},
  {"I lys av","en erstatningsmessig","forsikringstaker","iverksettes","vilkårene","under forutsetning av","årsakssammenhengen"},
  {"Vedrørende","en kollektiv","egenandel","anvendes","oppsigelsen","med henblikk på","betingelsene"},
  {"Grunnet","en indirekte","tariff","kommuniseres","angrefristen","i forhold til","opplysningsplikten"},
  {"I betraktning av","en skadevoldende","sikkerhetsforskrift","Innebæres","tegningstidspunktet","hva angår","behovsgjennomgangen"},
  {"Forutsatt","en særskilt","regress","tegnes","oppgjørsreglene","parallelt med","evalueringen"},
  {"Med utgangspunkt i","en ansvarsbegrensende","reassuranse","styrkes","klagenemden","i relasjon til","utredningsforløpet"},
  {"I forhold til","en inntruffet","utløpsdato","realiseres","vilkårstolkningen","i tilknytning til","kjernevirksomheten"},
  {"Sett hen til","en forholdsmessig","begunstigelse","baseres","løsøre","på bakgrunn av","visjonen"},
  {"I henhold til","en avvikende","helseerklæring","forankres","personopplysningene","avhengig av","satsingsområdet"},
  {"Med tanke på","en prosentvis","dekningsgrad","optimaliseres","konsekvensendringen","hva gjelder","porteføljen"},
  {"Uavhengig av","en juridisk","samlefaktura","konkretiseres","sviket","eller sagt på en annen måte:","lønnsomhetsmodellene"},
  {"Sett på bakgrunn av","en årlig","premie","meldes","flytteretten","på samme måte som","distribusjonskanalene"},
  {"Sammenholdt med","en ervervsmessig","indeksjustering","utvides","erstatningsansvaret","i motsetning til","avkortningen"},
  {"På grunn av","en bindende","rabatt","dokumenteres","segmentene","innenfor","takstmennene"},
  {"Med hensyn til","en prosessorientert","forutsetning","utredes","skadeskjemaene","i tillegg til","kjerneverdiene"},
  {"Under forutsetning av","en systemmessig","panthaver","innhentes","forsikrede","gjennom","skadeprosenten"},
  {"Etter en totalvurdering av","en skriftlig","sikkerhetsrabatt","ivaretas","premieberegningsgrunnlaget","ut fra","tilleggsdekningen"},
  {"Uten hensyn til","en tilpasningsdyktig","skjønnsvurdering","utløses","bonusbestemmelsene","med sikte på","bransjestandarden"},
  {"Avhengig av","en sesongvariert","skadetakst","stabiliseres","hovedforfallet","på tvers av","løsningssporet"},
  {"På grunnlag av","en gjennomsnittlig","bygningsdel","påvirkes","rammebetingelsene","på linje med","tariffparametrene"},
  {"I og med","en skademessig","forsikringstaker","avtales","unntaksreglene","utenom","markedsandelene"},
  {"Under henvisning til","en trendsettende","purrerutine","synliggjøres","kompensasjonen","i forlengelsen av","konsekvensaspektet"},
  {"Under henvisning til","en effektbasert","avdelingskultur","realiseres","sluttilstanden","utenom","operasjonen"},
  {"På grunnlag av","en operativ","doktrine","omsettes","hensikten","i forlengelsen av","kommandonivået"},
  {"Med bakrunn i","en fellesoperativ","kommando","implementeres","virkefeltet","innenfor","kampanjeplanen"},
  {"Gitt","en militærstrategisk","operasjonsdimensjon","reflekteres","samvirket","i utnyttelsen av","profesjonen"},
  {"Avhengig av","en taktisk","manøver","utvikles","kommandokjeden","ut fra","forsvarsgrenen"},
  {"Sett i lys av","en stridsteknisk","samhandling","kjennetegnes","avskrekkingseffekten","ut over","våpengrenen"},
  {"Uten hensyn til","en dynamisk","konflikt","sammenfattes","synergieffekten","på tvers av","alliansen"},
  {"I og med","en konvensjonell","krigføring","iverksettes","friksjonen","i tilknytning til","kjerneverdiene"},
  {"Etter en totalvurdering av","en ukonvensjonell","maktbruk","avgjøres","planverket","i forbindelse med","konseptutviklingen"},
  {"Under analysen av","en fredsbevarende","styrkemultiplikator","tilpasses","styrkebidraget","med hensyn til ","militærmakten"},
  {"I kontrollen av","en tverrsektoriell","interoperabilitet","operasjonaliseres","virkemiddelet","gjennom","krigens natur"},
  {"I arbeidet med","en overordnet","konfliktintensitet","påvirkes","lendevurderingen","med basis i ","handlingsrommet"},
  {"Under forutsetning av","en nødvendig","konflikthåndtering","identifiseres","fiendevurderingen","til støtte for","deployeringen"},
  {"Sammenholdt med","en offensiv","avskrekking","organiseres","stridsfeltet","ved bruk av","operasjonsområdet"},
  {"Sett hen til","en defensiv","myndighetsutøvelse","fastsettes","evnen","på linje med","styrkedisponeringen"},
  {"Etter etablering av","en desentralisert","prosessavhengighet","styrkes","stridsevnen","parallellt med","langtidsplanen"},
  {"Grunnet","en oppdragsbasert","beredskap","koordineres","innsatsmidlet","i relasjon til","sikkerhetspolitikken"},
  {"Vedrørende","en maritim","kraftsamling","bevisstgjøres","situasjonsforståelsen","i forhold til ","oppdragsorganiseringen"},
  {"Forutsatt","en spesialisert","ressursbruk","forsterkes","schwerpunktet","i motsetning til","totalforsvaret"},
  {"Etter planlegging av","en indirekte","beslutningsevne","fokuseres","trusselbildet","i tillegg til","feltfunksjonen"},
  {"Ved bruk av","en sentralisert","handlekraft","samordnes","uttaket","innenfor rammen av","brigadestrukturen"},
  {"Gitt","en forskningsbasert","målsetting","synliggjøres","forebyggingspotensialet","innenfor rammen av","sykehussammenslåingen"},
  {"Under hensyntagen til","en optimal","detaljering","overstyres","helserisikoen","som en følge av","DRG-produksjonen"},
  {"I lys av","en sømløs","struktur","iverksettes","helseministerens standpunkt","for så vidt gjelder","rehabiliteringsprosjekt"},
  {"Vedrørende","en pasientorientert","agenda","identifiseres","samhandlingsarenaene","med henblikk på","styringsmodellen"},
  {"Grunnet","en proaktiv","tidshorisont","initieres","brukerrepresentasjonen","i forhold til","leveransekonsept"},
  {"I betraktning av","en betydelig","optimalisering","lokaliseres","kunnskapsforankringen","hva angår","IA-arbeidet"},
  {"Forutsatt","en tverrfaglig","mobilitet","kommuniseres","statsekretærens vurdering","parallelt med","nasjonale helsemål"},
  {"Med utgangspunkt i","en vesentlig","treffsikkerhet","styrkes","HR-direktørens beslutning","i relasjon til","turnusforskriften"},
  {"I forhold til","en helsepolitisk","innsats","realiseres","brukertilfredsheten","i tilknytning til","utfordringsrommet"},
  {"Sett hen til","en kostnadseffektiv","kvalitetssikring","effektueres","helseinformasjonsflyten","på bakgrunn av","helsevisjonene"},
  {"I henhold til","en avtagende","problematikk","forankres","samhandlingspotensialet","avhengig av","rekrutteringsutfordringene"},
  {"Med tanke på","en vedvarende","ressursbruk","maksimeres","økonomisjefens målhorisont","hva gjelder","feilbehandlingen"},
  {"Uavhengig av","en tiltagende","omstilling","konkretiseres","sykehusdirektørens visjon","koordinert med","tilsynsrapporten"},
  {"Sett på bakgrunn av","en helsefaglig","avklaring","tilgjengeliggjøres","helsegevinsten","på samme måte som","omstillingsprosessen"},
  {"Sammenholdt med","en helhetlig","implementering","utvides","helseutfordringene","i motsetning til","leveransekonseptet"},
  {"På grunn av","en manglende","styringsinnsats","dokumenteres","helseproduksjonen","innenfor","innsatsfokuseringen"},
  {"Med hensyn til","en særlig","innovasjon","spores","fastlegenes produksjonsevne","i tillegg til","helseforetaket"},
  {"Under forutsetning av","en løpende","forventningsjustering","innhentes","rehabiliteringspotensialet","gjennom","ventelisteskandalene"},
  {"Etter en totalvurdering av","en langsiktig","orientering","adresseres","samhandlingskompetansen","ut fra","tjenesteintegreringen"},
  {"Uten hensyn til","en bærekraftig","utvikling","stabiliseres","forsvarlighetskravene","med sikte på","kjernevirksomheten"},
  {"Avhengig av","en resultatorientert","målhorisont","genereres","samhandlingskoordineringen","på tvers av","pasientsskadeerstatningen"},
  {"På grunnlag av","en tverrfaglig","arena","stimuleres","avviksmeldingene","på linje med","kvalitetsarbeidet"},
  {"I og med","en kunnskapsbasert","synergi","balanseres","fagkoordineringen","utenom","systemsvikten"},
  {"Under henvisning til","en inkluderende","avstemning","ivaretas","helseproblematikken","i forlengelsen av","helsereformene"},
  {"Gitt","en representativ","beskrivelse","dokumenteres","visualiseringen","innenfor rammen av","kommunepolitikken"},
  {"I lys av","en implisitt","gjengivelse","ivaretas","byggesøknaden","i motsetning til","samordningsplikten"},
  {"Med bakgrunn i","en konkret","søknad","utredes","materialiteten","i tillegg til","saksbehandlingstiden"},
  {"I forhold til","en feilaktig","skjemautfylling","fastslås","beskaffenheten","gjennom","tiltakshaveren"},
  {"Sett hen til","en faktisk","råderett","meldes","kontrollerklæringen","parallelt med","dispensasjonssøknaden"},
  {"I og med","en nødvendig","nabovarsling","konkluderes","søknadsprosessen","for så vidt gjelder","reguleringsplanen"},
  {"Ifølge","en transparent","klagebehandling","betviles","vedtaksbegrunnelsen","på basis av","kartgrunnlaget"},
  {"Sammenliknet med","en langsiktig","saksbehandling","oppleves","forføyningen","innenfor","hjemmelsgrunnlaget"},
  {"Ut fra","en bærekraftig","samhandling","betraktes","gjennomføringsplanen","i forhold til","planvedtaket"},
  {"Uavhengig av","en representativ","prosessavklaring","estimeres","ansvarsbelegningen","med henblikk på","ansvarsretten"},
  {"Basert på","en kvalitativ","konkretisering","bedømmes","tiltaket","ved hjelp av","prosjekteringen"},
  {"Vedrørende","en søknadspliktig","innvilgelse","anbefales","igangsettingstillatelsen","på linje med","planforslaget"},
  {"Under henvisning til","en klanderverdig","kvalitetsbedømming","forhåndsvurderes","ferdigattesten","på tvers av","grunnboken"},
  {"Grunnet","en arkitekturbasert","ulempebetraktning","avklares","kvaliteten","knyttet til","planbestemmelsen"},
  {"Tatt i betraktning","en systematisk","tillatelse","preaksepteres","dispensasjonen","som en følge av","arealbruken"},
  {"Forutsatt","(en ressursmessig)","realitetsbehandling","fastsettes","samsvarserklæringen","begrunnet i","statlig arealplan"},
  {"Uten hensyn til","en vesentlig","arealoverføring","forankres","oppføringen","i kraft av","tomtefestelova"},
  {"Med sikte på","en midlertidig","godkjennelse","utløses","rammetillatelsen","på tross av","strandsonen"},
  {"Sett ut fra","en kvalifisert","omregulering","samordnes","fasadeendringen","i relasjon til","ansvarsretten"},
  {"Med grunnlag i","en frittliggende","rammetillatelse","vurderes","terrenginngrepet","i overensstemmelse med","tvingende sikkerhetshensyn"},
}

PRIVMSG:
  '^%psvada$': (s, d, a) =>
    words = {}
    wordN = 1
    for i=1,7 do
      line = svada[math.random(1, #svada)]
      word = line[wordN]
      table.insert(words, word)
      wordN = wordN + 1

    say table.concat(words, ' ')

error: pathspec 'modules/svada.moon' did not match any file(s) known to git


ordbok: new module, use new API

ordbok: new module, use new API

util = require'util'
simplehttp = util.simplehttp
json = util.json
bold = util.bold
urlEncode = util.urlEncode

APIBASE = "https://ord.uib.no/"

lookup = (word, dict, number) ->
  unless dict
    dict = 'bm'
  unless number
      number =1
  --data = simplehttp "#{APIBASE}/suggest?q=#{urlEncode word}&dict=#{dict}&n=#{number}"
  scope = "eif"
  data = simplehttp "#{APIBASE}api//articles?w=#{urlEncode word}&dict=#{dict}&scope=#{scope}"
  data = json.decode(data)
  res = data['articles'][dict][1]

  url = "#{APIBASE}#{dict}/article/#{res}.json"
  data = simplehttp url
  data = json.decode(data)
  out = {}

  definition = data.body.definitions[1].elements[1].content

  ic = data.lemmas[1].inflection_class

  output = "[#{util.bold(data.suggest[1])}]: #{ic} (#{definition})"
  table.insert(out, output)

  return table.concat(out, ' ')

nnlookup = (s, d, a) =>
  say lookup(a, 'nn')

nnlookup = (s, d, a) =>
  say lookup(a, 'bm')

PRIVMSG:
  '^%pbm (.*)$': bmlookup
  '^%pnn (.*)$': nnlookup
--  '^%pnynorsk (.*)$': ordbok
--  '^%pordbok (.*)$': ordbok

error: pathspec 'modules/ordbok.moon' did not match any file(s) known to git


Added tests for `in_table` function

Added tests for `in_table` function

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/SuperPaintman/umka.git/'