Compatibilité elvish 0.17
This commit is contained in:
		
							parent
							
								
									be84588373
								
							
						
					
					
						commit
						87eb82a791
					
				
					 43 changed files with 323 additions and 322 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,2 +1,3 @@
 | 
			
		|||
*.old
 | 
			
		||||
lib/github.com
 | 
			
		||||
private
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var addbadips~ [@argv]{
 | 
			
		||||
edit:add-var addbadips~ {|@argv|
 | 
			
		||||
  use moi/util/ip
 | 
			
		||||
  use moi/util/list
 | 
			
		||||
  use moi/util/map
 | 
			
		||||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ edit:add-var addbadips~ [@argv]{
 | 
			
		|||
  var f   = ~/bad_ips.txt
 | 
			
		||||
  var ips = [ (cat $f) ]
 | 
			
		||||
  var m c = (map:to-set $ips) 0
 | 
			
		||||
  each [e]{
 | 
			
		||||
  each {|e|
 | 
			
		||||
    var cond = (and (not (has-key $m $e)) (ip:is-ipv4 $e))
 | 
			
		||||
    if $cond {
 | 
			
		||||
      echo $e ajoutée
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var adguard~ [@argv]{
 | 
			
		||||
edit:add-var adguard~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  sudo chattr -i /etc/resolv.conf
 | 
			
		||||
  var beg = 's|^.*\(192\.168\.0\.25\)|'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,17 @@
 | 
			
		|||
edit:add-var cat~ [@argv]{ e:bat -pp --tabs 2 $@argv }
 | 
			
		||||
edit:add-var cp~ [@argv]{ e:cp -iv $@argv }
 | 
			
		||||
edit:add-var cat~ {|@argv| e:bat -pp --tabs 2 $@argv }
 | 
			
		||||
edit:add-var cp~ {|@argv| e:cp -iv $@argv }
 | 
			
		||||
edit:add-var curl~ $e:curlie~
 | 
			
		||||
edit:add-var df~ $e:duf~
 | 
			
		||||
edit:add-var diff~ $e:colordiff~
 | 
			
		||||
edit:add-var dig~ [@argv]{ e:dig +noall +answer $@argv }
 | 
			
		||||
edit:add-var dogall~ [@argv]{ e:dog A AAAA CNAME TXT MX NS SOA $@argv }
 | 
			
		||||
edit:add-var du~ [@argv]{ e:du -h $@argv }
 | 
			
		||||
edit:add-var dig~ {|@argv| e:dig +noall +answer $@argv }
 | 
			
		||||
edit:add-var dogall~ {|@argv| e:dog A AAAA CNAME TXT MX NS SOA $@argv }
 | 
			
		||||
edit:add-var du~ {|@argv| e:du -h $@argv }
 | 
			
		||||
edit:add-var git~ $e:hub~
 | 
			
		||||
edit:add-var grep~ [@argv]{ e:grep --color=tty -d skip $@argv }
 | 
			
		||||
edit:add-var mv~ [@argv]{ e:mv -iv $@argv }
 | 
			
		||||
edit:add-var pf~ [@argv]{ e:pkgfile -vri $@argv }
 | 
			
		||||
edit:add-var rm~ [@argv]{ e:rm -Iv $@argv }
 | 
			
		||||
edit:add-var grep~ {|@argv| e:grep --color=tty -d skip $@argv }
 | 
			
		||||
edit:add-var mv~ {|@argv| e:mv -iv $@argv }
 | 
			
		||||
edit:add-var pf~ {|@argv| e:pkgfile -vri $@argv }
 | 
			
		||||
edit:add-var rm~ {|@argv| e:rm -Iv $@argv }
 | 
			
		||||
edit:add-var rename~ $e:go-rename~
 | 
			
		||||
edit:add-var timidity~ [@argv]{ e:timidity -a -K 1 $@argv }
 | 
			
		||||
edit:add-var tree~ [@argv]{ e:tree -puhC --dirsfirst --du -D $@argv }
 | 
			
		||||
edit:add-var wget~ [@argv]{ e:wget2 $@argv }
 | 
			
		||||
edit:add-var timidity~ {|@argv| e:timidity -a -K 1 $@argv }
 | 
			
		||||
edit:add-var tree~ {|@argv| e:tree -puhC --dirsfirst --du -D $@argv }
 | 
			
		||||
edit:add-var wget~ {|@argv| e:wget2 $@argv }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
var cmd = $e:arc~
 | 
			
		||||
 | 
			
		||||
edit:add-var archiver~ [@argv]{
 | 
			
		||||
edit:add-var archiver~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  var help = {
 | 
			
		||||
    echo "Usage : archiver [(-zlxgb)] <file to compress>"
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ edit:add-var archiver~ [@argv]{
 | 
			
		|||
  if (== (count $argv) 0) {
 | 
			
		||||
    $help
 | 
			
		||||
  }
 | 
			
		||||
  peach [f]{
 | 
			
		||||
  peach {|f|
 | 
			
		||||
    var ff = $f
 | 
			
		||||
    if (eq $ff[-1] /) {
 | 
			
		||||
      set f = $ff[..-1]
 | 
			
		||||
| 
						 | 
				
			
			@ -37,16 +37,16 @@ edit:add-var archiver~ [@argv]{
 | 
			
		|||
  } $argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var desarchiver~ [@argv]{
 | 
			
		||||
  peach [f]{
 | 
			
		||||
edit:add-var desarchiver~ {|@argv|
 | 
			
		||||
  peach {|f|
 | 
			
		||||
    var ff = $f
 | 
			
		||||
    $cmd unarchive $ff
 | 
			
		||||
    echo "'"$ff"'" désarchivé
 | 
			
		||||
  } $argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var listarchiver~ [@argv]{
 | 
			
		||||
  peach [f]{
 | 
			
		||||
edit:add-var listarchiver~ {|@argv|
 | 
			
		||||
  peach {|f|
 | 
			
		||||
    var ff = $f
 | 
			
		||||
    $cmd ls $ff
 | 
			
		||||
  } $argv
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var updatecarapace~ []{
 | 
			
		||||
edit:add-var updatecarapace~ {||
 | 
			
		||||
  var cur = (pwd)
 | 
			
		||||
  var wd  = $E:HOME/Documents/OtherGo/github.com/rsteube/carapace-bin
 | 
			
		||||
  var bd  = $E:HOME/Go/bin
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,8 @@
 | 
			
		|||
use str
 | 
			
		||||
 | 
			
		||||
fn -check [f]{
 | 
			
		||||
fn -check {|f|
 | 
			
		||||
  var @missings = (try {
 | 
			
		||||
    sudo ldd $f 2>/dev/null | grep 'not found' | eawk [_ m @_]{ put $m }
 | 
			
		||||
    sudo ldd $f 2>/dev/null | grep 'not found' | eawk {|_ m @_| put $m }
 | 
			
		||||
  } except e {
 | 
			
		||||
  })
 | 
			
		||||
  if (> (count $missings) 1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -11,28 +11,28 @@ fn -check [f]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -check-executable [f]{
 | 
			
		||||
fn -check-executable {|f|
 | 
			
		||||
  if ?(test -x $f) {
 | 
			
		||||
    -check $f
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -cbin []{
 | 
			
		||||
fn -cbin {||
 | 
			
		||||
  echo (styled 'Searching broken binaries…' bold bright-yellow)
 | 
			
		||||
  sudo find /usr/bin -maxdepth 1 -type f 2>/dev/null | each $-check~
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -clib []{
 | 
			
		||||
fn -clib {||
 | 
			
		||||
  echo (styled 'Searching broken libs…' bold bright-yellow)
 | 
			
		||||
  sudo find /usr/lib/*.so* -maxdepth 1 -type f 2>/dev/null | each $-check-executable~
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -copt []{
 | 
			
		||||
fn -copt {||
 | 
			
		||||
  echo (styled 'Searching broken binariess in opt…' bold bright-yellow)
 | 
			
		||||
  sudo find /opt -maxdepth 3 -type f 2>/dev/null | each $-check-executable~
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var checklinks~ []{
 | 
			
		||||
edit:add-var checklinks~ {||
 | 
			
		||||
  -cbin
 | 
			
		||||
  -clib
 | 
			
		||||
  -copt
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
edit:add-var cleankh~ [@argv]{
 | 
			
		||||
edit:add-var cleankh~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  use moi/util/condition
 | 
			
		||||
  use moi/util/list
 | 
			
		||||
  use moi/util/ip
 | 
			
		||||
  fn less [cmp e1 e2]{ < ($cmp $e1 $e2) 0 }
 | 
			
		||||
  fn sort-host [e1 e2]{
 | 
			
		||||
  fn less {|cmp e1 e2| < ($cmp $e1 $e2) 0 }
 | 
			
		||||
  fn sort-host {|e1 e2|
 | 
			
		||||
    var i1 = (condition:cset (ip:is-ip $e1) 1 0)
 | 
			
		||||
    var i2 = (condition:cset (ip:is-ip $e2) 1 0)
 | 
			
		||||
    if (!= $i1 $i2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -17,17 +17,17 @@ edit:add-var cleankh~ [@argv]{
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  var khosts = [&]
 | 
			
		||||
  cat ~/.ssh/known_hosts | eawk [_ hosts @rest]{
 | 
			
		||||
  cat ~/.ssh/known_hosts | eawk {|_ hosts @rest|
 | 
			
		||||
    var key = (str:join ' ' $rest)
 | 
			
		||||
    if (not (has-key $khosts $key)) {
 | 
			
		||||
      set khosts[$key] = [&]
 | 
			
		||||
    }
 | 
			
		||||
    str:split , $hosts | each [h]{
 | 
			
		||||
    str:split , $hosts | each {|h|
 | 
			
		||||
      set khosts[$key][$h] = $nil
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  var lines = [(keys $khosts | each [key]{
 | 
			
		||||
  var lines = [(keys $khosts | each {|key|
 | 
			
		||||
    var hosts = (keys $khosts[$key] | order &less-than=$sort-host~ | str:join ,)
 | 
			
		||||
    put $hosts $key | str:join ' '
 | 
			
		||||
  })]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
edit:add-var commitkcp~ [@argv]{
 | 
			
		||||
edit:add-var commitkcp~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  var m = [
 | 
			
		||||
    &name=
 | 
			
		||||
    &ver=
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  keys $m | each [k]{
 | 
			
		||||
  keys $m | each {|k|
 | 
			
		||||
    var p     = 'pkg'$k'='
 | 
			
		||||
    set m[$k] = (str:trim-prefix (cat PKGBUILD | grep $p | take 1) $p)
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var digall~ [@argv]{
 | 
			
		||||
edit:add-var digall~ {|@argv|
 | 
			
		||||
  use moi/util/list
 | 
			
		||||
  use moi/util/strutil
 | 
			
		||||
  use str
 | 
			
		||||
| 
						 | 
				
			
			@ -27,12 +27,12 @@ edit:add-var digall~ [@argv]{
 | 
			
		|||
  ]
 | 
			
		||||
  var domains use_dig = [] $true
 | 
			
		||||
  
 | 
			
		||||
  fn init []{
 | 
			
		||||
  fn init {||
 | 
			
		||||
    if (and (> (count $argv) 0) (is $argv[0] -d)) {
 | 
			
		||||
      set use_dig = $false
 | 
			
		||||
      set argv    = $argv[1:]
 | 
			
		||||
    }
 | 
			
		||||
    each [e]{
 | 
			
		||||
    each {|e|
 | 
			
		||||
      if (is $e[0] '+') {
 | 
			
		||||
        set flags = [ (all $flags) $e ]
 | 
			
		||||
      } elif (is $e[0] @) {
 | 
			
		||||
| 
						 | 
				
			
			@ -48,10 +48,10 @@ edit:add-var digall~ [@argv]{
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
  fn format [results]{
 | 
			
		||||
    eawk [_ @args]{
 | 
			
		||||
  fn format {|results|
 | 
			
		||||
    eawk {|_ @args|
 | 
			
		||||
      put [ $args[0] (all $args[2..]) ]
 | 
			
		||||
    } $results | list:remove-duplicate | list:sort [l1 l2]{
 | 
			
		||||
    } $results | list:remove-duplicate | list:sort {|l1 l2|
 | 
			
		||||
      var c = (str:compare $l1[0] $l2[0])
 | 
			
		||||
      if (== $c 0) {
 | 
			
		||||
        set c = (str:compare $l1[2] $l2[2])
 | 
			
		||||
| 
						 | 
				
			
			@ -59,23 +59,23 @@ edit:add-var digall~ [@argv]{
 | 
			
		|||
    } | strutil:format &col=$cols | str:join "\n"
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  fn drillr [d @args]{
 | 
			
		||||
    var results = [ (peach [r]{
 | 
			
		||||
      e:drill $@args $r $d | list:filter [e]{
 | 
			
		||||
  fn drillr {|d @args|
 | 
			
		||||
    var results = [ (peach {|r|
 | 
			
		||||
      e:drill $@args $r $d | list:filter {|e|
 | 
			
		||||
        and (> (count $e) 2) (not (is $e[:2] ';;'))
 | 
			
		||||
      }
 | 
			
		||||
    } $records) ]
 | 
			
		||||
    format $results
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn digr [d @args]{
 | 
			
		||||
    var results = [ (peach [r]{
 | 
			
		||||
  fn digr {|d @args|
 | 
			
		||||
    var results = [ (peach {|r|
 | 
			
		||||
      e:dig $@args $r $d $@flags
 | 
			
		||||
    } $records) ]
 | 
			
		||||
    format $results
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  fn req [d @args]{
 | 
			
		||||
  fn req {|d @args|
 | 
			
		||||
    if $use_dig {
 | 
			
		||||
      digr $d $@args
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -83,15 +83,15 @@ edit:add-var digall~ [@argv]{
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
    
 | 
			
		||||
  fn digs [s d]{
 | 
			
		||||
  fn digs {|s d|
 | 
			
		||||
    put (echo (styled $s bright-yellow))
 | 
			
		||||
    req $d $s
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn digd [d]{
 | 
			
		||||
  fn digd {|d|
 | 
			
		||||
    var results = [ (echo (styled 'Domaine: '$d bright-green)) ]
 | 
			
		||||
    if (> (count $servers) 0) {
 | 
			
		||||
      each [s]{
 | 
			
		||||
      each {|s|
 | 
			
		||||
        set @results = $@results (digs $s $d)
 | 
			
		||||
      } $servers
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
use re
 | 
			
		||||
use str
 | 
			
		||||
 | 
			
		||||
fn -value [v]{
 | 
			
		||||
fn -value {|v|
 | 
			
		||||
  var p = (re:find '^(\d+)\((\w+)\)$' $v)
 | 
			
		||||
  if (and (has-key $p groups) (== (count $p[groups]) 3)) {
 | 
			
		||||
    put [
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ fn -value [v]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -values [v]{
 | 
			
		||||
fn -values {|v|
 | 
			
		||||
  var vv = [ (str:split ',' $v) ]
 | 
			
		||||
  if (== (count $vv) 1) {
 | 
			
		||||
    -value $vv[0]
 | 
			
		||||
| 
						 | 
				
			
			@ -20,9 +20,9 @@ fn -values [v]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -get-id []{
 | 
			
		||||
fn -get-id {||
 | 
			
		||||
  var id = [&]
 | 
			
		||||
  str:split ' ' (id) | each [e]{
 | 
			
		||||
  str:split ' ' (id) | each {|e|
 | 
			
		||||
    var p = [ (str:split '=' $e) ]
 | 
			
		||||
    if (== (count $p) 2) {
 | 
			
		||||
      set id[$p[0]] = (-values $p[1])
 | 
			
		||||
| 
						 | 
				
			
			@ -31,19 +31,19 @@ fn -get-id []{
 | 
			
		|||
  put $id
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -get [k]{
 | 
			
		||||
fn -get {|k|
 | 
			
		||||
  var id = (-get-id)
 | 
			
		||||
  if (has-key $id $k) {
 | 
			
		||||
    put $id[$k]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -is-root []{
 | 
			
		||||
fn -is-root {||
 | 
			
		||||
  == (-get uid)[number] 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var get-id~ $-get-id~
 | 
			
		||||
edit:add-var get-uid~ []{ -get uid }
 | 
			
		||||
edit:add-var get-gid~ []{ -get gid }
 | 
			
		||||
edit:add-var get-groups~ []{ -get groups; -get groupes }
 | 
			
		||||
edit:add-var get-uid~ {|| -get uid }
 | 
			
		||||
edit:add-var get-gid~ {|| -get gid }
 | 
			
		||||
edit:add-var get-groups~ {|| -get groups; -get groupes }
 | 
			
		||||
edit:add-var is-root~ $-is-root~
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
edit:add-var ipinfo~ [@argv]{
 | 
			
		||||
edit:add-var ipinfo~ {|@argv|
 | 
			
		||||
  use moi/util/ip
 | 
			
		||||
  use str
 | 
			
		||||
 | 
			
		||||
  var token = (cat $E:HOME/.config/elvish/private/ipinfo_token)
 | 
			
		||||
 | 
			
		||||
  fn url-of [ip]{
 | 
			
		||||
  fn url-of {|ip|
 | 
			
		||||
    str:join '' [ 'ipinfo.io/' $ip '?token=' $token]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn info [ip]{
 | 
			
		||||
  fn info {|ip|
 | 
			
		||||
    if (ip:is-ip $ip) {
 | 
			
		||||
      var url = (url-of $ip)
 | 
			
		||||
      echo 'URL: '$url
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
edit:add-var ipof~ [@argv]{
 | 
			
		||||
edit:add-var ipof~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  use moi/util/condition
 | 
			
		||||
  use moi/util/ip
 | 
			
		||||
 | 
			
		||||
  fn less [cmp e1 e2]{ < ($cmp $e1 $e2) 0 }
 | 
			
		||||
  fn less {|cmp e1 e2| < ($cmp $e1 $e2) 0 }
 | 
			
		||||
 | 
			
		||||
  fn sort-ip [e1 e2]{
 | 
			
		||||
  fn sort-ip {|e1 e2|
 | 
			
		||||
    var i1 = (condition:cset (ip:is-ipv4 $e1) 0 (condition:cset (ip:is-ipv6 $e1) 1 2))
 | 
			
		||||
    var i2 = (condition:cset (ip:is-ipv4 $e2) 0 (condition:cset (ip:is-ipv6 $e2) 1 2))
 | 
			
		||||
    if (!= $i1 $i2) {
 | 
			
		||||
| 
						 | 
				
			
			@ -19,18 +19,18 @@ edit:add-var ipof~ [@argv]{
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn dnssolve [d]{
 | 
			
		||||
  fn dnssolve {|d|
 | 
			
		||||
    var result = [
 | 
			
		||||
      &ips=[&]
 | 
			
		||||
      &resolvers=''
 | 
			
		||||
      &txt=''
 | 
			
		||||
    ]
 | 
			
		||||
    e:dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml -resolve (idn -a $d) | peach [l]{
 | 
			
		||||
    e:dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml -resolve (idn -a $d) | peach {|l|
 | 
			
		||||
      var ll    = $l
 | 
			
		||||
      var idx   = (+ (str:index $ll :) 1)
 | 
			
		||||
      var value = (str:trim-space $ll[$idx".."])
 | 
			
		||||
      if (or (str:has-prefix $ll 'IPv4 addresses') (str:has-prefix $ll 'IPv6 addresses')) {
 | 
			
		||||
        str:split ', ' $value | peach [e]{
 | 
			
		||||
        str:split ', ' $value | peach {|e|
 | 
			
		||||
          var ee = $e
 | 
			
		||||
          if (ip:is-ip $ee) {
 | 
			
		||||
            set result[ips][$ee] = $nil
 | 
			
		||||
| 
						 | 
				
			
			@ -48,13 +48,13 @@ edit:add-var ipof~ [@argv]{
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  var hosts = [&]
 | 
			
		||||
  cat /etc/hosts | peach [l]{
 | 
			
		||||
  cat /etc/hosts | peach {|l|
 | 
			
		||||
    var ll = (str:trim-space $l)
 | 
			
		||||
    if (and (not-eq $ll '') (not-eq $ll[0] '#')) {
 | 
			
		||||
      put $ll
 | 
			
		||||
    }
 | 
			
		||||
  } | eawk [_ ip @domains]{
 | 
			
		||||
    peach [d]{
 | 
			
		||||
  } | eawk {|_ ip @domains|
 | 
			
		||||
    peach {|d|
 | 
			
		||||
      var dd = $d
 | 
			
		||||
      if (has-key $hosts $dd) {
 | 
			
		||||
        set hosts[$dd][$ip] = $nil
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ edit:add-var ipof~ [@argv]{
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  var remote = [&]
 | 
			
		||||
  peach [d]{
 | 
			
		||||
  peach {|d|
 | 
			
		||||
    var dd    = $d
 | 
			
		||||
    var solve = (dnssolve $dd)
 | 
			
		||||
    if (> (keys $solve[ips] | count) 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -73,14 +73,14 @@ edit:add-var ipof~ [@argv]{
 | 
			
		|||
    }
 | 
			
		||||
  } $argv
 | 
			
		||||
 | 
			
		||||
  each [d]{
 | 
			
		||||
  each {|d|
 | 
			
		||||
    var exists = $false
 | 
			
		||||
    echo (styled 'Resolving '$d'…' bright-green)
 | 
			
		||||
    echo
 | 
			
		||||
    if (has-key $hosts $d) {
 | 
			
		||||
      set exists = $true
 | 
			
		||||
      echo (styled '  local:' bright-yellow)
 | 
			
		||||
      keys $hosts[$d] | order &less-than=$sort-ip~ | each [ip]{
 | 
			
		||||
      keys $hosts[$d] | order &less-than=$sort-ip~ | each {|ip|
 | 
			
		||||
        echo '    - '$ip
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ edit:add-var ipof~ [@argv]{
 | 
			
		|||
      var info = $remote[$d]
 | 
			
		||||
      echo (styled '  remote:' bright-yellow)
 | 
			
		||||
      echo '    IPs:'
 | 
			
		||||
      keys $info[ips] | order &less-than=$sort-ip~ | each [ip]{
 | 
			
		||||
      keys $info[ips] | order &less-than=$sort-ip~ | each {|ip|
 | 
			
		||||
        echo '    - '$ip
 | 
			
		||||
      }
 | 
			
		||||
      echo '    Resolvers:   '$info[resolvers]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
fn -ls [@argv]{
 | 
			
		||||
fn -ls {|@argv|
 | 
			
		||||
    e:ls -N --color=auto --group-directories-first --ignore=lost+found '--time-style=+"%Y.%m.%d %H:%M"' --indicator-style=classify $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -go-ls [@argv]{
 | 
			
		||||
fn -go-ls {|@argv|
 | 
			
		||||
  e:go-ls --group-directories-first -T '+%Y.%m.%d %H:%M' --git $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var cmd = $-go-ls~
 | 
			
		||||
 | 
			
		||||
edit:add-var ls~ [@argv]{ $cmd $@argv }
 | 
			
		||||
edit:add-var la~ [@argv]{ $cmd -a $@argv }
 | 
			
		||||
edit:add-var ll~ [@argv]{ $cmd -lh $@argv }
 | 
			
		||||
edit:add-var lla~ [@argv]{ $cmd -lha $@argv }
 | 
			
		||||
edit:add-var ls~ {|@argv| $cmd $@argv }
 | 
			
		||||
edit:add-var la~ {|@argv| $cmd -a $@argv }
 | 
			
		||||
edit:add-var ll~ {|@argv| $cmd -lh $@argv }
 | 
			
		||||
edit:add-var lla~ {|@argv| $cmd -lha $@argv }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var meteo~ [@argv]{
 | 
			
		||||
edit:add-var meteo~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  #curl --connect-timeout 2 "wttr.in/"(joins '' $_args)"?lang=fr"
 | 
			
		||||
  e:curlie -s --connect-timeout 2 "wttr.in/"(str:join '' $argv)"?lang=fr"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
edit:add-var pacmanhisto~ [@argv]{ e:cat /var/log/pacman.log | e:grep "ALPM" | e:grep $@argv }
 | 
			
		||||
edit:add-var pacmanhisto~ {|@argv| e:cat /var/log/pacman.log | e:grep "ALPM" | e:grep $@argv }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var pdf2grey~ [@argv]{
 | 
			
		||||
edit:add-var pdf2grey~ {|@argv|
 | 
			
		||||
  use re
 | 
			
		||||
  use str
 | 
			
		||||
  var m = [
 | 
			
		||||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ edit:add-var pdf2grey~ [@argv]{
 | 
			
		|||
    &split=50
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  fn _help []{
 | 
			
		||||
  fn _help {||
 | 
			
		||||
    echo 'Usage: pdf2gray [-hn (<n>)] <input>.pdf <output>.pdf'
 | 
			
		||||
    echo ''
 | 
			
		||||
    echo 'Options:'
 | 
			
		||||
| 
						 | 
				
			
			@ -14,15 +14,15 @@ edit:add-var pdf2grey~ [@argv]{
 | 
			
		|||
    echo '  -n [0-100] Convertit en noir et blanc. Si un nombre est spécifié, indique le pourcentage de coupure (par défaut: 50)'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn is_pdf [e]{
 | 
			
		||||
  fn is_pdf {|e|
 | 
			
		||||
    re:match '.*\.pdf$' $e
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn is_int [e]{
 | 
			
		||||
  fn is_int {|e|
 | 
			
		||||
    re:match '^\d+$' $e
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fn is_split [e]{
 | 
			
		||||
  fn is_split {|e|
 | 
			
		||||
    and (>= $e 0) (<= $e 100)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
edit:add-var publicip~ [@argv]{
 | 
			
		||||
  var f = [t]{
 | 
			
		||||
edit:add-var publicip~ {|@argv|
 | 
			
		||||
  var f = {|t|
 | 
			
		||||
    use moi/util/condition
 | 
			
		||||
    set t = (condition:cset (eq $t -6) -6 -4)
 | 
			
		||||
    var l = (condition:cset (eq $t -6) 'IPv6: ' 'IPv4: ')
 | 
			
		||||
    curl $t ifconfig.co/ip 2> /dev/null | each [ip]{ echo (styled $l bold yellow) $ip }
 | 
			
		||||
    curl $t ifconfig.co/ip 2> /dev/null | each {|ip| echo (styled $l bold yellow) $ip }
 | 
			
		||||
  }
 | 
			
		||||
  $f -4
 | 
			
		||||
  $f -6
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,44 +1,44 @@
 | 
			
		|||
use str
 | 
			
		||||
use re
 | 
			
		||||
 | 
			
		||||
fn -bytes [begin size]{
 | 
			
		||||
fn -bytes {|begin size|
 | 
			
		||||
  str:from-codepoints (range $begin (+ $begin $size))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -upper []{
 | 
			
		||||
fn -upper {||
 | 
			
		||||
  -bytes 0x41 26
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -lower []{
 | 
			
		||||
fn -lower {||
 | 
			
		||||
  -bytes 0x61 26
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -digit []{
 | 
			
		||||
fn -digit {||
 | 
			
		||||
  -bytes 0x30 10
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -j [@strings]{
 | 
			
		||||
fn -j {|@strings|
 | 
			
		||||
  str:join '' $strings
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -alpha []{
 | 
			
		||||
fn -alpha {||
 | 
			
		||||
  -j (-upper) (-lower)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -alphanum []{
 | 
			
		||||
fn -alphanum {||
 | 
			
		||||
  -j (-alpha) (-digit)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -random [chars]{
 | 
			
		||||
fn -random {|chars|
 | 
			
		||||
  var size = (count $chars)
 | 
			
		||||
  print $chars[(randint 0 $size)]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -is-int [arg]{
 | 
			
		||||
fn -is-int {|arg|
 | 
			
		||||
  re:match '^\d+$' $arg
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -help []{
 | 
			
		||||
fn -help {||
 | 
			
		||||
  echo 'Génère une chaîne de caractères aléatoires'
 | 
			
		||||
  echo 'Usage: genstr [(-auldh)] [<chars>] [<size>]'
 | 
			
		||||
  echo ''
 | 
			
		||||
| 
						 | 
				
			
			@ -54,9 +54,9 @@ fn -help []{
 | 
			
		|||
  echo 'Si aucune classe de caractères ou liste de caractères n’est fournie, utilise les caractères alphanumériques ([A-Za-z0-9]).'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var genstr~ [@args]{
 | 
			
		||||
edit:add-var genstr~ {|@args|
 | 
			
		||||
  var len chars h = 0 '' $false
 | 
			
		||||
  each [e]{
 | 
			
		||||
  each {|e|
 | 
			
		||||
    if (or (eq $e -h) (eq $e --help)) {
 | 
			
		||||
      set h = $true
 | 
			
		||||
      -help
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ edit:add-var genstr~ [@args]{
 | 
			
		|||
 | 
			
		||||
    set chars = [(str:split '' $chars)]
 | 
			
		||||
 | 
			
		||||
    range $len | each [_]{
 | 
			
		||||
    range $len | each {|_|
 | 
			
		||||
      -random $chars
 | 
			
		||||
    }
 | 
			
		||||
    echo
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,3 @@
 | 
			
		|||
edit:add-var riot~ []{
 | 
			
		||||
edit:add-var riot~ {||
 | 
			
		||||
  cat $E:HOME/.config/elvish/private/riot.txt | xclip -selection clipboard
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var sendsms~ [@argv]{
 | 
			
		||||
edit:add-var sendsms~ {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
 | 
			
		||||
  var api   = https://smsapi.free-mobile.fr/sendmsg
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1,2 @@
 | 
			
		|||
edit:add-var trsen~ [@argv]{ e:rlwrap trans -b -t en $@argv }
 | 
			
		||||
edit:add-var trsfr~ [@argv]{ e:rlwrap trans -b -t fr $@argv }
 | 
			
		||||
edit:add-var trsen~ {|@argv| e:rlwrap trans -b -t en $@argv }
 | 
			
		||||
edit:add-var trsfr~ {|@argv| e:rlwrap trans -b -t fr $@argv }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
edit:add-var upd~ [@args]{
 | 
			
		||||
edit:add-var upd~ {|@args|
 | 
			
		||||
  if ?(mirror-check --fast) {
 | 
			
		||||
    sudo pacman -Syu
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
var cmd = $e:vim~
 | 
			
		||||
 | 
			
		||||
edit:add-var vi~ [@argv]{ $cmd $@argv }
 | 
			
		||||
edit:add-var vb~ [@argv]{ $cmd $@argv ~/.bashrc }
 | 
			
		||||
edit:add-var vc~ [@argv]{ $cmd $@argv ~/.vimrc }
 | 
			
		||||
edit:add-var ve~ [@argv]{ $cmd $@argv ~/.config/elvish/rc.elv }
 | 
			
		||||
edit:add-var vf~ [@argv]{ $cmd $@argv ~/.config/fish/config.fish }
 | 
			
		||||
edit:add-var vp~ [@argv]{ $cmd $@argv PKGBUILD }
 | 
			
		||||
edit:add-var vv~ [@argv]{ $cmd -R $@argv }
 | 
			
		||||
edit:add-var vz~ [@argv]{ $cmd $@argv ~/.zshrc }
 | 
			
		||||
edit:add-var vi~ {|@argv| $cmd $@argv }
 | 
			
		||||
edit:add-var vb~ {|@argv| $cmd $@argv ~/.bashrc }
 | 
			
		||||
edit:add-var vc~ {|@argv| $cmd $@argv ~/.vimrc }
 | 
			
		||||
edit:add-var ve~ {|@argv| $cmd $@argv ~/.config/elvish/rc.elv }
 | 
			
		||||
edit:add-var vf~ {|@argv| $cmd $@argv ~/.config/fish/config.fish }
 | 
			
		||||
edit:add-var vp~ {|@argv| $cmd $@argv PKGBUILD }
 | 
			
		||||
edit:add-var vv~ {|@argv| $cmd -R $@argv }
 | 
			
		||||
edit:add-var vz~ {|@argv| $cmd $@argv ~/.zshrc }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,16 @@
 | 
			
		|||
fn -sync [d1 d2]{
 | 
			
		||||
fn -sync {|d1 d2|
 | 
			
		||||
  rsync -azh --delete --info=progress2,stats ~/.config/$d1/ ~/.config/$d2/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -save [d]{
 | 
			
		||||
fn -save {|d|
 | 
			
		||||
  -sync $d $d.save
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -restore [d]{
 | 
			
		||||
fn -restore {|d|
 | 
			
		||||
  -sync $d.save $d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var viv-save~ []{ -save vivaldi }
 | 
			
		||||
edit:add-var viv-restore~ []{ -restore vivaldi }
 | 
			
		||||
edit:add-var vivd-save~ []{ -save vivaldi-developer }
 | 
			
		||||
edit:add-var vivd-restore~ []{ -restore vivaldi-developer }
 | 
			
		||||
edit:add-var viv-save~ {|| -save vivaldi }
 | 
			
		||||
edit:add-var viv-restore~ {|| -restore vivaldi }
 | 
			
		||||
edit:add-var vivd-save~ {|| -save vivaldi-developer }
 | 
			
		||||
edit:add-var vivd-restore~ {|| -restore vivaldi-developer }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,16 @@
 | 
			
		|||
var cmd = $e:yt-dlp~
 | 
			
		||||
#var cmd = $e:youtube-dl~
 | 
			
		||||
 | 
			
		||||
fn -dl [@argv]{
 | 
			
		||||
fn -dl {|@argv|
 | 
			
		||||
  $cmd --no-check-certificate $@argv 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -audio [@argv]{
 | 
			
		||||
fn -audio {|@argv|
 | 
			
		||||
  -dl -x --audio-format best $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var youtube-dl~ [@argv]{ -dl $@argv }
 | 
			
		||||
edit:add-var youtube-audio~ [@argv]{ -audio $@argv }
 | 
			
		||||
edit:add-var yt-dl~ [@argv]{ -dl $@argv }
 | 
			
		||||
edit:add-var yt-audio~ [@argv]{ -audio $@argv }
 | 
			
		||||
edit:add-var youtube-dl~ {|@argv| -dl $@argv }
 | 
			
		||||
edit:add-var youtube-audio~ {|@argv| -audio $@argv }
 | 
			
		||||
edit:add-var yt-dl~ {|@argv| -dl $@argv }
 | 
			
		||||
edit:add-var yt-audio~ {|@argv| -audio $@argv }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,20 +13,20 @@ var extensions = [ tar bz2 zip gz lz4 sz xz zst rar ]
 | 
			
		|||
 | 
			
		||||
fn -comp-commands { all $commands }
 | 
			
		||||
 | 
			
		||||
fn -comp-archive-files [m]{
 | 
			
		||||
fn -comp-archive-files {|m|
 | 
			
		||||
  var type = (condition:cset (eq $m '') prefix deep-prefix)
 | 
			
		||||
  file:match-extensions &type=$type $m $@extensions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -comp-inline-files [archive]{
 | 
			
		||||
fn -comp-inline-files {|archive|
 | 
			
		||||
  try {
 | 
			
		||||
    arc ls $archive | eawk [_ @argv]{ put $argv[-1] }
 | 
			
		||||
    arc ls $archive | eawk {|_ @argv| put $argv[-1] }
 | 
			
		||||
  } except e {
 | 
			
		||||
    nop
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  var c cmd = (count $argv) $argv[1]
 | 
			
		||||
  if (== $c 2) {
 | 
			
		||||
    -comp-commands
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,12 +17,12 @@ var description = [
 | 
			
		|||
]
 | 
			
		||||
 | 
			
		||||
fn -options {
 | 
			
		||||
  each [o]{
 | 
			
		||||
  each {|o|
 | 
			
		||||
    put [&short=$o &desc=$description[$o]]
 | 
			
		||||
  } $options
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  edit:complete-getopt $argv [(-options)] [ $edit:complete-filename~ ...]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ use moi/util/file
 | 
			
		|||
 | 
			
		||||
var extensions = [ tar bz2 zip gz lz4 sz xz zst rar ]
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  var m = $argv[-1]
 | 
			
		||||
  var type = (condition:cset (eq $m '') prefix deep-prefix)
 | 
			
		||||
  file:match-extensions &type=$type $m $@extensions
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ var np = [
 | 
			
		|||
  -V
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  var c = (count $argv)
 | 
			
		||||
  if (== $c 2) {
 | 
			
		||||
    all $options
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,12 +35,12 @@ var extensions = [
 | 
			
		|||
  wmx
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
fn -files [m]{
 | 
			
		||||
fn -files {|m|
 | 
			
		||||
  var type = (condition:cset (eq $m '') prefix deep-prefix)
 | 
			
		||||
  file:match-extensions &type=$type $m $@extensions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  var c = (count $argv)
 | 
			
		||||
  if (== $c 2) {
 | 
			
		||||
    put --speed
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,31 +2,31 @@ use moi/util/condition
 | 
			
		|||
use moi/util/file
 | 
			
		||||
use moi/util/list
 | 
			
		||||
 | 
			
		||||
fn -local-packages { pacman -Q | eawk [_ p @_]{ put $p } }
 | 
			
		||||
fn -local-packages { pacman -Q | eawk {|_ p @_| put $p } }
 | 
			
		||||
 | 
			
		||||
fn -repo-packages {
 | 
			
		||||
  var packages = [(pacman -Ss | list:ploop &step=2 [_ v]{
 | 
			
		||||
  var packages = [(pacman -Ss | list:ploop &step=2 {|_ v|
 | 
			
		||||
    put $v
 | 
			
		||||
  } | eawk [_ p @_]{
 | 
			
		||||
  } | eawk {|_ p @_|
 | 
			
		||||
    put $p
 | 
			
		||||
  })]
 | 
			
		||||
  var spackages = [&]
 | 
			
		||||
  use str
 | 
			
		||||
  peach [p]{
 | 
			
		||||
  peach {|p|
 | 
			
		||||
    str:split '/' $p
 | 
			
		||||
  } $packages | peach [e]{
 | 
			
		||||
  } $packages | peach {|e|
 | 
			
		||||
    set spackages[$e] = $nil
 | 
			
		||||
  }
 | 
			
		||||
  keys $spackages
 | 
			
		||||
  all $packages
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -downloaded-packages [m]{
 | 
			
		||||
fn -downloaded-packages {|m|
 | 
			
		||||
  var type = (condition:cset (eq $m '') prefix deep-prefix)
 | 
			
		||||
  file:match-extensions &type=$type $m tar.zst tar.xz tar.gz tar.bz2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -local-file [m]{ edit:complete-filename $m }
 | 
			
		||||
fn -local-file {|m| edit:complete-filename $m }
 | 
			
		||||
 | 
			
		||||
var options = [
 | 
			
		||||
  -h
 | 
			
		||||
| 
						 | 
				
			
			@ -81,7 +81,7 @@ var fpack = [
 | 
			
		|||
  -Qo
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  var c = (count $argv)
 | 
			
		||||
  if (< $c 3) {
 | 
			
		||||
    all $options
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,15 +16,15 @@ var names = [
 | 
			
		|||
]
 | 
			
		||||
 | 
			
		||||
fn -kh {
 | 
			
		||||
  cat ~/.ssh/known_hosts | peach [l]{
 | 
			
		||||
  cat ~/.ssh/known_hosts | peach {|l|
 | 
			
		||||
    put [(str:split ' ' $l)]
 | 
			
		||||
  } | peach [e]{
 | 
			
		||||
  } | peach {|e|
 | 
			
		||||
    var domains @_ = $@e
 | 
			
		||||
    str:split ',' $domains
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -port [cmd @argv]{
 | 
			
		||||
fn -port {|cmd @argv|
 | 
			
		||||
  var o     = (condition:cset (eq $cmd 'ssh') '-p' '-P')
 | 
			
		||||
  var margs = (option:map $argv)
 | 
			
		||||
  var p     = (map:value-of $margs $o &default=[])
 | 
			
		||||
| 
						 | 
				
			
			@ -35,24 +35,24 @@ fn -port [cmd @argv]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -complete-names []{ each [n]{ put $n'@' } $names }
 | 
			
		||||
fn -complete-names {|| each {|n| put $n'@' } $names }
 | 
			
		||||
 | 
			
		||||
fn -complete-domains [name hosts]{
 | 
			
		||||
  each [h]{
 | 
			
		||||
fn -complete-domains {|name hosts|
 | 
			
		||||
  each {|h|
 | 
			
		||||
    put $name@$h
 | 
			
		||||
  } $hosts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -complete-remote-dir [port address dir]{
 | 
			
		||||
fn -complete-remote-dir {|port address dir|
 | 
			
		||||
  try {
 | 
			
		||||
    ssh -p $port $address 'ls '$dir | each [f]{
 | 
			
		||||
    ssh -p $port $address 'ls '$dir | each {|f|
 | 
			
		||||
      put $address':'$dir$f
 | 
			
		||||
    }
 | 
			
		||||
  } except e {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -complete-args [hosts cmd @argv]{
 | 
			
		||||
fn -complete-args {|hosts cmd @argv|
 | 
			
		||||
  var arg = $argv[-1]
 | 
			
		||||
  var i   = (str:index $arg @)
 | 
			
		||||
  if (< $i 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ fn -complete-args [hosts cmd @argv]{
 | 
			
		|||
  -complete-domains $n $hosts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  var @hosts = (-kh)
 | 
			
		||||
  var cmd    = $argv[0]
 | 
			
		||||
  var is-ssh = (eq $cmd ssh)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
fn complete [@argv]{
 | 
			
		||||
fn complete {|@argv|
 | 
			
		||||
  if (and (> (count $argv) 2) (has-key $edit:completion:arg-completer $argv[1])) {
 | 
			
		||||
    $edit:completion:arg-completer[$argv[1]] (all $argv[1:])
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,13 +12,13 @@ var builtin_modules = [
 | 
			
		|||
  unix
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
set edit:completion:arg-completer[use] = [@argv]{
 | 
			
		||||
set edit:completion:arg-completer[use] = {|@argv|
 | 
			
		||||
  use str
 | 
			
		||||
  use path
 | 
			
		||||
  all $builtin_modules
 | 
			
		||||
  put $libdir/**.elv | each [f]{
 | 
			
		||||
  put $libdir/**.elv | each {|f|
 | 
			
		||||
    if (path:is-regular $f) {
 | 
			
		||||
      str:trim-prefix $f $libdir/
 | 
			
		||||
    }
 | 
			
		||||
  } | each [f]{ str:trim-suffix $f .elv }
 | 
			
		||||
  } | each {|f| str:trim-suffix $f .elv }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
edit:add-var ++~ [n]{ + $n 1 }
 | 
			
		||||
edit:add-var --~ [n]{ + $n 1 }
 | 
			
		||||
edit:add-var ++~ {|n| + $n 1 }
 | 
			
		||||
edit:add-var --~ {|n| + $n 1 }
 | 
			
		||||
 | 
			
		||||
edit:add-var sign~ [n]{
 | 
			
		||||
edit:add-var sign~ {|n|
 | 
			
		||||
  if (> $n 0) {
 | 
			
		||||
    put 1
 | 
			
		||||
  } elif (< $n 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -10,8 +10,8 @@ edit:add-var sign~ [n]{
 | 
			
		|||
    put 0
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
edit:add-var neg~ [n]{ * $n -1 }
 | 
			
		||||
edit:add-var abs~ [n]{
 | 
			
		||||
edit:add-var neg~ {|n| * $n -1 }
 | 
			
		||||
edit:add-var abs~ {|n|
 | 
			
		||||
  if (< $n 0) {
 | 
			
		||||
    neg $n
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -19,18 +19,18 @@ edit:add-var abs~ [n]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var sum~ [@numbers]{
 | 
			
		||||
edit:add-var sum~ {|@numbers|
 | 
			
		||||
  var s = 0
 | 
			
		||||
  each [e]{ set s = (+ $s e) } (to-list $numbers)
 | 
			
		||||
  each {|e| set s = (+ $s e) } (to-list $numbers)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -minmax [t @numbers]{
 | 
			
		||||
fn -minmax {|t @numbers|
 | 
			
		||||
  var l = (to-list $@numbers)
 | 
			
		||||
  if (== (count $l) 0) {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  var m = $l[0]
 | 
			
		||||
  each [n]{
 | 
			
		||||
  each {|n|
 | 
			
		||||
    if ($t $n $m) {
 | 
			
		||||
        set m = $n
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -38,5 +38,5 @@ fn -minmax [t @numbers]{
 | 
			
		|||
  put $m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
edit:add-var min~ [@numbers]{ -minmax $'<~' $@numbers }
 | 
			
		||||
edit:add-var max~ [@numbers]{ -minmax $'>~' $@numbers }
 | 
			
		||||
edit:add-var min~ {|@numbers| -minmax $'<~' $@numbers }
 | 
			
		||||
edit:add-var max~ {|@numbers| -minmax $'>~' $@numbers }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
fn cset [c t f]{
 | 
			
		||||
fn cset {|c t f|
 | 
			
		||||
  if $c {
 | 
			
		||||
    put $t
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -6,11 +6,11 @@ fn cset [c t f]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn mset [c t f]{
 | 
			
		||||
fn mset {|c t f|
 | 
			
		||||
  all (cset $c $t $f)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn call [c t f @argv]{
 | 
			
		||||
fn call {|c t f @argv|
 | 
			
		||||
  var v = (cset $c $t $f)
 | 
			
		||||
  if (is (kind-of $v) fn) {
 | 
			
		||||
    $v $@argv
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,16 +3,16 @@ use ./list
 | 
			
		|||
use ./map
 | 
			
		||||
 | 
			
		||||
var search-type = [
 | 
			
		||||
  &exact=       [m]{ ls $m 2>/dev/null }
 | 
			
		||||
  &match=       [m]{ put *$m* }
 | 
			
		||||
  &prefix=      [m]{ put $m* }
 | 
			
		||||
  &suffix=      [m]{ put *$m }
 | 
			
		||||
  &deep-match=  [m]{ put **$m** }
 | 
			
		||||
  &deep-prefix= [m]{ put $m** }
 | 
			
		||||
  &deep-suffix= [m]{ put **$m }
 | 
			
		||||
  &exact=       {|m| ls $m 2>/dev/null }
 | 
			
		||||
  &match=       {|m| put *$m* }
 | 
			
		||||
  &prefix=      {|m| put $m* }
 | 
			
		||||
  &suffix=      {|m| put *$m }
 | 
			
		||||
  &deep-match=  {|m| put **$m** }
 | 
			
		||||
  &deep-prefix= {|m| put $m** }
 | 
			
		||||
  &deep-suffix= {|m| put **$m }
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
fn -less [f1 f2]{
 | 
			
		||||
fn -less {|f1 f2|
 | 
			
		||||
  var fl1 fl2 = (str:to-lower $f1) (str:to-lower $f2)
 | 
			
		||||
  var c       = (str:compare $fl1 $fl2)
 | 
			
		||||
  if (== $c 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ fn -less [f1 f2]{
 | 
			
		|||
  put (< $c 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -get-results [sort result]{
 | 
			
		||||
fn -get-results {|sort result|
 | 
			
		||||
  if $sort {
 | 
			
		||||
    keys $result | order $-less~
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -29,14 +29,14 @@ fn -get-results [sort result]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -search [&sort=$false &type=exact @motive]{
 | 
			
		||||
fn -search {|&sort=$false &type=exact @motive|
 | 
			
		||||
  var f result = $search-type[$type] [&]
 | 
			
		||||
  if (list:empty $motive) {
 | 
			
		||||
    set result = (put * | map:to-set)
 | 
			
		||||
  } else {
 | 
			
		||||
    peach [m]{
 | 
			
		||||
    peach {|m|
 | 
			
		||||
      try {
 | 
			
		||||
        $f $m | peach [e]{
 | 
			
		||||
        $f $m | peach {|e|
 | 
			
		||||
          set result[$e] = $nil
 | 
			
		||||
        }
 | 
			
		||||
      } except e { }
 | 
			
		||||
| 
						 | 
				
			
			@ -45,12 +45,12 @@ fn -search [&sort=$false &type=exact @motive]{
 | 
			
		|||
  -get-results $sort $result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn match-files [&sort=$false &type=prefix @motive]{ -search &sort=$sort &type=$type $@motive }
 | 
			
		||||
fn match-files {|&sort=$false &type=prefix @motive| -search &sort=$sort &type=$type $@motive }
 | 
			
		||||
 | 
			
		||||
fn match-extensions [&sort=$false &type=deep-prefix motive @extensions]{
 | 
			
		||||
fn match-extensions {|&sort=$false &type=deep-prefix motive @extensions|
 | 
			
		||||
  var result = [&]
 | 
			
		||||
  -search &type=$type $motive | peach [f]{
 | 
			
		||||
    if (list:contains [e]{ str:has-suffix $f .$e } $extensions) {
 | 
			
		||||
  -search &type=$type $motive | peach {|f|
 | 
			
		||||
    if (list:contains {|e| str:has-suffix $f .$e } $extensions) {
 | 
			
		||||
      set result[$f] = $nil
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,16 @@
 | 
			
		|||
use re
 | 
			
		||||
use str
 | 
			
		||||
 | 
			
		||||
fn is-ipv4 [arg]{
 | 
			
		||||
fn is-ipv4 {|arg|
 | 
			
		||||
  if (not (re:match '^([0-9]{1,3}\.){3}[0-9]{1,3}$' $arg)) {
 | 
			
		||||
    put $false
 | 
			
		||||
  } else {
 | 
			
		||||
    use ./list
 | 
			
		||||
    not (str:split '.' $arg | list:contains [p]{ > $p 255 })
 | 
			
		||||
    not (str:split '.' $arg | list:contains {|p| > $p 255 })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn is-ipv6 [arg]{
 | 
			
		||||
fn is-ipv6 {|arg|
 | 
			
		||||
  var p     = '[0-9a-fA-F]{1,4}'
 | 
			
		||||
  var g1 g2 = '('$p':)' '(:'$p')'
 | 
			
		||||
  var cases = [
 | 
			
		||||
| 
						 | 
				
			
			@ -29,27 +29,27 @@ fn is-ipv6 [arg]{
 | 
			
		|||
  put (re:match $r $arg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn is-ip [arg]{ or (is-ipv4 $arg) (is-ipv6 $arg) }
 | 
			
		||||
fn is-ip {|arg| or (is-ipv4 $arg) (is-ipv6 $arg) }
 | 
			
		||||
 | 
			
		||||
fn -long-part6 [p]{
 | 
			
		||||
fn -long-part6 {|p|
 | 
			
		||||
  use str
 | 
			
		||||
  set p = (str:to-lower $p)
 | 
			
		||||
  var c = (- 4 (count $p))
 | 
			
		||||
  put (repeat $c '0' | str:join '')$p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -middle-part6 [p]{
 | 
			
		||||
fn -middle-part6 {|p|
 | 
			
		||||
  while (and (> (count $p) 1) (eq $p[0] 0)) {
 | 
			
		||||
    set p = $p[1..]
 | 
			
		||||
  }
 | 
			
		||||
  put $p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -find-max0 [parts]{
 | 
			
		||||
fn -find-max0 {|parts|
 | 
			
		||||
  use ./list
 | 
			
		||||
  var idx s   = -1 1
 | 
			
		||||
  var ci cs f = -1 0 $false
 | 
			
		||||
  list:loop [i p]{
 | 
			
		||||
  list:loop {|i p|
 | 
			
		||||
    if (eq $p 0) {
 | 
			
		||||
      condition:call $f { set cs = (+ $cs 1) } { set ci cs f = $i 1 $true }
 | 
			
		||||
    } elif $f {
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ fn -find-max0 [parts]{
 | 
			
		|||
  put $idx $s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn long6 [ip]{
 | 
			
		||||
fn long6 {|ip|
 | 
			
		||||
  if (not (is-ipv6 $ip)) {
 | 
			
		||||
    fail 'Not an IPv6'
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -82,11 +82,11 @@ fn long6 [ip]{
 | 
			
		|||
  str:split ':' $ip | each $-long-part6~ | str:join ':'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn middle6 [ip]{
 | 
			
		||||
fn middle6 {|ip|
 | 
			
		||||
  str:split ':' (long6 $ip) | each $-middle-part6~ | str:join ':'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn short6 [ip]{
 | 
			
		||||
fn short6 {|ip|
 | 
			
		||||
  var parts = [(str:split ':' (middle6 $ip))]
 | 
			
		||||
  var i s   = (-find-max0 $parts)
 | 
			
		||||
  if (>= $i 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -102,13 +102,13 @@ fn short6 [ip]{
 | 
			
		|||
  str:join ':' $parts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn is-ip [arg]{ or (is-ipv4 $arg) (is-ipv6 $arg) }
 | 
			
		||||
fn is-ip {|arg| or (is-ipv4 $arg) (is-ipv6 $arg) }
 | 
			
		||||
 | 
			
		||||
fn -cmp [e1 e2]{
 | 
			
		||||
fn -cmp {|e1 e2|
 | 
			
		||||
  use ./list
 | 
			
		||||
  use ./condition
 | 
			
		||||
  var c = 0
 | 
			
		||||
  list:loop [i p1]{
 | 
			
		||||
  list:loop {|i p1|
 | 
			
		||||
    var p2 = $e2[$i]
 | 
			
		||||
    set c = (condition:cset (< $p1 $p2) -1 (condition:cset (> $p1 $p2) 1 0))
 | 
			
		||||
    if (!= $c 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -118,21 +118,21 @@ fn -cmp [e1 e2]{
 | 
			
		|||
  put $c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn cmp4 [ip1 ip2]{
 | 
			
		||||
fn cmp4 {|ip1 ip2|
 | 
			
		||||
  if (or (not (is-ipv4 $ip1)) (not (is-ipv4 $ip2))) {
 | 
			
		||||
    fail 'Not an IPv4 '$ip1' → '$ip2
 | 
			
		||||
  }
 | 
			
		||||
  -cmp [(str:split . $ip1)] [(str:split . $ip2)]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn cmp6 [ip1 ip2]{
 | 
			
		||||
fn cmp6 {|ip1 ip2|
 | 
			
		||||
  if (or (not (is-ipv6 $ip1)) (not (is-ipv6 $ip2))) {
 | 
			
		||||
    fail 'Not an IPv6: '$ip1' → '$ip2
 | 
			
		||||
  }
 | 
			
		||||
  -cmp [(str:split : (middle6 $ip1))] [(str:split : (middle6 $ip2))]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn cmp [ip1 ip2]{
 | 
			
		||||
fn cmp {|ip1 ip2|
 | 
			
		||||
  if (is-ipv4 $ip1) {
 | 
			
		||||
    if (is-ipv4 $ip2) {
 | 
			
		||||
      cmp4 $ip1 $ip2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,27 +1,27 @@
 | 
			
		|||
use builtin
 | 
			
		||||
use str
 | 
			
		||||
 | 
			
		||||
fn -p [@argv]{
 | 
			
		||||
fn -p {|@argv|
 | 
			
		||||
  var c = (count $argv)
 | 
			
		||||
  if (== $c 0) {
 | 
			
		||||
    put [ (all) ]
 | 
			
		||||
  } elif (== $c 1) {
 | 
			
		||||
    put $argv[0]
 | 
			
		||||
  } else {
 | 
			
		||||
    fail '0 or 1 argument needed given '$c' arguments: ['(each [e]{ put '"'$e'"' } $argv | str:join ', ')']'
 | 
			
		||||
    fail '0 or 1 argument needed given '$c' arguments: ['(each {|e| put '"'$e'"' } $argv | str:join ', ')']'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -r [step begin end]{
 | 
			
		||||
fn -r {|step begin end|
 | 
			
		||||
  if (> $step 0) {
 | 
			
		||||
    builtin:range &step=$step $begin (+ $end 1)
 | 
			
		||||
  } else {
 | 
			
		||||
    var d = (+ $begin $end)
 | 
			
		||||
    builtin:range &step=(* $step -1) $end (+ $begin 1) | each [e]{ - $d $e }
 | 
			
		||||
    builtin:range &step=(* $step -1) $end (+ $begin 1) | each {|e| - $d $e }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn to-list [@argv]{
 | 
			
		||||
fn to-list {|@argv|
 | 
			
		||||
  try {
 | 
			
		||||
    -p $@argv
 | 
			
		||||
  } except e {
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ fn to-list [@argv]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn range [&step=1 b @r]{
 | 
			
		||||
fn range {|&step=1 b @r|
 | 
			
		||||
  if (== $step 0) {
 | 
			
		||||
    fail 'bad value: step must be positive, but is 0'
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +48,7 @@ fn range [&step=1 b @r]{
 | 
			
		|||
  -r $step $b $e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn indexes [&from=$false &step=1 @argv]{
 | 
			
		||||
fn indexes {|&from=$false &step=1 @argv|
 | 
			
		||||
  if (== $step 0) {
 | 
			
		||||
    fail 'bad value: step must be positive, but is 0'
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -74,16 +74,16 @@ fn indexes [&from=$false &step=1 @argv]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -for [&from=$false &step=1 @argv]{
 | 
			
		||||
fn -for {|&from=$false &step=1 @argv|
 | 
			
		||||
  var l = (-p $@argv)
 | 
			
		||||
  indexes &from=$from &step=$step $l | each [i]{ put [ $i $l[$i] ] }
 | 
			
		||||
  indexes &from=$from &step=$step $l | each {|i| put [ $i $l[$i] ] }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn loop [&from=$false &step=1 &end=$false cb @argv]{
 | 
			
		||||
fn loop {|&from=$false &step=1 &end=$false cb @argv|
 | 
			
		||||
  if (not $end) {
 | 
			
		||||
    -for &from=$from &step=$step $@argv | each [e]{ $cb $@e }
 | 
			
		||||
    -for &from=$from &step=$step $@argv | each {|e| $cb $@e }
 | 
			
		||||
  } else {
 | 
			
		||||
    -for &from=$from &step=$step $@argv | each [e]{
 | 
			
		||||
    -for &from=$from &step=$step $@argv | each {|e|
 | 
			
		||||
      var i v = $@e
 | 
			
		||||
      if ($end $i $v) {
 | 
			
		||||
        break
 | 
			
		||||
| 
						 | 
				
			
			@ -92,25 +92,25 @@ fn loop [&from=$false &step=1 &end=$false cb @argv]{
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
fn ploop [&from=$false &step=1 cb @argv]{
 | 
			
		||||
  -for &from=$from &step=$step $@argv | peach [e]{ $cb $@e }
 | 
			
		||||
fn ploop {|&from=$false &step=1 cb @argv|
 | 
			
		||||
  -for &from=$from &step=$step $@argv | peach {|e| $cb $@e }
 | 
			
		||||
}
 | 
			
		||||
fn reverse [@argv]{ loop &step=-1 [_ e]{ put $e } $@argv }
 | 
			
		||||
fn reach [cb @argv]{ reverse $@argv | each [e]{ cb $e } }
 | 
			
		||||
fn reverse {|@argv| loop &step=-1 {|_ e| put $e } $@argv }
 | 
			
		||||
fn reach {|cb @argv| reverse $@argv | each {|e| cb $e } }
 | 
			
		||||
 | 
			
		||||
fn empty [@argv]{ == (count (-p $@argv)) 0 }
 | 
			
		||||
fn not-empty [@argv]{ not (empty $@argv) }
 | 
			
		||||
fn empty {|@argv| == (count (-p $@argv)) 0 }
 | 
			
		||||
fn not-empty {|@argv| not (empty $@argv) }
 | 
			
		||||
 | 
			
		||||
fn filter [cb @argv]{
 | 
			
		||||
  each [v]{
 | 
			
		||||
fn filter {|cb @argv|
 | 
			
		||||
  each {|v|
 | 
			
		||||
    if ($cb $v) {
 | 
			
		||||
      put $v
 | 
			
		||||
    }
 | 
			
		||||
  } (-p $@argv)
 | 
			
		||||
}
 | 
			
		||||
fn filter-not [cb @argv]{ filter [v]{ not ($cb $v) } $@argv }
 | 
			
		||||
fn first [&from=$false &reverse=$false cb @argv]{
 | 
			
		||||
  var f = [v]{
 | 
			
		||||
fn filter-not {|cb @argv| filter {|v| not ($cb $v) } $@argv }
 | 
			
		||||
fn first {|&from=$false &reverse=$false cb @argv|
 | 
			
		||||
  var f = {|v|
 | 
			
		||||
    if ($cb $v) {
 | 
			
		||||
      put $v
 | 
			
		||||
      break
 | 
			
		||||
| 
						 | 
				
			
			@ -148,21 +148,21 @@ fn first [&from=$false &reverse=$false cb @argv]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn filter-index [cb @argv]{
 | 
			
		||||
  loop [i v]{
 | 
			
		||||
fn filter-index {|cb @argv|
 | 
			
		||||
  loop {|i v|
 | 
			
		||||
    if ($cb $v) {
 | 
			
		||||
      put $i
 | 
			
		||||
    }
 | 
			
		||||
  } $@argv
 | 
			
		||||
}
 | 
			
		||||
fn filter-index-not [cb @argv]{ filter-index [v]{ not ($cb $v) } $@argv }
 | 
			
		||||
fn first-index [&from=$false &reverse=$false cb @argv]{
 | 
			
		||||
fn filter-index-not {|cb @argv| filter-index {|v| not ($cb $v) } $@argv }
 | 
			
		||||
fn first-index {|&from=$false &reverse=$false cb @argv|
 | 
			
		||||
  var idx = -1
 | 
			
		||||
  var step = 1
 | 
			
		||||
  if $reverse {
 | 
			
		||||
    set step = -1
 | 
			
		||||
  }
 | 
			
		||||
  loop &from=$from &step=$step [i v]{
 | 
			
		||||
  loop &from=$from &step=$step {|i v|
 | 
			
		||||
    if ($cb $v) {
 | 
			
		||||
      set idx = $i
 | 
			
		||||
      break
 | 
			
		||||
| 
						 | 
				
			
			@ -171,20 +171,20 @@ fn first-index [&from=$false &reverse=$false cb @argv]{
 | 
			
		|||
  put $idx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn search [cb @argv]{
 | 
			
		||||
  loop [i v]{
 | 
			
		||||
fn search {|cb @argv|
 | 
			
		||||
  loop {|i v|
 | 
			
		||||
    if ($cb $i $v) {
 | 
			
		||||
      put $v
 | 
			
		||||
    }
 | 
			
		||||
  } $@argv
 | 
			
		||||
}
 | 
			
		||||
fn search-not [cb @argv]{ search [i v]{ not ($cb $i $v) } $@argv }
 | 
			
		||||
fn search-first [&from=$false &reverse=$false cb @argv]{
 | 
			
		||||
fn search-not {|cb @argv| search {|i v| not ($cb $i $v) } $@argv }
 | 
			
		||||
fn search-first {|&from=$false &reverse=$false cb @argv|
 | 
			
		||||
  var step = 1
 | 
			
		||||
  if $reverse {
 | 
			
		||||
    set step = -1
 | 
			
		||||
  }
 | 
			
		||||
  loop &from=$from &step=$step [i v]{
 | 
			
		||||
  loop &from=$from &step=$step {|i v|
 | 
			
		||||
    if ($cb $i $v) {
 | 
			
		||||
      put $v
 | 
			
		||||
      break
 | 
			
		||||
| 
						 | 
				
			
			@ -192,21 +192,21 @@ fn search-first [&from=$false &reverse=$false cb @argv]{
 | 
			
		|||
  } $@argv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn search-index [cb @argv]{
 | 
			
		||||
  loop [i v]{
 | 
			
		||||
fn search-index {|cb @argv|
 | 
			
		||||
  loop {|i v|
 | 
			
		||||
    if ($cb $i $v) {
 | 
			
		||||
      put $i
 | 
			
		||||
    }
 | 
			
		||||
  } $@argv
 | 
			
		||||
}
 | 
			
		||||
fn search-index-not [cb @argv]{ search-index [i v]{ not ($cb $i $v) } $@argv }
 | 
			
		||||
fn search-first-index [&from=$false &reverse=$false cb @argv]{
 | 
			
		||||
fn search-index-not {|cb @argv| search-index {|i v| not ($cb $i $v) } $@argv }
 | 
			
		||||
fn search-first-index {|&from=$false &reverse=$false cb @argv|
 | 
			
		||||
  var idx = -1
 | 
			
		||||
  var step = 1
 | 
			
		||||
  if $reverse {
 | 
			
		||||
    set step = -1
 | 
			
		||||
  }
 | 
			
		||||
  loop &from=$from &step=$step [i v]{
 | 
			
		||||
  loop &from=$from &step=$step {|i v|
 | 
			
		||||
    if ($cb $i $v) {
 | 
			
		||||
      set idx = $i
 | 
			
		||||
      break
 | 
			
		||||
| 
						 | 
				
			
			@ -215,9 +215,9 @@ fn search-first-index [&from=$false &reverse=$false cb @argv]{
 | 
			
		|||
  put $idx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn contains [cb @argv]{
 | 
			
		||||
fn contains {|cb @argv|
 | 
			
		||||
  var e =  $false
 | 
			
		||||
  each [v]{
 | 
			
		||||
  each {|v|
 | 
			
		||||
    if ($cb $v) {
 | 
			
		||||
      set e = $true
 | 
			
		||||
      break
 | 
			
		||||
| 
						 | 
				
			
			@ -225,11 +225,11 @@ fn contains [cb @argv]{
 | 
			
		|||
  } (-p $@argv)
 | 
			
		||||
  put $e
 | 
			
		||||
}
 | 
			
		||||
fn contains-not [cb @argv]{ contains [v]{ not ($cb $v) } $@argv }
 | 
			
		||||
fn contains-not {|cb @argv| contains {|v| not ($cb $v) } $@argv }
 | 
			
		||||
 | 
			
		||||
fn exists [cb @argv]{
 | 
			
		||||
fn exists {|cb @argv|
 | 
			
		||||
  var e = $false
 | 
			
		||||
  loop [i v]{
 | 
			
		||||
  loop {|i v|
 | 
			
		||||
    if ($cb $i $v) {
 | 
			
		||||
      set e = $true
 | 
			
		||||
      break
 | 
			
		||||
| 
						 | 
				
			
			@ -237,38 +237,38 @@ fn exists [cb @argv]{
 | 
			
		|||
  } $@argv
 | 
			
		||||
  put $e
 | 
			
		||||
}
 | 
			
		||||
fn exists-not [cb @argv]{ exists [i v]{ $cb $i $v } $@argv }
 | 
			
		||||
fn exists-not {|cb @argv| exists {|i v| $cb $i $v } $@argv }
 | 
			
		||||
 | 
			
		||||
fn includes [v @argv]{ contains [e]{ is $v $e } $@argv }
 | 
			
		||||
fn includes-not [v @argv]{ contains-not [e]{ is $v $e } $@argv }
 | 
			
		||||
fn includes {|v @argv| contains {|e| is $v $e } $@argv }
 | 
			
		||||
fn includes-not {|v @argv| contains-not {|e| is $v $e } $@argv }
 | 
			
		||||
 | 
			
		||||
fn reduce [v cb @argv]{
 | 
			
		||||
  each [e]{ set v = ($cb $v $e) } (to-list $@argv)
 | 
			
		||||
fn reduce {|v cb @argv|
 | 
			
		||||
  each {|e| set v = ($cb $v $e) } (to-list $@argv)
 | 
			
		||||
  put $v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn remove-duplicate [@argv]{
 | 
			
		||||
fn remove-duplicate {|@argv|
 | 
			
		||||
  var done = [&]
 | 
			
		||||
  each [v]{
 | 
			
		||||
  each {|v|
 | 
			
		||||
    put [&v=$v &e=(has-key $done $v)]
 | 
			
		||||
    set done[$v] = $nil
 | 
			
		||||
  } (-p $@argv) | each [v]{
 | 
			
		||||
  } (-p $@argv) | each {|v|
 | 
			
		||||
    assoc $v k (not $v[e])
 | 
			
		||||
  } | each [v]{
 | 
			
		||||
  } | each {|v|
 | 
			
		||||
    if $v[k] {
 | 
			
		||||
      put $v[v]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
fn premove-duplicate [@argv]{
 | 
			
		||||
fn premove-duplicate {|@argv|
 | 
			
		||||
  var done = [&]
 | 
			
		||||
  peach [v]{
 | 
			
		||||
  peach {|v|
 | 
			
		||||
    set done[$v] = $nil
 | 
			
		||||
  } (-p $@argv)
 | 
			
		||||
  keys $done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn swap [i j @argv]{
 | 
			
		||||
fn swap {|i j @argv|
 | 
			
		||||
  var l = (-p $@argv)
 | 
			
		||||
  var c = (count $l)
 | 
			
		||||
  set i j = (-i $i $c) (-i $j $c)
 | 
			
		||||
| 
						 | 
				
			
			@ -289,8 +289,8 @@ fn swap [i j @argv]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn less [cb]{
 | 
			
		||||
  var l = [a b]{ < ($cb $a $b) 0 }
 | 
			
		||||
fn less {|cb|
 | 
			
		||||
  var l = {|a b| < ($cb $a $b) 0 }
 | 
			
		||||
  put $l
 | 
			
		||||
}
 | 
			
		||||
fn sort [cb @argv]{ order &less-than=(less $cb) (-p $@argv) }
 | 
			
		||||
fn sort {|cb @argv| order &less-than=(less $cb) (-p $@argv) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
fn empty [container]{ == (count $container) 0 }
 | 
			
		||||
fn empty {|container| == (count $container) 0 }
 | 
			
		||||
 | 
			
		||||
fn values [container]{ keys $container | each [v]{ put $container[$v] } }
 | 
			
		||||
fn pvalues [container]{ keys $container | peach [v]{ put $container[$v] } }
 | 
			
		||||
fn values {|container| keys $container | each {|v| put $container[$v] } }
 | 
			
		||||
fn pvalues {|container| keys $container | peach {|v| put $container[$v] } }
 | 
			
		||||
 | 
			
		||||
fn value-of [container k &default=$nil]{
 | 
			
		||||
fn value-of {|container k &default=$nil|
 | 
			
		||||
  if (has-key $container $k) {
 | 
			
		||||
    put $container[$k]
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -11,54 +11,54 @@ fn value-of [container k &default=$nil]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn unzip [container]{
 | 
			
		||||
fn unzip {|container|
 | 
			
		||||
  var lkeys lvalues = [] []
 | 
			
		||||
  keys $container | each [k]{
 | 
			
		||||
  keys $container | each {|k|
 | 
			
		||||
    set lkeys   = [(all $lkeys) $k]
 | 
			
		||||
    set lvalues = [(all $lvalues) $container[$k]]
 | 
			
		||||
  }
 | 
			
		||||
  put $lkeys $lvalues
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn zip [lkeys lvalues]{
 | 
			
		||||
fn zip {|lkeys lvalues|
 | 
			
		||||
  var ck cv = (count $lkeys) (count $lvalues)
 | 
			
		||||
  var c = $ck
 | 
			
		||||
  if (> $ck $cv) {
 | 
			
		||||
    set c = $cv
 | 
			
		||||
  }
 | 
			
		||||
  var result = [&]
 | 
			
		||||
  range $c | peach [i]{
 | 
			
		||||
  range $c | peach {|i|
 | 
			
		||||
    put [&k=$lkeys[$i] &i=$i]
 | 
			
		||||
  } | peach [e]{
 | 
			
		||||
  } | peach {|e|
 | 
			
		||||
    assoc $e v $lvalues[$e[i]]
 | 
			
		||||
  } | each [e]{
 | 
			
		||||
  } | each {|e|
 | 
			
		||||
    set result[$e[k]] = $e[v]
 | 
			
		||||
  }
 | 
			
		||||
  put $result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn to-map [@argv]{
 | 
			
		||||
fn to-map {|@argv|
 | 
			
		||||
  use ./list
 | 
			
		||||
  var container = (list:to-list $@argv)
 | 
			
		||||
  zip [(range (count $container))] $container
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn to-set [@argv]{
 | 
			
		||||
fn to-set {|@argv|
 | 
			
		||||
  use ./list
 | 
			
		||||
  var m = [&]
 | 
			
		||||
  each [k]{ set m[$k] = $nil } (list:to-list $@argv)
 | 
			
		||||
  each {|k| set m[$k] = $nil } (list:to-list $@argv)
 | 
			
		||||
  put $m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn mdissoc [container @argv]{
 | 
			
		||||
  each [k]{
 | 
			
		||||
fn mdissoc {|container @argv|
 | 
			
		||||
  each {|k|
 | 
			
		||||
    set container = (dissoc $container $k)
 | 
			
		||||
  } $argv
 | 
			
		||||
  put $container
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn massoc [&replace=$true container @argv]{
 | 
			
		||||
  each [e]{
 | 
			
		||||
fn massoc {|&replace=$true container @argv|
 | 
			
		||||
  each {|e|
 | 
			
		||||
    var k v = $@e
 | 
			
		||||
    if (or $replace (not (has-key $container $k))) {
 | 
			
		||||
      set container[$k] = $v
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ fn massoc [&replace=$true container @argv]{
 | 
			
		|||
  put $container
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn add [container key @values]{
 | 
			
		||||
fn add {|container key @values|
 | 
			
		||||
  use ./list
 | 
			
		||||
  var values = (list:to-list $values)
 | 
			
		||||
  if (has-key $container $key) {
 | 
			
		||||
| 
						 | 
				
			
			@ -78,17 +78,17 @@ fn add [container key @values]{
 | 
			
		|||
  put $container
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn join [container container2]{
 | 
			
		||||
  keys $container2 | each [k]{
 | 
			
		||||
fn join {|container container2|
 | 
			
		||||
  keys $container2 | each {|k|
 | 
			
		||||
    set container[$k] = $container2[$k]
 | 
			
		||||
  }
 | 
			
		||||
  put $container
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn sorted-keys [&reverse=$false &less-than=$nil container]{
 | 
			
		||||
fn sorted-keys {|&reverse=$false &less-than=$nil container|
 | 
			
		||||
  keys $container | order &reverse=$reverse &less-than=$less-than
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn sorted-values [&reverse=$false &less-than=$nil container]{
 | 
			
		||||
fn sorted-values {|&reverse=$false &less-than=$nil container|
 | 
			
		||||
  values $container | order &reverse=$reverse &less-than=$less-than
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,14 +2,14 @@ use re
 | 
			
		|||
use str
 | 
			
		||||
use ./list
 | 
			
		||||
 | 
			
		||||
fn is-moptions [o]{ re:match '^\-\w{2,}$' $o }
 | 
			
		||||
fn is-soption [o]{ re:match '^\-\w$' $o }
 | 
			
		||||
fn is-loption [o]{ re:match '^\-\-\w+(=.*)?$' $o }
 | 
			
		||||
fn is-option [o]{ or (is-soption $o) (is-loption $o) (is-moptions $o) }
 | 
			
		||||
fn is-moptions {|o| re:match '^\-\w{2,}$' $o }
 | 
			
		||||
fn is-soption {|o| re:match '^\-\w$' $o }
 | 
			
		||||
fn is-loption {|o| re:match '^\-\-\w+(=.*)?$' $o }
 | 
			
		||||
fn is-option {|o| or (is-soption $o) (is-loption $o) (is-moptions $o) }
 | 
			
		||||
 | 
			
		||||
fn -splitm [o]{ each [e]{ put -$e } $o[1:] }
 | 
			
		||||
fn -splitm {|o| each {|e| put -$e } $o[1:] }
 | 
			
		||||
 | 
			
		||||
fn -splitl [o]{
 | 
			
		||||
fn -splitl {|o|
 | 
			
		||||
  if (str:contains $o '=') {
 | 
			
		||||
    var opt @value = (str:split '=' $o)
 | 
			
		||||
    put $opt
 | 
			
		||||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ fn -splitl [o]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn split [o]{
 | 
			
		||||
fn split {|o|
 | 
			
		||||
  if (is-moptions $o) {
 | 
			
		||||
    -splitm $o
 | 
			
		||||
  } elif (is-loption $o) {
 | 
			
		||||
| 
						 | 
				
			
			@ -29,17 +29,17 @@ fn split [o]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -joins [opt]{
 | 
			
		||||
  var o = (each [o]{ put $o[1:] } $opt | str:join '')
 | 
			
		||||
fn -joins {|opt|
 | 
			
		||||
  var o = (each {|o| put $o[1:] } $opt | str:join '')
 | 
			
		||||
  if (not-eq $o '') { put -$o }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn join [@opt]{
 | 
			
		||||
fn join {|@opt|
 | 
			
		||||
  var opt = (list:-p $@opt)
 | 
			
		||||
  var cb  = [o]{ or (is-soption $o) (is-moptions $o) }
 | 
			
		||||
  var cb  = {|o| or (is-soption $o) (is-moptions $o) }
 | 
			
		||||
  var idx = [(list:filter-index-not $cb $opt)]
 | 
			
		||||
  var i0  = 0
 | 
			
		||||
  each [i]{
 | 
			
		||||
  each {|i|
 | 
			
		||||
    -joins $opt[{$i0}:$i]
 | 
			
		||||
    put $opt[$i]
 | 
			
		||||
    set i0 = (+ $i 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -47,9 +47,9 @@ fn join [@opt]{
 | 
			
		|||
  -joins $opt[{$i0}:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn expand [@argv]{ each $split~ (list:-p $@argv) }
 | 
			
		||||
fn expand {|@argv| each $split~ (list:-p $@argv) }
 | 
			
		||||
 | 
			
		||||
fn map [@argv]{
 | 
			
		||||
fn map {|@argv|
 | 
			
		||||
  use ./map
 | 
			
		||||
  set argv = [(expand $@argv)]
 | 
			
		||||
  var result i c = [&] 0 (count $argv)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
use str
 | 
			
		||||
use ./list
 | 
			
		||||
 | 
			
		||||
fn -repeat [n s]{
 | 
			
		||||
fn -repeat {|n s|
 | 
			
		||||
  repeat $n $s | str:join ''
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn left [size s]{
 | 
			
		||||
fn left {|size s|
 | 
			
		||||
  var ss = (count $s)
 | 
			
		||||
  var d  = (- $size $ss)
 | 
			
		||||
  if (<= $d 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ fn left [size s]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn right [size s]{
 | 
			
		||||
fn right {|size s|
 | 
			
		||||
  var ss = (count $s)
 | 
			
		||||
  var d  = (- $size $ss)
 | 
			
		||||
  if (<= $d 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ fn right [size s]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn center [size s]{
 | 
			
		||||
fn center {|size s|
 | 
			
		||||
  use math
 | 
			
		||||
  var ss = (count $s)
 | 
			
		||||
  var d  = (- $size $ss)
 | 
			
		||||
| 
						 | 
				
			
			@ -40,12 +40,12 @@ fn center [size s]{
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -c2map [col]{
 | 
			
		||||
fn -c2map {|col|
 | 
			
		||||
  if (not-eq (kind-of $col) list) {
 | 
			
		||||
    put []
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  list:loop [i c]{
 | 
			
		||||
  list:loop {|i c|
 | 
			
		||||
    var k  = (kind-of $c)
 | 
			
		||||
    var cf = [&min=0]
 | 
			
		||||
    if (is $k string) {
 | 
			
		||||
| 
						 | 
				
			
			@ -63,19 +63,19 @@ fn -c2map [col]{
 | 
			
		|||
  put $col
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -parsecols [col &split=$false lst]{
 | 
			
		||||
fn -parsecols {|col &split=$false lst|
 | 
			
		||||
  set col = (-c2map $col)
 | 
			
		||||
  var cc lines = (count $col) $lst
 | 
			
		||||
  if $split {
 | 
			
		||||
    set lines = [ (eawk [_ @args]{ put $args } $lst) ]
 | 
			
		||||
    set lines = [ (eawk {|_ @args| put $args } $lst) ]
 | 
			
		||||
  }
 | 
			
		||||
  each [l]{
 | 
			
		||||
  each {|l|
 | 
			
		||||
    var cl = (count $l)
 | 
			
		||||
    if (> $cl $cc) {
 | 
			
		||||
      set col = [ $@col (range (- $cl $cc) | each [_]{ put [&align=left &min=0] }) ]
 | 
			
		||||
      set col = [ $@col (range (- $cl $cc) | each {|_| put [&align=left &min=0] }) ]
 | 
			
		||||
      set cc  = $cl
 | 
			
		||||
    }
 | 
			
		||||
    list:loop [i c]{
 | 
			
		||||
    list:loop {|i c|
 | 
			
		||||
      var ccl = (+ (count $c) 1)
 | 
			
		||||
      if (> $ccl $col[$i][min]) {
 | 
			
		||||
        set col[$i][min] = $ccl
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +85,7 @@ fn -parsecols [col &split=$false lst]{
 | 
			
		|||
  put $col
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -format [f e]{
 | 
			
		||||
fn -format {|f e|
 | 
			
		||||
  var cb = $left~
 | 
			
		||||
  if (has-key $f align) {
 | 
			
		||||
    var a = $f[align]
 | 
			
		||||
| 
						 | 
				
			
			@ -98,17 +98,17 @@ fn -format [f e]{
 | 
			
		|||
  $cb $f[min] $e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn -formatline [col line]{
 | 
			
		||||
  list:loop [i v]{
 | 
			
		||||
fn -formatline {|col line|
 | 
			
		||||
  list:loop {|i v|
 | 
			
		||||
    -format $col[$i] $v
 | 
			
		||||
  } $line | str:join ''
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn format [&col=[] &split=$false @lst]{
 | 
			
		||||
fn format {|&col=[] &split=$false @lst|
 | 
			
		||||
  var lines = (list:-p $@lst)
 | 
			
		||||
  if $split {
 | 
			
		||||
    set lines = [ (eawk [l @args]{ put $args } $lines) ]
 | 
			
		||||
    set lines = [ (eawk {|l @args| put $args } $lines) ]
 | 
			
		||||
  }
 | 
			
		||||
  set col = (-parsecols $col $lines)
 | 
			
		||||
  each [l]{ -formatline $col $l } $lines
 | 
			
		||||
  each {|l| -formatline $col $l } $lines
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue