Documentation
This commit is contained in:
parent
2729b6b3c4
commit
33faefc283
1 changed files with 348 additions and 1 deletions
349
README.md
349
README.md
|
@ -1 +1,348 @@
|
|||
# bash-fun
|
||||
# Introduction
|
||||
|
||||
[Introduction to fun.sh library](http://ssledz.github.io/presentations/bash-fun.html#/)
|
||||
|
||||
# Quick start
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
. <(test -e fun.sh || curl -Ls https://raw.githubusercontent.com/ssledz/bash-fun/master/src/fun.sh > fun.sh; cat fun.sh)
|
||||
|
||||
seq 1 4 | sum
|
||||
```
|
||||
|
||||
# Functions overview
|
||||
|
||||
|**plus**|**append**|**buff**|**curry**|**div**|**drop**|
|
||||
|**factorial**|**filter**|**foldl**|**foldr**|**head**|**join**|
|
||||
|**lambda**|**last**|**list**|**map**|**mod**|**mul**|
|
||||
|**prepend**|**product**|**ret**|**revers_str**|**revers**|**scanl**|
|
||||
|**splitc**|**strip**|**sub**|**sum**|**tail**|**take**|
|
||||
|**catch**|**try**|**tupl**|**tupr**|**tup**|**tupx**|
|
||||
|**unlist**|**zip**|**λ**|**with_trampoline**|**res**|**call**|
|
||||
|
||||
## *list/unlist*
|
||||
|
||||
```bash
|
||||
$ list 1 2 3
|
||||
1
|
||||
2
|
||||
3
|
||||
|
||||
$ list 1 2 3 4 5 | unlist
|
||||
1 2 3 4 5
|
||||
```
|
||||
|
||||
## *take/drop/tail/head/last*
|
||||
|
||||
```bash
|
||||
$ list 1 2 3 4 | drop 2
|
||||
3
|
||||
4
|
||||
|
||||
$ list 1 2 3 4 5 | head
|
||||
1
|
||||
|
||||
$ list 1 2 3 4 | tail
|
||||
2
|
||||
3
|
||||
4
|
||||
|
||||
$ list 1 2 3 4 5 | last
|
||||
5
|
||||
|
||||
$ list 1 2 3 4 5 | take 2
|
||||
1
|
||||
2
|
||||
```
|
||||
|
||||
## *join*
|
||||
|
||||
```bash
|
||||
$ list 1 2 3 4 5 | join ,
|
||||
1,2,3,4,5
|
||||
|
||||
$ list 1 2 3 4 5 | join , [ ]
|
||||
[1,2,3,4,5]
|
||||
```
|
||||
|
||||
## *map*
|
||||
|
||||
```bash
|
||||
$ seq 1 5 | map λ a . 'echo $((a + 5))'
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
|
||||
$ list a b s d e | map λ a . 'echo $a$(echo $a | tr a-z A-Z)'
|
||||
aA
|
||||
bB
|
||||
sS
|
||||
dD
|
||||
eE
|
||||
```
|
||||
|
||||
## *flat map*
|
||||
|
||||
```bash
|
||||
$ seq 2 3 | map λ a . 'seq 1 $a' | join , [ ]
|
||||
[1,2,1,2,3]
|
||||
|
||||
$ list a b c | map λ a . 'echo $a; echo $a | tr a-z A-z' | join , [ ]
|
||||
[a,A,b,B,c,C]
|
||||
```
|
||||
|
||||
## *filter*
|
||||
|
||||
```bash
|
||||
$ seq 1 10 | filter λ a . '[[ $(mod $a 2) -eq 0 ]] && ret true || ret false'
|
||||
2
|
||||
4
|
||||
6
|
||||
8
|
||||
10
|
||||
```
|
||||
|
||||
## *foldl/foldr*
|
||||
|
||||
```bash
|
||||
$ list a b c d | foldl λ acc el . 'echo -n $acc-$el'
|
||||
a-b-c-d
|
||||
|
||||
$ list '' a b c d | foldr λ acc el .\
|
||||
'if [[ ! -z $acc ]]; then echo -n $acc-$el; else echo -n $el; fi'
|
||||
d-c-b-a
|
||||
```
|
||||
|
||||
```bash
|
||||
$ seq 1 4 | foldl λ acc el . 'echo $(($acc + $el))'
|
||||
10
|
||||
```
|
||||
|
||||
```bash
|
||||
$ seq 1 4 | foldl λ acc el . 'echo $(mul $(($acc + 1)) $el)'
|
||||
64 # 1 + (1 + 1) * 2 + (4 + 1) * 3 + (15 + 1) * 4 = 64
|
||||
|
||||
$ seq 1 4 | foldr λ acc el . 'echo $(mul $(($acc + 1)) $el)'
|
||||
56 # 1 + (1 + 1) * 4 + (8 + 1) * 3 + (27 + 1) * 2 = 56
|
||||
```
|
||||
|
||||
## *tup/tupx/tupl/tupr*
|
||||
|
||||
```bash
|
||||
$ tup a 1
|
||||
(a,1)
|
||||
|
||||
$ tup 'foo bar' 1 'one' 2
|
||||
(foo bar,1,one,2)
|
||||
|
||||
$ tup , 1 3
|
||||
(u002c,1,3)
|
||||
```
|
||||
|
||||
```bash
|
||||
$ tupl $(tup a 1)
|
||||
a
|
||||
|
||||
$ tupr $(tup a 1)
|
||||
1
|
||||
|
||||
$ tup , 1 3 | tupl
|
||||
,
|
||||
|
||||
$ tup 'foo bar' 1 'one' 2 | tupl
|
||||
foo bar
|
||||
|
||||
$ tup 'foo bar' 1 'one' 2 | tupr
|
||||
2
|
||||
```
|
||||
|
||||
```bash
|
||||
$ tup 'foo bar' 1 'one' 2 | tupx 2
|
||||
1
|
||||
|
||||
$ tup 'foo bar' 1 'one' 2 | tupx 1,3
|
||||
foo bar
|
||||
one
|
||||
|
||||
$ tup 'foo bar' 1 'one' 2 | tupx 2-4
|
||||
1
|
||||
one
|
||||
2
|
||||
```
|
||||
|
||||
## *buff*
|
||||
|
||||
```bash
|
||||
$ seq 1 10 | buff λ a b . 'echo $(($a + $b))'
|
||||
3
|
||||
7
|
||||
11
|
||||
15
|
||||
19
|
||||
|
||||
$ seq 1 10 | buff λ a b c d e . 'echo $(($a + $b + $c + $d + $e))'
|
||||
15
|
||||
40
|
||||
```
|
||||
|
||||
## *zip*
|
||||
|
||||
```bash
|
||||
$ list a b c d e f | zip $(seq 1 10)
|
||||
(a,1)
|
||||
(b,2)
|
||||
(c,3)
|
||||
(d,4)
|
||||
(e,5)
|
||||
(f,6)
|
||||
```
|
||||
|
||||
```bash
|
||||
$ list a b c d e f | zip $(seq 1 10) | last | tupr
|
||||
6
|
||||
```
|
||||
|
||||
## *curry*
|
||||
|
||||
```bash
|
||||
add2() {
|
||||
echo $(($1 + $2))
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
$ curry inc add2 1
|
||||
```
|
||||
|
||||
```bash
|
||||
$ inc 2
|
||||
3
|
||||
|
||||
$ seq 1 3 | map λ a . 'inc $a'
|
||||
2
|
||||
3
|
||||
4
|
||||
```
|
||||
|
||||
## *try/catch*
|
||||
|
||||
```bash
|
||||
$ echo 'expr 2 / 0' | try λ _ . 'echo 0'
|
||||
0
|
||||
|
||||
$ echo 'expr 2 / 0' | try λ status . 'echo $status'
|
||||
2
|
||||
|
||||
$ echo 'expr 2 / 2' | try λ _ . 'echo 0'
|
||||
1
|
||||
```
|
||||
|
||||
```bash
|
||||
try λ _ . 'echo some errors during pull; exit 1' < <(echo git pull)
|
||||
```
|
||||
|
||||
```bash
|
||||
$ echo 'expr 2 / 0' \
|
||||
| LANG=en catch λ cmd status val . 'echo cmd=$cmd,status=$status,val=$val'
|
||||
cmd=expr 2 / 0,status=2,val=(expr:,division,by,zero)
|
||||
```
|
||||
|
||||
```bash
|
||||
$ echo 'expr 2 / 2' | catch λ _ _ val . 'tupl $val'
|
||||
1
|
||||
```
|
||||
|
||||
## *scanl*
|
||||
|
||||
```bash
|
||||
$ seq 1 5 | scanl lambda acc el . 'echo $(($acc + $el))'
|
||||
1
|
||||
3
|
||||
6
|
||||
10
|
||||
15
|
||||
```
|
||||
|
||||
```bash
|
||||
$ seq 1 5 | scanl lambda a b . 'echo $(($a + $b))' | last
|
||||
15
|
||||
```
|
||||
|
||||
## *with_trampoline/res/call*
|
||||
|
||||
```bash
|
||||
factorial() {
|
||||
fact_iter() {
|
||||
local product=$1
|
||||
local counter=$2
|
||||
local max_count=$3
|
||||
if [[ $counter -gt $max_count ]]; then
|
||||
res $product
|
||||
else
|
||||
call fact_iter $(echo $counter\*$product | bc) $(($counter + 1)) $max_count
|
||||
fi
|
||||
}
|
||||
|
||||
with_trampoline fact_iter 1 1 $1
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
$ time factorial 30 | fold -w 70
|
||||
265252859812191058636308480000000
|
||||
|
||||
real 0m1.854s
|
||||
user 0m0.072s
|
||||
sys 0m0.368s
|
||||
```
|
||||
|
||||
```bash
|
||||
time factorial 60 | fold -w 70
|
||||
8320987112741390144276341183223364380754172606361245952449277696409600
|
||||
000000000000
|
||||
|
||||
real 0m3.635s
|
||||
user 0m0.148s
|
||||
sys 0m0.692s
|
||||
```
|
||||
|
||||
```bash
|
||||
$ time factorial 90 | fold -w 70
|
||||
1485715964481761497309522733620825737885569961284688766942216863704985
|
||||
393094065876545992131370884059645617234469978112000000000000000000000
|
||||
|
||||
real 0m4.371s
|
||||
user 0m0.108s
|
||||
sys 0m0.436s
|
||||
```
|
||||
|
||||
# Examples
|
||||
|
||||
```bash
|
||||
processNames() {
|
||||
|
||||
uppercase() {
|
||||
local str=$1
|
||||
echo $(tr 'a-z' 'A-Z' <<< ${str:0:1})${str:1}
|
||||
}
|
||||
|
||||
list $@ \
|
||||
| filter λ name . '[[ ${#name} -gt 1 ]] && ret true || ret false' \
|
||||
| map λ name . 'uppercase $name' \
|
||||
| foldl λ acc el . 'echo $acc,$el'
|
||||
|
||||
}
|
||||
|
||||
processNames adam monika s slawek d daniel Bartek j k
|
||||
```
|
||||
|
||||
```bash
|
||||
Adam,Monika,Slawek,Daniel,Bartek
|
||||
```
|
||||
|
||||
|
||||
# Resources
|
||||
* [Inspiration](https://quasimal.com/posts/2012-05-21-funsh.html)
|
Loading…
Reference in a new issue