diff --git a/.gitignore b/.gitignore index fef5e2be..87fbcad5 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,9 @@ tests/*.html shell_*.rye console_*.rye console_*.rye.enc +temp.* +*.cast +*.nogo buildtemp/main.rye *.bson diff --git a/examples/contexts/test.rye b/examples/contexts/test.rye new file mode 100644 index 00000000..e9108061 --- /dev/null +++ b/examples/contexts/test.rye @@ -0,0 +1,17 @@ + + +game: context { + + x: 0 + + update: fn\par { } current { + x:: x + 1 |change! 'x + ; print x + } + + draw: fn\par { } current { print x } + +} + + +loop 10 { game/update game/draw } \ No newline at end of file diff --git a/examples/csv-http-demo/asciinema-demo.rye b/examples/csv-http-demo/asciinema-demo.rye new file mode 100644 index 00000000..ea16a5b7 --- /dev/null +++ b/examples/csv-http-demo/asciinema-demo.rye @@ -0,0 +1,62 @@ +; This one will be a doozy, we will parse csv, add columns to the table, +; make a http server that uses it (in a goroutine), then call that server, +; parse it's response, and notify folks in response via email + +; we will load our team's data from csv file +load\csv %blindsight.csv +|display + +; we will add two more columns, generate them from existing data +|add-col! 'fullname { name surname } { name + " " + surname } +|add-col! 'status { oxygen } { either oxygen .to-integer < 150 { "danger" } { "OK" } } +|display + +; we will create new table with just selected columns +|columns { 'fullname 'species 'status } +|display +:team + +; we can filter just the ones in danger +|where-equal 'species "vampire" |display +; we can turn it to json +|to-json + +; we will make a closure that returns endangered members +get-endangered: closure { } { team .where-equal 'status "danger" } + +; and a http server handler, we could do that inline +handler: fn { r w } { .write to-json get-endangered } + +; and now we create a web server, but in it's own goroutine, so we can use the shell further +go does { http-server ":8080" |handle "/danger" ?handler |serve } + +; make a HTTP GET request to the server we've just made +get http://localhost:8080/danger +|parse-json :dang +|first .keys + +; get fullnames out of JSON and turn them to email addresses +dang .map { -> "fullname" } +|map { .replace " " "." |concat "@refaktorlabs.com" } +:emails + +; We will alert endangered members via email using Postmark API + +; first we load the postmark token +token: first load %.token + +; we make a function that builds our email object +build-email: fn { email subject } { + new-postmark-email + |from<- podpora@cebelca.biz + |to<- email + |subject<- subject + |text-body<- "" +} + +; now we will notify the endangered team members +for emails { .build-email "OXYGEN LOW" |send open-postmark token } + + + + diff --git a/examples/csv-http-demo/blindsight.csv b/examples/csv-http-demo/blindsight.csv new file mode 100644 index 00000000..dfc14f11 --- /dev/null +++ b/examples/csv-http-demo/blindsight.csv @@ -0,0 +1,6 @@ +name,surname,oxygen,species +Siri,Keeton,180,human +Amanda,Bates,230,human +Jukka,Sarasti,299,vampire +Isaac,Szpindel,45,human +Susan,James,140,human diff --git a/examples/csv-http-demo/data.csv b/examples/csv-http-demo/data.csv new file mode 100644 index 00000000..447fac79 --- /dev/null +++ b/examples/csv-http-demo/data.csv @@ -0,0 +1,7 @@ +first_name,last_name,oxygen,species +Siri,Keeton,120,human +Amanda,Bates,230,human +Jukka,Sarasti,299,vampire +Isaac,Szpindel,0,human +Susan,James,140,human +Robert,Cunningham,180,human diff --git a/examples/csv-http-demo/temp.rye b/examples/csv-http-demo/temp.rye new file mode 100644 index 00000000..14803357 --- /dev/null +++ b/examples/csv-http-demo/temp.rye @@ -0,0 +1,16 @@ + +load\csv %blindsight.csv +|add-col! 'status { oxygen } { either oxygen .to-integer < 150 { "danger" } { "OK" } } +:team + +team .to-json |print + +get-in-danger: fnc { } current-ctx { team .where-equal 'status "danger" } + +tt: fnc { w r } current-ctx { .write to-json get-in-danger } + +1 .go-with fn1 { + http-server ":8080" + |handle "/vamps" ?tt + |serve +} diff --git a/examples/shellbot/chat-print.rye b/examples/examples-wip/shellbot/chat-print.rye similarity index 65% rename from examples/shellbot/chat-print.rye rename to examples/examples-wip/shellbot/chat-print.rye index 183a25d4..72d8e85c 100644 --- a/examples/shellbot/chat-print.rye +++ b/examples/examples-wip/shellbot/chat-print.rye @@ -4,7 +4,7 @@ term: context { extend: fn { n c } { produce n "" { .concat c } } line: fn1 { .extend "─" } - timely-print: fn1 { .for { .prin , sleep 50 } } + timely-print: fn1 { .for { .prn , sleep 50 } } draw-box: fn { cols rows offset } { right offset , "╭" |+ line cols + 3 |+ "╮" |print @@ -35,14 +35,14 @@ term: context { tui\selection ch 62 } - up: fn1 { .esc-val "[(*)A" |prin } - down: fn1 { .esc-val "[(*)B" |prin } - right: fn1 { .esc-val "[(*)C" |prin } - left: fn1 { .esc-val "[(*)D" |prin } - bold: does { esc "[1m" |prin } - reset: does { esc "[22m" |prin } + up: fn1 { .esc-val "[(*)A" |prn } + down: fn1 { .esc-val "[(*)B" |prn } + right: fn1 { .esc-val "[(*)C" |prn } + left: fn1 { .esc-val "[(*)D" |prn } + bold: does { esc "[1m" |prn } + reset: does { esc "[22m" |prn } - color\red: does { esc "[31m" |prin } - color\default: does { esc "[39m" |prin } - color\reset: does { esc "[0m" |prin } + color\red: does { esc "[31m" |prn } + color\default: does { esc "[39m" |prn } + color\reset: does { esc "[0m" |prn } } diff --git a/examples/shellbot/chat-tui.rye b/examples/examples-wip/shellbot/chat-tui.rye similarity index 59% rename from examples/shellbot/chat-tui.rye rename to examples/examples-wip/shellbot/chat-tui.rye index 1e8e5d70..8340c921 100644 --- a/examples/shellbot/chat-tui.rye +++ b/examples/examples-wip/shellbot/chat-tui.rye @@ -4,7 +4,7 @@ chat-tui: context { extend: fn { n c } { produce n "" { .concat c } } line: fn1 { .extend "─" } - gradual-print: fn1 { .for { .prin , sleep 30 } } + gradual-print: fn1 { .for { .prn , sleep 30 } } draw-box: fn { cols rows offset } { right offset , "╭" |+ line cols + 3 |+ "╮" |print @@ -49,21 +49,21 @@ chat-tui: context { |pass { down 1 } } - up: fn1 { .esc-val "[(*)A" |prin } - down: fn1 { .esc-val "[(*)B" |prin } - right: fn1 { .esc-val "[(*)C" |prin } - left: fn1 { .esc-val "[(*)D" |prin } - bold: does { esc "[1m" |prin } - reset: does { esc "[22m" |prin } + up: fn1 { .esc-val "[(*)A" |prn } + down: fn1 { .esc-val "[(*)B" |prn } + right: fn1 { .esc-val "[(*)C" |prn } + left: fn1 { .esc-val "[(*)D" |prn } + bold: does { esc "[1m" |prn } + reset: does { esc "[22m" |prn } - color\black: does { esc "[30m" |prin } - color\red: does { esc "[31m" |prin } - color\green: does { esc "[32m" |prin } - color\yellow: does { esc "[33m" |prin } - color\blue: does { esc "[34m" |prin } - color\magenta: does { esc "[35m" |prin } - color\cyan: does { esc "[36m" |prin } - color\white: does { esc "[37m" |prin } - color\default: does { esc "[39m" |prin } - color\reset: does { esc "[0m" |prin } + color\black: does { esc "[30m" |prn } + color\red: does { esc "[31m" |prn } + color\green: does { esc "[32m" |prn } + color\yellow: does { esc "[33m" |prn } + color\blue: does { esc "[34m" |prn } + color\magenta: does { esc "[35m" |prn } + color\cyan: does { esc "[36m" |prn } + color\white: does { esc "[37m" |prn } + color\default: does { esc "[39m" |prn } + color\reset: does { esc "[0m" |prn } } diff --git a/examples/shellbot/game1.rye b/examples/examples-wip/shellbot/game1.rye similarity index 100% rename from examples/shellbot/game1.rye rename to examples/examples-wip/shellbot/game1.rye diff --git a/examples/examples-wip/shellbot/hello-rye.rye b/examples/examples-wip/shellbot/hello-rye.rye new file mode 100644 index 00000000..a188a647 --- /dev/null +++ b/examples/examples-wip/shellbot/hello-rye.rye @@ -0,0 +1,41 @@ + +do load %chat-tui.rye + +do\in chat-tui { + + wiz: "Grumpy wizard" + + wrap { print "" sleep 500 } { + color\red prn "## Hello Rye ##:" bold reset color\default + } + + chat-lines { "This is a short Rye intro. What's your name?" } + + name: input 36 + + chat-of "Hi " + name + ". Choose your subject:" wiz + + choice { values "Rye values" hello-world "Hello world" functions "Functions" pipe-words "Pipe words" } + + |switch { + hello { + chat-of "Yeeah!?" wiz + sleep 1000 + chat-of "Can I help you with something?" wiz + + seeking: input 36 + either seeking .matches* regexp "magic" { + chat-of "And what would your name be?" wiz + + name: input 36 + chat-of "Yes, I can give you magic " + name + ", I'm tired of it anyway!" wiz + } { + chat-of "I only got some magic to spare, go away now ..." wiz + } + } + away { + chat-of "Yeah! ... you run back to your mommy!!" wiz + } + } + print "" +} diff --git a/examples/shellbot/main.rye b/examples/examples-wip/shellbot/main.rye similarity index 98% rename from examples/shellbot/main.rye rename to examples/examples-wip/shellbot/main.rye index 5f5c52c2..8777daed 100644 --- a/examples/shellbot/main.rye +++ b/examples/examples-wip/shellbot/main.rye @@ -1,7 +1,7 @@ do load %chat-print.rye -do-in term { +do\in term { choice { more "Izvedi več o tem" first "Prikaži prvo nalogo" } diff --git a/examples/shellbot/runrun.game.rye b/examples/examples-wip/shellbot/runrun.game.rye similarity index 100% rename from examples/shellbot/runrun.game.rye rename to examples/examples-wip/shellbot/runrun.game.rye diff --git a/examples/shellbot/wizard.game.rye b/examples/examples-wip/shellbot/wizard.game.rye similarity index 100% rename from examples/shellbot/wizard.game.rye rename to examples/examples-wip/shellbot/wizard.game.rye diff --git a/examples/full-text-search/minimal.nogo b/examples/full-text-search/minimal.nogo new file mode 100644 index 00000000..f174572c --- /dev/null +++ b/examples/full-text-search/minimal.nogo @@ -0,0 +1,18 @@ +// Go example + +import "github.com/blevesearch/bleve/v2" + +func main() { + + mapping := bleve.NewIndexMapping() + index, err := bleve.New("example.bleve", mapping) + + err = index.Index("elephant and a cat", "A mouse scared an elephant. A cat caught an mouse.") + err = index.Index("mouse and dog", "Cat was hunting for a mouse. A dog chased it away.") + err = index.Index("elephant and a dog", "Elephant looked at the dog. The dog looked at the cat.") + + query := bleve.NewMatchQuery("dog") + search := bleve.NewSearchRequest(query) + searchResults, err := index.Search(search) + fmt.Println(searchResults) +} diff --git a/examples/full-text-search/minimal.rye b/examples/full-text-search/minimal.rye new file mode 100644 index 00000000..95e2bd7f --- /dev/null +++ b/examples/full-text-search/minimal.rye @@ -0,0 +1,17 @@ + +; Rye example + +rye .needs { bleve } + +%minimal6.bleve :db +|open-bleve |fix { new-bleve-index-mapping .new-bleve db } :idx +;|index "elephant and a cat" "A mouse scared an elephant. A cat caught an mouse." +;|index "mouse and dog" "Cat was hunting for a mouse. A dog chased it away." +;|index "elephant and a dog" "Elephant looked at the dog. The dog looked at the cat." +|index "faq1" `{ "question": "Is cebelca.biz really free?", "answer": "Yes, it really is free", "keywords": "billing,free,expenses,newusers" }` +|index "faq2" `{ "question": "Can I fiscalize invoices with cebelca.biz?", "answer": "Yes, you can fiscalize invoices with online on mobile POS version.", "keywords": "fiscalisation,invoices" }` + +bleve-search: fn { phrase idx } { new-match-query phrase |new-search-request |search idx |print } + +enter-console "search" + diff --git a/examples/full-text-search/with-mapping.rye b/examples/full-text-search/with-mapping.rye new file mode 100644 index 00000000..65254efb --- /dev/null +++ b/examples/full-text-search/with-mapping.rye @@ -0,0 +1,37 @@ + +; Rye example of bleve full-text-search - a simple search console + +rye .needs { bleve } + +private\ "console will run inside this context" { + + private\ "opens or creates a bleve index and returns it" { + %demo8.bleve :db |open-bleve + |fix { + new-bleve-document-mapping :fqm + new-bleve-text-field-mapping :tfm + + new-bleve-index-mapping :im + |add-document-mapping "faq" fqm + |add-field-mapping-at "question" tfm + |add-field-mapping-at "answer" tfm + |add-field-mapping-at "keywords" tfm + + im .new-bleve db + } + } :idx + ; we can index a JSON string + |index "presale1" ${ "q": "Is InvoiceFox really free?", "a": "Yes, our Mini plans are absolutely free.", "kw": "billing,free,plans" }$ + |index "presale2" ${ "q": "Can I quit at any time?", "a": "Yes, and you can change packages at any time.", "kw": "billing,plans" }$ + |index "integra1" ${ "q": "Can I integrate with Woocommerce? ", "a": "Yes, we have open source WP plugin on github.", "kw": "webshop,integration" }$ + |index "integra2" ${ "q": "Can I integrate inventory and mobile POS?", "a": "Yes, mobile POS can affect and check the inventory.", "kw": "pos,integration" }$ + + ; define two functions that we will be able to call in console + search: fn1 { .new-match-query |new-search-request :sr Search sr idx } + index: fn { id data } { Index idx id data } + + ; enter the Rye console + enter-console "you can index and search here" + +} + diff --git a/examples/full-text-search/with-mapping2.rye b/examples/full-text-search/with-mapping2.rye new file mode 100644 index 00000000..db6d8f64 --- /dev/null +++ b/examples/full-text-search/with-mapping2.rye @@ -0,0 +1,36 @@ + + + +; Rye example of bleve full-text-search - a simple search console + +rye .needs { bleve } + +private\ "console will run inside this context" { + + private\ "opens or creates a bleve index and returns it" { + %demo12.bleve :db |open-bleve + |fix { + new-bleve-document-mapping :fqm + new-bleve-text-field-mapping :tfm + + new-bleve-index-mapping :im + |add-document-mapping "faq" fqm + |add-field-mapping-at "q" tfm + |add-field-mapping-at "a" tfm + + im .new-bleve db + } + } :idx + ; we can index a JSON string + |index "qa1" `{ "q": "Where is Sevnica?", "a": "It's in Slovenia" }` + |index "qa2" `{ "q": "What is Slovenia?", "a": "It's a country" }` + + ; define two functions that we will be able to call in console + find: fn1 { .new-match-query |new-search-request :sr search sr idx } + index: fn { id data } { Index idx id data } + + ; enter the Rye console + enter-console "you can index and search here" + +} + diff --git a/info/base.info.2.rye b/info/base.info.2.rye deleted file mode 100644 index 06612247..00000000 --- a/info/base.info.2.rye +++ /dev/null @@ -1,953 +0,0 @@ -section "base" "base text" { - - group "to-word" - "" - { - } - - { - equal { to-word "test" } 'test - error { to-word 123 } - } - - group "to-integer" - "" - { - } - - { - equal { to-integer "123" } 123 - ; equal { to-integer "123.4" } 123 - ; equal { to-integer "123.6" } 123 - ; equal { to-integer "123.4" } 123 - error { to-integer "abc" } - } - - group "to-decimal" - "" - { - } - - { - equal { to-decimal "123.4" } 123.4 - error { to-decimal "abc" } - } - - group "to-string" - "" - { - } - - { - equal { to-string 'test } "test" - equal { to-string 123 } "123" - equal { to-string 123.4 } "123.400000" - equal { to-string "test" } "test" - } - - group "to-char" - "" - { - } - - { - equal { to-char 42 } "*" - error { to-char "*" } - } - - group "to-block" - "" - { - } - - { -; equal { list [ 1 2 3 ] |to-block |type? } 'block -; equal { list [ 1 2 3 ] |to-block |first } 1 - } - - group "to-context" - "" - { - } - - { - equal { dict [ "a" 1 "b" 2 "c" 3 ] |to-context |type? } 'ctx ; TODO - rename ctx to context in Rye - ; equal { dict [ "a" 1 ] |to-context do\in { a } } '1 - } - - group "is-string" - "" - { - } - - { - equal { is-string "test" } 1 - equal { is-string 'test } 0 - equal { is-string 123 } 0 - } - - group "is-integer" - "" - { - } - - { - equal { is-integer 123 } 1 - equal { is-integer 123.4 } 0 - equal { is-integer "123" } 0 - } - - group "is-decimal" - "" - { - } - - { - equal { is-decimal 123.0 } 1 - equal { is-decimal 123 } 0 - equal { is-decimal "123.4" } 0 - } - - group "is-number" - "" - { - } - - { - equal { is-number 123 } 1 - equal { is-number 123.4 } 1 - equal { is-number "123" } 0 - } - - group "to-uri" - "" - { - } - - { - equal { to-uri "https://example.com" } https://example.com - ; error { to-uri "not-uri" } - } - - group "to-file" - "" - { - } - - { - equal { to-file "example.txt" } %example.txt - equal { to-file 123 } %123 - } - - group "type?" - "" - { - } - - { - equal { type? "test" } 'string - equal { type? 123.4 } 'decimal - } - - group "types?" - "" - { - } - - { - equal { types? { "test" 123 } } { string integer } - } - - group "inc" - "" - { - } - - { - equal { inc 123 } 124 - error { inc "123" } - } - - group "is-positive" - "" - { - } - - { - equal { is-positive 123 } 1 - equal { is-positive -123 } 0 - error { is-positive "123" } - } - - group "is-zero" - "" - { - } - - { - equal { is-zero 0 } 1 - equal { is-zero 123 } 0 - error { is-zero "123" } - } - - group "inc!" - "" - { - } - - { - equal { a:: 123 inc! 'a a } 124 - error { inc! 123 } - } - - group "dec!" - "" - { - } - - { - equal { a:: 123 dec! 'a a } 122 - error { dec! 123 } - } - - group "change!" - "" - { - } - - { - equal { a:: 123 change! 333 'a a } 333 - equal { a:: 123 change! 124 'a } 1 - equal { a:: 123 change! 123 'a } 0 - } - - group "set!" - "" - { - } - - { - equal { set! { 123 234 } { a b } b } 234 - } - - group "pick" - "" - { - } - - { - equal { c: context { a: 123 pick 'a } } 123 - } - - group "dump" - "" - { - } - - { - equal { does { 1 } |dump } "fn { } { 1 }" - } - - group "doc!" - "" - { - } - - { - equal { x: private { doc! "some doc" doc? } } "some doc" - } - - group "doc?" - "" - { - } - - { - equal { x: private { doc! "some doc" doc? } } "some doc" - } - - group "doc\\of?" - "" - { - } - - { - equal { x: context { doc! "some doc" } doc\of? x } "some doc" - } - - group "dict" - "" - { - } - - { - equal { dict { "a" 123 } -> "a" } 123 - } - - group "list" - "" - { - } - - { - equal { list { "a" 123 } -> 1 } "a" - } - - group "true" - "" - { - } - - { - equal { true } 1 - } - - group "false" - "" - { - } - - { - equal { false } 1 - } - - group "not" - "" - { - } - - { - equal { not true } 0 - equal { not false } 1 - } - - group "and" - "" - { - } - - { - equal { true .and true } 1 - equal { false .and true } 0 - } - - group "or" - "" - { - } - - { - equal { true .or true } 1 - equal { false .or true } 1 - equal { true .or false } 1 - equal { false .or false } 0 - } - - group "xor" - "" - { - } - - { - equal { true .xor true } 0 - equal { false .xor true } 1 - equal { true .xor false } 1 - equal { false .xor false } 0 - } - - group "require_" - "" - { - } - - { - error { 1 = 1 .require .type? } - } - - group "multiple-of" - "" - { - } - - { - equal { 10 .multiple-of 2 } 1 - equal { 10 .multiple-of 3 } 0 - } - - group "odd" - "" - { - } - - { - equal { 3 .odd } 1 - equal { 2 .odd } 0 - } - - group "even" - "" - { - } - - { - equal { 3 .even } 0 - equal { 2 .even } 1 - } - - group "mod" - "" - { - } - - { - equal { 4 .mod 2 } 0 - equal { 5 .mod 2 } 1 - equal { 5 .mod 3 } 2 - } - - group "_." - "" - { - } - - { - equal { 4 . .type? } 'void - } - - group "_+" - "" - { - } - - { - equal { 1 + 1 } 2 - equal { 3 + 4 } 7 - equal { 5.6 + 7.8 } 13.400000 - equal { "A" + "b" } "Ab" - equal { "A" + 1 } "A1" - equal { { 1 2 } + { 3 4 } } { 1 2 3 4 } - } - - group "_-" - "" - { - } - - { - equal { 2 - 1 } 1 - equal { 5 - 6 } -1 - } - - group "_*" - "" - { - } - - { - equal { 4 * 2 } 8 - equal { 2.5 * -2 } 5.0 - } - - group "_/" - "" - { - } - - { - equal { 4 / 2 } 2.000 - equal { 102.0 / 2.0 } 51.000 - } - - group "_//" - "" - { - } - - { - equal { 5 // 2 } 2 - equal { 102 // 5 } 20 - equal { 7.99 // 2 } 3 - } - - group "_=" - "" - { - } - - { - equal { 5 = 5 } 1 - equal { 5 = 4 } 0 - } - - group "_>" - "" - { - } - - { - equal { 6 > 5 } 1 - equal { 5 > 4 } 0 - } - - group "_>=" - "" - { - } - - { - equal { 5 >= 6 } 0 - equal { 5 >= 5 } 1 - equal { 6.0 >= 5 } 1 - } - - group "_<" - "" - { - } - - { - equal { 5 < 6 } 1 - equal { 5 < 5 } 0 - } - - group "_<=" - "" - { - } - - { - equal { 5 <= 6 } 1 - equal { 5 <= 5 } 1 - } - - group "prns" - "" - { - } - - { - stdout { prns "xy" } "xy " - } - - group "prn" - "" - { - } - - { - stdout { prn "xy" } "xy" - } - - group "print" - "" - { - } - - { - stdout { print "xy" } "xy\n" - } - - group "format" - "" - { - } - - { - equal { format "num: %d" 123 } "num: 123" - } - - group "prnf" - "" - { - } - - { - stdout { prnf "num: %d" 123 } "num: 123" - } - - group "embed" - "" - { - } - - { - equal { embed 101 "val {}" } "val 101" - } - - group "prnv" - "" - { - } - - { - stdout { prnv 101 "val {}" } "val 101" - } - - group "printv" - "" - { - } - - { - stdout { printv 101 "val {}" } "val 101\n" - } - - group "print\\ssv" - "" - { - } - - { - stdout { print\ssv { 101 "asd" } } "101 asd\n" - } - - group "print\\csv" - "" - { - } - - { - stdout { print\csv { 101 "asd" } } "101,asd\n" - } - - group "print\\json" - "" - { - } - - { - stdout { print\ssv { 101 "asd" } } `[ 101, "asd" ]\n` - } - - group "probe" - "" - { - } - - { - stdout { probe 101 } "[Integer: 101]\n" - } - - group "inspect" - "" - { - } - - { - equal { inspect 101 } "[Integer: 101]" - } - - group "space" - "" - { - } - - { - equal { "abcd" .space } "abcd " - } - - group "concat" - "" - { - } - - { - equal { "abcd" .concat "cde" } "abcdcde" - equal { concat { 1 2 3 4 } { 2 4 5 } } { 1 2 3 4 2 4 5 } - } - - group "union" - "" - { - } - - { - equal { "abcd" .union "cde" } "abcde" - equal { intersection { 1 2 3 4 } { 2 4 5 } } { 1 2 3 4 5 } - } - - group "intersection" - "" - { - } - - { - equal { "abcd" .intersection "cde" } "cd" - equal { intersection { 1 2 3 4 } { 2 4 5 } } { 2 4 } - } - - group "difference" - "" - { - } - - { - equal { "abcde" .difference "cde" } "ab" - equal { difference { 1 2 3 4 } { 2 4 } } { 1 3 } - equal { difference list { "Bob" "Sal" "Joe" } list { "Joe" } } list { "Bob" "Sal" } - } - - group "capitalize" - "" - { - } - - { - equal { capitalize "abcde" } "Abcde" - } - - group "to-lower" - "" - { - } - - { - equal { to-lower "ABCDE" } "abcde" - } - - group "to-upper" - "" - { - } - - { - equal { to-upper "abcde" } "ABCDE" - } - - group "join" - "" - { - } - - { - equal { join { "Mary" "Anne" } } "MaryAnne" - equal { join { "Spot" "Fido" "Rex" } } "SpotFidoRex" - } - - group "join\\with" - "" - { - arg "* to-join" - arg "* delimiter" - } - - { - equal { join\with { "Mary" "Anne" } " " } "Mary Anne" - equal { join\with { "Spot" "Fido" "Rex" } "/" } "Spot/Fido/Rex" - } - - group "split" - "" - { - } - - { - equal { split "a,b,c" "," } { "a" "b" "c" } - } - - group "split\\quoted" - "" - { - arg "to-split" - arg "splitter" - arg "quote" - } - - { - equal { split\quoted "`a,b`,c,d" "," "`" } { "`a,b`" "c" "d" } - } - - group "split\\many" - "" - { - arg "* string" - arg "* separator-set" - } - - { - equal { split\many "192.0.0.1" "." } { "192" "0" "0" "1" } - equal { split\many "abcd..e.q|bar" ".|" } { "abcd" "e" "q" "bar" } - } - - group "split\\every" - "" - { - arg "* string" - arg "* N" - } - - { - equal { split\every "abcdefg" 3 } { "abc" "def" "g" } - equal { split\every "abcdefg" 2 } { "ab" "cd" "ef" "g" } - equal { split\every "abcdef" 2 } { "ab" "cd" "ef" } - } - - group "first" - "" - { - } - - { - equal { first { 1 2 3 4 } } 1 - equal { first "abcde" } "a" - equal { first list { 1 2 3 } } 1 - } - - group "rest" - "" - { - } - - { - equal { rest { 1 2 3 4 } } { 2 3 4 } - equal { rest "abcde" } "bcde" - equal { rest list { 1 2 3 } } list { 2 3 } - } - - group "rest\\from" - "" - { - } - - { - equal { rest\from { 1 2 3 4 5 6 } 3 } { 4 5 6 } - equal { rest\from "abcdefg" 1 } "bcdefg" - equal { rest\from list { 1 2 3 4 } 2 } list { 3 4 } - } - - group "tail" - "" - { - } - - { - equal { tail { 1 2 3 4 5 6 7 } 3 } { 5 6 7 } - equal { tail "abcdefg" 4 } "defg" - equal { tail list { 1 2 3 4 } 1 } list { 4 } - } - - group "last" - "" - { - } - - { - equal { last { 1 2 } } 2 - equal { last "abcd" } "d" - equal { last list { 4 5 6 } } 6 - } - - group "head" - "" - { - } - - { - equal { head { 4 5 6 7 } 3 } { 4 5 6 } - equal { head "abcdefg" 2 } "ab" - equal { head "abcdefg" 4 } "abcd" - equal { head list { 10 20 30 40 } 2 } list { 10 20 } - } - - group "nth" - "" - { - } - - { - equal { nth { 1 2 3 4 5 } 4 } 4 - equal { nth { "a" "b" "c" "d" "e" } 2 } "b" - } - - group "values" - "" - { - } - - { - equal { dict { "a" 1 "b" 2 "c" 3 } |values } list { 1 2 3 } - } - - group "range" - "" - { - arg "* low-value" - arg "* high-value" - } - - { - equal { range 1 5 } { 1 2 3 4 5 } - } - - group "is-empty" - "" - { - } - - { - equal { { } .is-empty } 1 - equal { dict { } |is-empty } 1 - equal { table { 'a 'b } { } |is-empty } 1 - } - - group "length?" - "" - { - } - - { - equal { { 1 2 3 } .length? } 3 - equal { length? "abcd" } 4 - equal { table { 'val } { 1 2 3 4 } |length? } 4 - equal { vector { 10 20 30 } |length? } 3 - } - - group "keys" - "" - { - } - - { - equal { dict { "a" 1 "b" 2 "c" 3 } |keys } { "a" "b" "c" } - equal { table { "a" "b" "c" } { 1 2 3 } |keys } list { "a" "b" "c" } - ; TODO -- doesn't work yet, .header? also has the same problem -- equal { table { 'a 'b 'c } { 1 2 3 } |keys } { 'a 'b 'c } - } - - group "cmd" - "" - { - } - - { - equal { cmd `echo "hello"` } 1 - } - - group "seconds" - "" - { - } - - { - equal { 5 .seconds } 5000000 - } - - group "minutes" - "" - { - } - - { - equal { 5 .seconds } 5000000 * 60 - } - - group "hours" - "" - { - } - - { - equal { 5 .seconds } 5000000 * 60 * 60 - } - -} - diff --git a/info/base.info.rye.2 b/info/base.info.rye.2 deleted file mode 100644 index ac897153..00000000 --- a/info/base.info.rye.2 +++ /dev/null @@ -1,953 +0,0 @@ -section "base" "base text" { - - group "to-word" - "" - { - } - - { - equal { to-word "test" } 'test - error { to-word 123 } - } - - group "to-integer" - "" - { - } - - { - equal { to-integer "123" } 123 - ; equal { to-integer "123.4" } 123 - ; equal { to-integer "123.6" } 123 - ; equal { to-integer "123.4" } 123 - error { to-integer "abc" } - } - - group "to-decimal" - "" - { - } - - { - equal { to-decimal "123.4" } 123.4 - error { to-decimal "abc" } - } - - group "to-string" - "" - { - } - - { - equal { to-string 'test } "test" - equal { to-string 123 } "123" - equal { to-string 123.4 } "123.400000" - equal { to-string "test" } "test" - } - - group "to-char" - "" - { - } - - { - equal { to-char 42 } "*" - error { to-char "*" } - } - - group "to-block" - "" - { - } - - { -; equal { list [ 1 2 3 ] |to-block |type? } 'block -; equal { list [ 1 2 3 ] |to-block |first } 1 - } - - group "to-context" - "" - { - } - - { - equal { dict [ "a" 1 "b" 2 "c" 3 ] |to-context |type? } 'ctx ; TODO - rename ctx to context in Rye - ; equal { dict [ "a" 1 ] |to-context do\in { a } } '1 - } - - group "is-string" - "" - { - } - - { - equal { is-string "test" } 1 - equal { is-string 'test } 0 - equal { is-string 123 } 0 - } - - group "is-integer" - "" - { - } - - { - equal { is-integer 123 } 1 - equal { is-integer 123.4 } 0 - equal { is-integer "123" } 0 - } - - group "is-decimal" - "" - { - } - - { - equal { is-decimal 123.0 } 1 - equal { is-decimal 123 } 0 - equal { is-decimal "123.4" } 0 - } - - group "is-number" - "" - { - } - - { - equal { is-number 123 } 1 - equal { is-number 123.4 } 1 - equal { is-number "123" } 0 - } - - group "to-uri" - "" - { - } - - { - equal { to-uri "https://example.com" } https://example.com - ; error { to-uri "not-uri" } - } - - group "to-file" - "" - { - } - - { - equal { to-file "example.txt" } %example.txt - equal { to-file 123 } %123 - } - - group "type?" - "" - { - } - - { - equal { type? "test" } 'string - equal { type? 123.4 } 'decimal - } - - group "types?" - "" - { - } - - { - equal { types? { "test" 123 } } { string integer } - } - - group "inc" - "" - { - } - - { - equal { inc 123 } 124 - error { inc "123" } - } - - group "is-positive" - "" - { - } - - { - equal { is-positive 123 } 1 - equal { is-positive -123 } 0 - error { is-positive "123" } - } - - group "is-zero" - "" - { - } - - { - equal { is-zero 0 } 1 - equal { is-zero 123 } 0 - error { is-zero "123" } - } - - group "inc!" - "" - { - } - - { - equal { a:: 123 inc! 'a a } 124 - error { inc! 123 } - } - - group "dec!" - "" - { - } - - { - equal { a:: 123 dec! 'a a } 122 - error { dec! 123 } - } - - group "change!" - "" - { - } - - { - equal { a:: 123 change! 333 'a a } 333 - equal { a:: 123 change! 124 'a } 1 - equal { a:: 123 change! 123 'a } 0 - } - - group "set!" - "" - { - } - - { - equal { set! { 123 234 } { a b } b } 234 - } - - group "pick" - "" - { - } - - { - equal { c: context { a: 123 pick 'a } } 123 - } - - group "dump" - "" - { - } - - { - equal { does { 1 } |dump } "fn { } { 1 }" - } - - group "doc!" - "" - { - } - - { - equal { x: private { doc! "some doc" doc? } } "some doc" - } - - group "doc?" - "" - { - } - - { - equal { x: private { doc! "some doc" doc? } } "some doc" - } - - group "doc\\of?" - "" - { - } - - { - equal { x: context { doc! "some doc" } doc\of? x } "some doc" - } - - group "dict" - "" - { - } - - { - equal { dict { "a" 123 } -> "a" } 123 - } - - group "list" - "" - { - } - - { - equal { list { "a" 123 } -> 1 } "a" - } - - group "true" - "" - { - } - - { - equal { true } 1 - } - - group "false" - "" - { - } - - { - equal { false } 1 - } - - group "not" - "" - { - } - - { - equal { not true } 0 - equal { not false } 1 - } - - group "and" - "" - { - } - - { - equal { true .and true } 1 - equal { false .and true } 0 - } - - group "or" - "" - { - } - - { - equal { true .or true } 1 - equal { false .or true } 1 - equal { true .or false } 1 - equal { false .or false } 0 - } - - group "xor" - "" - { - } - - { - equal { true .xor true } 0 - equal { false .xor true } 1 - equal { true .xor false } 1 - equal { false .xor false } 0 - } - - group "require_" - "" - { - } - - { - error { 1 = 1 .require .type? } - } - - group "multiple-of" - "" - { - } - - { - equal { 10 .multiple-of 2 } 1 - equal { 10 .multiple-of 3 } 0 - } - - group "odd" - "" - { - } - - { - equal { 3 .odd } 1 - equal { 2 .odd } 0 - } - - group "even" - "" - { - } - - { - equal { 3 .even } 0 - equal { 2 .even } 1 - } - - group "mod" - "" - { - } - - { - equal { 4 .mod 2 } 0 - equal { 5 .mod 2 } 1 - equal { 5 .mod 3 } 2 - } - - group "_." - "" - { - } - - { - equal { 4 . .type? } 'void - } - - group "_+" - "" - { - } - - { - equal { 1 + 1 } 2 - equal { 3 + 4 } 7 - equal { 5.6 + 7.8 } 13.400000 - equal { "A" + "b" } "Ab" - equal { "A" + 1 } "A1" - equal { { 1 2 } + { 3 4 } } { 1 2 3 4 } - } - - group "_-" - "" - { - } - - { - equal { 2 - 1 } 1 - equal { 5 - 6 } -1 - } - - group "_*" - "" - { - } - - { - equal { 4 * 2 } 8 - equal { 2.5 * -2 } 5.0 - } - - group "_/" - "" - { - } - - { - equal { 4 / 2 } 2.000 - equal { 102.0 / 2.0 } 51.000 - } - - group "_//" - "" - { - } - - { - equal { 5 // 2 } 2 - equal { 102 // 5 } 20 - equal { 7.99 // 2 } 3 - } - - group "_=" - "" - { - } - - { - equal { 5 = 5 } 1 - equal { 5 = 4 } 0 - } - - group "_>" - "" - { - } - - { - equal { 6 > 5 } 1 - equal { 5 > 4 } 0 - } - - group "_>=" - "" - { - } - - { - equal { 5 >= 6 } 0 - equal { 5 >= 5 } 1 - equal { 6.0 >= 5 } 1 - } - - group "_<" - "" - { - } - - { - equal { 5 < 6 } 1 - equal { 5 < 5 } 0 - } - - group "_<=" - "" - { - } - - { - equal { 5 <= 6 } 1 - equal { 5 <= 5 } 1 - } - - group "prns" - "" - { - } - - { - stdout { prns "xy" } "xy " - } - - group "prn" - "" - { - } - - { - stdout { prn "xy" } "xy" - } - - group "print" - "" - { - } - - { - stdout { print "xy" } "xy\n" - } - - group "format" - "" - { - } - - { - equal { format "num: %d" 123 } "num: 123" - } - - group "prnf" - "" - { - } - - { - stdout { prnf "num: %d" 123 } "num: 123" - } - - group "embed" - "" - { - } - - { - equal { embed 101 "val {}" } "val 101" - } - - group "prnv" - "" - { - } - - { - stdout { prnv 101 "val {}" } "val 101" - } - - group "printv" - "" - { - } - - { - stdout { printv 101 "val {}" } "val 101\n" - } - - group "print\\ssv" - "" - { - } - - { - stdout { print\ssv { 101 "asd" } } "101 asd\n" - } - - group "print\\csv" - "" - { - } - - { - stdout { print\csv { 101 "asd" } } "101,asd\n" - } - - group "print\\json" - "" - { - } - - { - stdout { print\ssv { 101 "asd" } } `[ 101, "asd" ]\n` - } - - group "probe" - "" - { - } - - { - stdout { probe 101 } "[Integer: 101]\n" - } - - group "inspect" - "" - { - } - - { - equal { inspect 101 } "[Integer: 101]" - } - - group "space" - "" - { - } - - { - equal { "abcd" .space } "abcd " - } - - group "concat" - "" - { - } - - { - equal { "abcd" .concat "cde" } "abcdcde" - equal { concat { 1 2 3 4 } { 2 4 5 } } { 1 2 3 4 2 4 5 } - } - - group "union" - "" - { - } - - { - equal { "abcd" .union "cde" } "abcde" - equal { intersection { 1 2 3 4 } { 2 4 5 } } { 1 2 3 4 5 } - } - - group "intersection" - "" - { - } - - { - equal { "abcd" .intersection "cde" } "cd" - equal { intersection { 1 2 3 4 } { 2 4 5 } } { 2 4 } - } - - group "difference" - "" - { - } - - { - equal { "abcde" .difference "cde" } "ab" - equal { difference { 1 2 3 4 } { 2 4 } } { 1 3 } - equal { difference list { "Bob" "Sal" "Joe" } list { "Joe" } } list { "Bob" "Sal" } - } - - group "capitalize" - "" - { - } - - { - equal { capitalize "abcde" } "Abcde" - } - - group "to-lower" - "" - { - } - - { - equal { to-lower "ABCDE" } "abcde" - } - - group "to-upper" - "" - { - } - - { - equal { to-upper "abcde" } "ABCDE" - } - - group "join" - "" - { - } - - { - equal { join { "Mary" "Anne" } } "MaryAnne" - equal { join { "Spot" "Fido" "Rex" } } "SpotFidoRex" - } - - group "join\\with" - "" - { - arg "* to-join" - arg "* delimiter" - } - - { - equal { join\with { "Mary" "Anne" } " " } "Mary Anne" - equal { join\with { "Spot" "Fido" "Rex" } "/" } "Spot/Fido/Rex" - } - - group "split" - "" - { - } - - { - equal { split "a,b,c" "," } { "a" "b" "c" } - } - - group "split\\quoted" - "" - { - arg "to-split" - arg "splitter" - arg "quote" - } - - { - equal { split\quoted "`a,b`,c,d" "," "`" } { "`a,b`" "c" "d" } - } - - group "split\\many" - "" - { - arg "* string" - arg "* separator-set" - } - - { - equal { split\many "192.0.0.1" "." } { "192" "0" "0" "1" } - equal { split\many "abcd..e.q|bar" ".|" } { "abcd" "e" "q" "bar" } - } - - group "split\\every" - "" - { - arg "* string" - arg "* N" - } - - { - equal { split\every "abcdefg" 3 } { "abc" "def" "g" } - equal { split\every "abcdefg" 2 } { "ab" "cd" "ef" "g" } - equal { split\every "abcdef" 2 } { "ab" "cd" "ef" } - } - - group "first" - "" - { - } - - { - equal { first { 1 2 3 4 } } 1 - equal { first "abcde" } "a" - equal { first list { 1 2 3 } } 1 - } - - group "rest" - "" - { - } - - { - equal { rest { 1 2 3 4 } } { 2 3 4 } - equal { rest "abcde" } "bcde" - equal { rest list { 1 2 3 } } list { 2 3 } - } - - group "rest\\from" - "" - { - } - - { - equal { rest\from { 1 2 3 4 5 6 } 3 } { 4 5 6 } - equal { rest\from "abcdefg" 1 } "bcdefg" - equal { rest\from list { 1 2 3 4 } 2 } list { 3 4 } - } - - group "tail" - "" - { - } - - { - equal { tail { 1 2 3 4 5 6 7 } 3 } { 5 6 7 } - equal { tail "abcdefg" 4 } "defg" - equal { tail list { 1 2 3 4 } 1 } list { 4 } - } - - group "last" - "" - { - } - - { - equal { last { 1 2 } } 2 - equal { last "abcd" } "d" - equal { last list { 4 5 6 } } 6 - } - - group "head" - "" - { - } - - { - equal { head { 4 5 6 7 } 3 } { 4 5 6 } - equal { head "abcdefg" 2 } "ab" - equal { head "abcdefg" 4 } "abcd" - equal { head list { 10 20 30 40 } 2 } list { 10 20 } - } - - group "nth" - "" - { - } - - { - equal { nth { 1 2 3 4 5 } 4 } 4 - equal { nth { "a" "b" "c" "d" "e" } 2 } "b" - } - - group "values" - "" - { - } - - { - equal { dict { "a" 1 "b" 2 "c" 3 } |values } list { 1 2 3 } - } - - group "range" - "" - { - arg "* low-value" - arg "* high-value" - } - - { - equal { range 1 5 } { 1 2 3 4 5 } - } - - group "is-empty" - "" - { - } - - { - equal { { } .is-empty } 1 - equal { dict { } |is-empty } 1 - equal { spreadsheet { 'a 'b } { } |is-empty } 1 - } - - group "length?" - "" - { - } - - { - equal { { 1 2 3 } .length? } 3 - equal { length? "abcd" } 4 - equal { spreadsheet { 'val } { 1 2 3 4 } |length? } 4 - equal { vector { 10 20 30 } |length? } 3 - } - - group "keys" - "" - { - } - - { - equal { dict { "a" 1 "b" 2 "c" 3 } |keys } { "a" "b" "c" } - equal { spreadsheet { "a" "b" "c" } { 1 2 3 } |keys } list { "a" "b" "c" } - ; TODO -- doesn't work yet, .header? also has the same problem -- equal { spreadsheet { 'a 'b 'c } { 1 2 3 } |keys } { 'a 'b 'c } - } - - group "cmd" - "" - { - } - - { - equal { cmd `echo "hello"` } 1 - } - - group "seconds" - "" - { - } - - { - equal { 5 .seconds } 5000000 - } - - group "minutes" - "" - { - } - - { - equal { 5 .seconds } 5000000 * 60 - } - - group "hours" - "" - { - } - - { - equal { 5 .seconds } 5000000 * 60 * 60 - } - -} - diff --git a/info/base2.info.rye b/info/base2.info.rye deleted file mode 100644 index 13a4a9cd..00000000 --- a/info/base2.info.rye +++ /dev/null @@ -1,2189 +0,0 @@ -section "type introspection" "converting values to specific value types" { - group "to-word" - "" - { - } - - { - equal { to-word "test" } 'test - error { to-word 123 } - } - - group "to-integer" - "" - { - } - - { - equal { to-integer "123" } 123 - ; equal { to-integer "123.4" } 123 - ; equal { to-integer "123.6" } 123 - ; equal { to-integer "123.4" } 123 - error { to-integer "abc" } - } - - group "to-decimal" - "" - { - } - - { - equal { to-decimal "123.4" } 123.4 - error { to-decimal "abc" } - } - - group "to-string" - "" - { - } - - { - equal { to-string 'test } "test" - equal { to-string 123 } "123" - equal { to-string 123.4 } "123.400000" - equal { to-string "test" } "test" - } - - group "to-char" - "" - { - } - - { - equal { to-char 42 } "*" - error { to-char "*" } - } - - group "to-block" - "" - { - } - - { - equal { list [ 1 2 3 ] |to-block |type? } 'block - equal { list [ 1 2 3 ] |to-block |first } 1 - } - - group "to-context" - "" - { - } - - { - equal { dict [ "a" 1 "b" 2 "c" 3 ] |to-context |type? } 'ctx ; TODO - rename ctx to context in Rye - ; equal { dict [ "a" 1 ] |to-context do\in { a } } '1 - } - - group "is-string" - "" - { - } - - { - equal { is-string "test" } 1 - equal { is-string 'test } 0 - equal { is-string 123 } 0 - } - - group "is-integer" - "" - { - } - - { - equal { is-integer 123 } 1 - equal { is-integer 123.4 } 0 - equal { is-integer "123" } 0 - } - - group "is-decimal" - "" - { - } - - { - equal { is-decimal 123.0 } 1 - equal { is-decimal 123 } 0 - equal { is-decimal "123.4" } 0 - } - - group "is-number" - "" - { - } - - { - equal { is-number 123 } 1 - equal { is-number 123.4 } 1 - equal { is-number "123" } 0 - } - - group "to-uri" - "" - { - } - - { - equal { to-uri "https://example.com" } https://example.com - ; error { to-uri "not-uri" } - } - - group "to-file" - "" - { - } - - { - equal { to-file "example.txt" } %example.txt - equal { to-file 123 } %123 - } - - group "type?" - "" - { - } - - { - equal { type? "test" } 'string - equal { type? 123.4 } 'decimal - } - - group "types?" - "" - { - } - - { - equal { types? { "test" 123 } } { string integer } - } - -} - -section "numbers" "working with numbers" { - group "inc" - "" - { - } - - { - equal { inc 123 } 124 - error { inc "123" } - } - - group "is-positive" - "" - { - } - - { - equal { is-positive 123 } 1 - equal { is-positive -123 } 0 - error { is-positive "123" } - } - - group "is-zero" - "" - { - } - - { - equal { is-zero 0 } 1 - equal { is-zero 123 } 0 - error { is-zero "123" } - } - - group "multiple-of" - "" - { - } - - { - equal { 10 .multiple-of 2 } 1 - equal { 10 .multiple-of 3 } 0 - } - - group "odd" - "" - { - } - - { - equal { 3 .odd } 1 - equal { 2 .odd } 0 - } - - group "even" - "" - { - } - - { - equal { 3 .even } 0 - equal { 2 .even } 1 - } - - group "mod" - "" - { - } - - { - equal { 4 .mod 2 } 0 - equal { 5 .mod 2 } 1 - equal { 5 .mod 3 } 2 - } - -} - -section "modifier functions" "Changing values in place" { - group "inc!" - "" - { - } - - { - equal { a:: 123 inc! 'a a } 124 - error { inc! 123 } - } - - group "dec!" - "" - { - } - - { - equal { a:: 123 dec! 'a a } 122 - error { dec! 123 } - } - - group "change!" - "" - { - } - - { - equal { a:: 123 change! 333 'a a } 333 - equal { a:: 123 change! 124 'a } 1 - equal { a:: 123 change! 123 'a } 0 - } - - group "set!" - "" - { - } - - { - equal { set! { 123 234 } { a b } b } 234 - } - - group "unset!" - "" - { - } - - { - equal { x: 1 unset! 'x x: 2 } 2 ; otherwise would produce an error - } - - group "ref" - "" - { - } - - { - equal { is-ref ref { 1 2 3 } } 1 - } - - group "deref" - "" - { - } - - { - equal { is-ref deref ref { 1 2 3 } } 0 - } - - group "is-ref" - "" - { - } - - { - equal { ref { } |is-ref } true - equal { { } |is-ref } false - } - -} - -section "context related" "" { - group "pick" - "" - { - } - - { - equal { a: 123 pick 'a } 123 - } - -} - -section "Introspection" "" { - group "dump" - "" - { - } - - { - equal { does { 1 } |dump } "fn { } { 1 }" - } - - group "doc!" - "" - { - } - - { - equal { x: private { doc! "some doc" doc? } } "some doc" - } - - group "doc?" - "" - { - } - - { - equal { x: private { doc! "some doc" doc? } } "some doc" - } - - group "doc\\of?" - "" - { - } - - { - equal { x: context { doc! "some doc" } doc\of? x } "some doc" - } - -} - -section "Value constructors" " " { - group "dict" - "" - { - } - - { - equal { dict { "a" 123 } -> "a" } 123 - } - - group "list" - "" - { - } - - { - equal { list { "a" 123 } -> 1 } "a" - } - - group "true" - "" - { - } - - { - equal { true } 1 - } - - group "false" - "" - { - } - - { - equal { false } 0 - } - -} - -section "Logic" "" { - group "not" - "" - { - } - - { - equal { not true } 0 - equal { not false } 1 - } - - group "and" - "" - { - } - - { - equal { true .and true } 1 - equal { false .and true } 0 - } - - group "or" - "" - { - } - - { - equal { true .or true } 1 - equal { false .or true } 1 - equal { true .or false } 1 - equal { false .or false } 0 - } - - group "xor" - "" - { - } - - { - equal { true .xor true } 0 - equal { false .xor true } 1 - equal { true .xor false } 1 - equal { false .xor false } 0 - } - - group "multiple-of" - "" - { - } - - { - equal { 10 .multiple-of 2 } 1 - equal { 10 .multiple-of 3 } 0 - } - - group "odd" - "" - { - } - - { - equal { 3 .odd } 1 - equal { 2 .odd } 0 - } - - group "even" - "" - { - } - - { - equal { 3 .even } 0 - equal { 2 .even } 1 - } - - group "mod" - "" - { - } - - { - equal { 4 .mod 2 } 0 - equal { 5 .mod 2 } 1 - equal { 5 .mod 3 } 2 - } - - group "multiple-of" - "" - { - } - - { - equal { 10 .multiple-of 2 } 1 - equal { 10 .multiple-of 3 } 0 - } - - group "odd" - "" - { - } - - { - equal { 3 .odd } 1 - equal { 2 .odd } 0 - } - - group "even" - "" - { - } - - { - equal { 3 .even } 0 - equal { 2 .even } 1 - } - - group "mod" - "" - { - } - - { - equal { 4 .mod 2 } 0 - equal { 5 .mod 2 } 1 - equal { 5 .mod 3 } 2 - } - - group "_." - "" - { - } - - { - equal { 4 . .type? } 'void - } - - group "_+" - "" - { - } - - { - equal { 1 + 1 } 2 - equal { 3 + 4 } 7 - equal { 5.6 + 7.8 } 13.400000 - equal { "A" + "b" } "Ab" - equal { "A" + 1 } "A1" - equal { { 1 2 } + { 3 4 } } { 1 2 3 4 } - equal { dict { "a" 1 } |+ { "b" 2 } } dict { "a" 1 "b" 2 } - equal { dict { "a" 1 } |+ dict { "b" 2 } } dict { "a" 1 "b" 2 } - } - - group "_-" - "" - { - } - - { - equal { 2 - 1 } 1 - equal { 5 - 6 } -1 - } - - group "_*" - "" - { - } - - { - equal { 4 * 2 } 8 - equal { 2.5 * -2 } -5.0 - } - - group "_/" - "" - { - } - - { - equal { 4 / 2 } 2.000 - equal { 102.0 / 2.0 } 51.000 - } - - group "_//" - "" - { - } - - { - equal { 5 // 2 } 2 - equal { 102 // 5 } 20 - equal { 7.99 // 2 } 3 - } - - group "_=" - "" - { - } - - { - equal { 5 = 5 } 1 - equal { 5 = 4 } 0 - } - - group "_>" - "" - { - } - - { - equal { 6 > 5 } 1 - equal { 5 > 5 } 0 - } - - group "_>=" - "" - { - } - - { - equal { 5 >= 6 } 0 - equal { 5 >= 5 } 1 - equal { 6.0 >= 5 } 1 - } - - group "_<" - "" - { - } - - { - equal { 5 < 6 } 1 - equal { 5 < 5 } 0 - } - - group "_<=" - "" - { - } - - { - equal { 5 <= 6 } 1 - equal { 5 <= 5 } 1 - } - - group "prns" - "" - { - } - - { - stdout { prns "xy" } "xy " - } - - group "prn" - "" - { - } - - { - stdout { prn "xy" } "xy" - } - - group "print" - "" - { - } - - { - stdout { print "xy" } "xy\n" - } - - group "format" - "" - { - } - - { - equal { format 123 "num: %d" } "num: 123" - } - - group "prnf" - "" - { - } - - { - stdout { prnf 123 "num: %d" } "num: 123" - } - - group "embed" - "" - { - } - - { - equal { embed 101 "val {}" } "val 101" - } - - group "prnv" - "" - { - } - - { - stdout { prnv 101 "val {}" } "val 101" - } - - group "printv" - "" - { - } - - { - stdout { printv 101 "val {}" } "val 101\n" - } - - group "print\\ssv" - "" - { - } - - { - stdout { print\ssv { 101 "asd" } } "101 asd\n" - } - - group "print\\csv" - "" - { - } - - { - stdout { print\csv { 101 "asd" } } "101,asd\n" - } - - group "probe" - "" - { - } - - { - stdout { probe 101 } "[Integer: 101]\n" - } - - group "inspect" - "" - { - } - - { - equal { inspect 101 } "[Integer: 101]" - } - - group "esc" - "" - { - } - - { - ; equal { esc "[33m" } "\033[33m" ; we can't represent hex or octal in strings yet - } - - group "esc-val" - "" - { - } - - { - ; equal { esc-val "[33m" "Error" } "\033[33mError" ; we can't represent hex or octal in strings yet - } - - group "random" - "" - { - } - - { - equal { random { 1 2 3 } |type? } 'integer - } - - group "sample" - "" - { - } - - { - equal { sample { 1 2 3 4 } 2 |length? } 2 - equal { sample { 123 123 123 123 } 3 -> 0 } 123 - } - - group "random\\integer" - "" - { - } - - { - equal { random\integer 2 |type? } 'integer - } - - group "load" - "" - { - } - - { - equal { load " 1 2 3 " |third } 3 - equal { load "{ 1 2 3 }" |first |third } 3 - } - - group "mold" - "" - { - } - - { - equal { mold 123 } "123" - equal { mold { 123 } } "{ 123 }" - } - - group "mold\\nowrap" - "" - { - } - - { - equal { mold\nowrap 123 } "123" - equal { mold\nowrap { 123 } } "123" - equal { mold\nowrap { 123 234 } } "123 234" - } - - group "if" - "" - { - } - - { - equal { if 1 { 222 } } 222 - equal { if 0 { 333 } } 0 - } - - group "^if" - "" - { - } - - { - equal { x: does { ^if 1 { 222 } 555 } x } 222 - equal { x: does { ^if 0 { 333 } 444 } x } 444 - } - - group "either" - "" - { - } - - { - equal { either 1 { 222 } { 333 } } 222 - equal { either 0 { 222 } { 333 } } 333 - } - - group "switch" - "" - { - } - - { - equal { switch 101 { 101 { 111 } 202 { 222 } } } 111 - equal { switch 202 { 101 { 111 } 202 { 222 } } } 222 - } - - group "cases" - "" - { - } - - { - equal { cases 0 { { 1 > 0 } { + 100 } { 2 > 1 } { + 1000 } } } 1100 - equal { cases 0 { { 1 > 0 } { + 100 } { 2 < 1 } { + 1000 } } } 100 - equal { cases 0 { { 1 < 0 } { + 100 } { 2 > 1 } { + 1000 } } } 1000 - equal { cases 0 { { 1 < 0 } { + 100 } { 2 < 1 } { + 1000 } } } 0 - equal { cases 1 { { 1 > 0 } { + 100 } { 2 < 1 } { + 1000 } _ { * 3 } } } 101 - equal { cases 1 { { 1 < 0 } { + 100 } { 2 > 1 } { + 1000 } _ { * 3 } } } 1001 - equal { cases 1 { { 1 < 0 } { + 100 } { 2 < 1 } { + 1000 } _ { * 3 } } } 3 - } - - group "do" - "" - { - } - - { - equal { do { 123 + 123 } } 246 - error { do { 123 + } } - } - - group "try" - "" - { - } - - { - equal { try { 123 + 123 } } 246 - equal { try { 123 + "asd" } \type? } 'error - equal { try { 123 + } \type? } 'error - } - - group "with" - "" - { - } - - { - equal { with 100 { + 11 } } 111 - equal { with 100 { + 11 , * 3 } } 300 - } - - group "do\\in" - "" - { - } - - { - equal { c: context { x: 100 } do\in c { x * 9.99 } } 999.0 - equal { c: context { x: 100 } do\in c { inc! 'x } } 101 - equal { c: context { x: 100 } do\in c { x:: 200 } c/x } 200 - equal { c: context { x: 100 } do\in c { x:: 200 , x } } 200 - } - - group "try\\in" - "" - { - } - - { - equal { c: context { x: 100 } try\in c { x * 9.99 } } 999.0 - equal { c: context { x: 100 } try\in c { inc! 'x } } 101 - equal { c: context { x: 100 } try\in c { x:: 200 , x } } 200 - equal { c: context { x: 100 } try\in c { x:: 200 } c/x } 200 - equal { c: context { x: 100 } try\in c { inc! 'y } |type? } 'error - } - - group "do\\par" - "" - { - } - - { - equal { c: context { x: 100 } do\par c { x * 9.99 } } 999.0 - equal { c: context { x: 100 } do\par c { inc! 'x } } 101 - equal { c: context { x: 100 } do\par c { x:: 200 , x } } 200 - equal { c: context { x: 100 } do\par c { x:: 200 } c/x } 100 - } - - group "capture-stdout" - "" - { - } - - { - equal { capture-stdout { print "hello" } } "hello\n" - equal { capture-stdout { loop 3 { prns "x" } } } "x x x " - } - - group "time-it" - "" - { - } - - { - equal { time-it { sleep 100 } } 100 - } - - group "vals" - "" - { - } - - { - equal { x: 1 y: 2 vals { x y } } { 1 2 } - equal { x: 1 y: 2 vals { 1 y } } { 1 2 } - equal { x: 1 y: 2 try { vals { z y } } |type? } 'error - } - - group "vals\\with" - "" - { - } - - { - equal { x: 1 y: 2 vals\with 10 { + x , * y } } { 11 20 } - equal { x: 1 y: 2 vals\with 100 { + 10 , * 8.9 } } { 110 890.0 } - } - - group "unpack" - "" - { - } - - { - equal { unpack { { 123 } { 234 } } } { 123 234 } - equal { unpack { { { 123 } } { 234 } } } { { 123 } 234 } - } - - group "all" - "" - { - } - - { - equal { all { 1 2 3 } } 3 - equal { all { 1 0 3 } } 0 - } - - group "any" - "" - { - } - - { - equal { any { 1 2 3 } } 1 - equal { any { 1 0 3 } } 1 - equal { any { 0 0 3 } } 3 - } - - group "any\\with" - "" - { - } - - { - equal { any\with 10 { + 10 , * 10 } } 20 - ; equal { any\with -10 { + 10 , * 10 } } -200 ... halts TODO -- fix - } - - group "current" - "" - { - } - - { - equal { c: context { x: 9999 , incr: fn\in { } current { x:: inc x } } c/incr c/x } 10000 - } - - group "parent" - "" - { - } - - { - equal { y: 99 c: context { incr: fn\in { } parent { y:: inc y } } c/incr y } 100 - } - - group "parent\\of" - "" - { - } - - { - equal { ct: context { p: 123 } parent\of ct |= current } 1 - } - - group "raw-context" - "" - { - } - - { - equal { c: raw-context { x: 123 } c/x } 123 - equal { y: 123 try { c: raw-context { x: y } } |type? } 'error ; word not found y - equal { try { c: raw-context { x: inc 10 } } |type? } 'error ; word not found inc - } - - group "isolate" - "" - { - } - - { - equal { c: isolate { x: 123 } c/x } 123 - equal { y: 123 c: isolate { x: y } c/x } 123 - equal { c: isolate { x: inc 10 } c/x } 11 - equal { y: 99 c: isolate { x: does { y } } try { c/x } |type? } 'error - equal { y: 99 c: isolate { t: ?try x: does { t { y } } } c/x |type? } 'error - } - - group "context" - "" - { - } - - { - equal { c: context { x: 123 } c/x } 123 - equal { y: 123 c: context { x: y } c/x } 123 - equal { c: context { x: inc 10 } c/x } 11 - equal { y: 123 c: context { x: does { y } } c/x } 123 - } - - group "private" - "" - { - } - - { - equal { private { x: 123 } } 123 - equal { y: 123 private { x: y } } 123 - equal { private { x: inc 10 } } 11 - equal { y: 123 private { does { y } } :f f } 123 - } - - group "private\\" - "" - { - } - - { - equal { private\ "what are we doing here" { x: 234 1000 + x } } 1234 - } - - group "extends" - "" - { - } - - { - equal { ct: context { p: 123 } cn: extends ct { r: p + 234 } cn/r } 357 - } - - group "bind!" - "" - { - } - - { - equal { c: context { y: 123 } cc: bind! context { z: does { y + 234 } } c , cc/z } 357 - } - - group "unbind" - "" - { - } - - { - equal { c: context { y: 123 } cc: bind! context { z: does { y + 234 } } c , unbind cc cc/z } 357 - error { c: context { y: 123 } cc: bind! context { z: does { y + 234 } } c , dd: unbind cc dd/z } - } - - group "pass" - "" - { - } - - { - equal { 101 .pass { 202 } } 101 - equal { 101 .pass { 202 + 303 } } 101 - } - - group "wrap" - "" - { - } - - { - stdout { wrap { prn "*" } { prn "x" } } "*x*" - } - - group "keep" - "" - { - } - - { - equal { 20 .keep { + 202 } { + 101 } } 222 - } - - group "loop" - "" - { - } - - { - stdout { 3 .loop { prns "x" } } "x x x " - equal { 3 .loop { + 1 } } 4 - ; equal { 3 .loop { } } 3 ; TODO should pass the value - } - - group "produce" - "" - { - } - - { - equal { produce 5 0 { + 3 } } 15 - equal { produce 3 ">" { + "x>" } } ">x>x>x>" - equal { produce 3 { } { .concat "x" } } { "x" "x" "x" } - } - - group "produce\\while" - "" - { - } - - { - equal { x: 0 produce\while { x < 100 } 1 { * 2 ::x } } 64 - stdout { x: 0 produce\while { x < 100 } 1 { * 2 ::x .prns } } "2 4 8 16 32 64 128 " - } - - group "produce\\" - "" - { - } - - { - equal { produce\ 5 1 'acc { * acc , + 1 } } 1 ; Look at what we were trying to do here - } - - group "forever" - "" - { - } - - { - stdout { forever { "once" .prn .return } } "once" - equal { forever { "once" .return } } "once" - } - - group "forever\\with" - "" - { - } - - { - stdout { forever\with 1 { .prn .return } } "1" - } - - group "for" - "" - { - } - - { - stdout { for { 1 2 3 } { prns "x" } } "x x x " - stdout { { "a" "b" "c" } .for { .prns } } "a b c " - } - - group "walk" - "" - { - } - - { - stdout { walk { 1 2 3 } { .prns .rest } } "1 2 3 2 3 3 " - equal { x: 0 walk { 1 2 3 } { ::b .first + x ::x , b .rest } x } 6 - } - - group "purge" - "" - { - } - - { - equal { purge { 1 2 3 } { .even } } { 1 3 } - equal { purge { } { .even } } { } - equal { purge list { 1 2 3 } { .even } } list { 1 3 } - equal { purge list { } { .even } } list { } - equal { purge "1234" { .to-integer .even } } { "1" "3" } - equal { purge "" { .to-integer .even } } { } - } - - group "purge!" - "" - { - } - - { - equal { { 1 2 3 } :x purge! { .even } 'x , x } { 1 3 } - } - - group "map" - "" - { - } - - { - equal { map { 1 2 3 } { + 1 } } { 2 3 4 } - equal { map { } { + 1 } } { } - equal { map { "aaa" "bb" "c" } { .length? } } { 3 2 1 } - equal { map list { "aaa" "bb" "c" } { .length? } } list { 3 2 1 } - equal { map list { 3 4 5 6 } { .multiple-of 3 } } list { 1 0 0 1 } - equal { map list { } { + 1 } } list { } - ; equal { map "abc" { + "-" } .join } "a-b-c-" ; TODO doesn't work, fix join - equal { map "123" { .to-integer } } { 1 2 3 } - equal { map "123" ?to-integer } { 1 2 3 } - equal { map "" { + "-" } } { } - } - - group "map\\pos" - "" - { - } - - { - equal { map\pos { 1 2 3 } 'i { + i } } { 2 4 6 } - equal { map\pos { } 'i { + i } } { } - equal { map\pos list { 1 2 3 } 'i { + i } } list { 2 4 6 } - equal { map\pos list { } 'i { + i } } list { } - equal { map\pos "abc" 'i { + i } } { "a1" "b2" "c3" } - equal { map\pos "" 'i { + i } } { } - } - - group "map\\idx" - "" - { - } - - { - equal { map\idx { 1 2 3 } 'i { + i } } { 1 3 5 } - equal { map\idx { } 'i { + i } } { } - equal { map\idx list { 1 2 3 } 'i { + i } } list { 1 3 5 } - equal { map\idx list { } 'i { + i } } list { } - equal { map\idx "abc" 'i { + i } } { "a0" "b1" "c2" } - equal { map\idx "" 'i { + i } } { } - } - - group "reduce" - "" - { - } - - { - equal { reduce { 1 2 3 } 'acc { + acc } } 6 - equal { reduce list { 1 2 3 } 'acc { + acc } } 6 - equal { reduce "abc" 'acc { + acc } } "cba" - equal { try { reduce { } 'acc { + acc } } |type? } 'error - equal { try { reduce list { } 'acc { + acc } } |type? } 'error - equal { try { reduce "" 'acc { + acc } } |type? } 'error - } - - group "fold" - "" - { - } - - { - equal { fold { 1 2 3 } 'acc 1 { + acc } } 7 - equal { fold { } 'acc 1 { + acc } } 1 - equal { fold list { 1 2 3 } 'acc 1 { + acc } } 7 - equal { fold list { } 'acc 1 { + acc } } 1 - equal { fold "abc" 'acc "123" { + acc } } "cba123" - equal { fold "" 'acc "123" { + acc } } "123" - } - - group "partition" - "" - { - } - - { - equal { partition { 1 2 3 4 } { > 2 } } { { 1 2 } { 3 4 } } - equal { partition { "a" "b" 1 "c" "d" } { .is-integer } } { { "a" "b" } { 1 } { "c" "d" } } - equal { partition { "a" "b" 1 "c" "d" } ?is-integer } { { "a" "b" } { 1 } { "c" "d" } } - equal { partition { } { > 2 } } { { } } - equal { partition list { 1 2 3 4 } { > 2 } } list vals { list { 1 2 } list { 3 4 } } - equal { partition list { "a" "b" 1 "c" "d" } ?is-integer } list vals { list { "a" "b" } list { 1 } list { "c" "d" } } - equal { partition list { } { > 2 } } list vals { list { } } - equal { partition "aaabbccc" { , } } list { "aaa" "bb" "ccc" } - equal { partition "" { , } } list { "" } - equal { partition "aaabbccc" ?is-string } list { "aaabbccc" } - } - - group "group" - "" - { - } - - { - ; Equality for dicts doesn't yet work consistently - ;equal { { "Anne" "Mitch" "Anya" } .group { .first } } dict vals { "A" list { "Anne" "Anya" } "M" list { "Mitch" } } - ;equal { { "Anne" "Mitch" "Anya" } .group ?first } dict vals { "A" list { "Anne" "Anya" } "M" list { "Mitch" } } - ;equal { { } .group { .first } } dict vals { } - ;equal { { "Anne" "Mitch" "Anya" } .list .group { .first } } dict vals { "A" list { "Anne" "Anya" } "M" list { "Mitch" } } - ;equal { { "Anne" "Mitch" "Anya" } .list .group ?first } dict vals { "A" list { "Anne" "Anya" } "M" list { "Mitch" } } - equal { { } .list .group { .first } } dict vals { } - equal { try { { 1 2 3 4 } .group { .even } } |type? } 'error ; TODO keys can only be string currently - } - - group "filter" - "" - { - } - - { - equal { filter { 1 2 3 4 } { .even } } { 2 4 } - equal { filter { 1 2 3 4 } ?even } { 2 4 } - equal { filter { } { .even } } { } - equal { filter list { 1 2 3 4 } { .even } } list { 2 4 } - equal { filter list { 1 2 3 4 } ?even } list { 2 4 } - equal { filter list { } { .even } } list { } - equal { filter "1234" { .to-integer .even } } { "2" "4" } - equal { filter "01234" ?to-integer } { "1" "2" "3" "4" } - equal { filter "" { .to-integer .even } } { } - } - - group "seek" - "" - { - } - - { - equal { seek { 1 2 3 4 } { .even } } 2 - equal { seek list { 1 2 3 4 } { .even } } 2 - equal { seek "1234" { .to-integer .even } } "2" - equal { try { seek { 1 2 3 4 } { > 5 } } |type? } 'error - equal { try { seek list { 1 2 3 4 } { > 5 } } |type? } 'error - equal { try { seek "1234" { .to-integer > 5 } } |type? } 'error - } - - group "max" - "" - { - } - - { - equal { max { 8 2 10 6 } } 10 - equal { max list { 8 2 10 6 } } 10 - equal { try { max { } } |type? } 'error - equal { try { max list { } } |type? } 'error - } - - group "min" - "" - { - } - - { - equal { min { 8 2 10 6 } } 2 - equal { min list { 8 2 10 6 } } 2 - equal { try { min { } } |type? } 'error - equal { try { min list { } } |type? } 'error - } - - group "avg" - "" - { - } - - { - equal { avg { 8 2 10 6 } } 6.5 - equal { avg list { 8 2 10 6 } } 6.5 - equal { try { avg { } } |type? } 'error - equal { try { avg list { } } |type? } 'error - } - - group "sum" - "" - { - } - - { - equal { sum { 8 2 10 6 } } 26 - equal { sum { 8 2 10 6.5 } } 26.5 - equal { sum { } } 0 - equal { sum list { 8 2 10 6 } } 26 - equal { sum list { 8 2 10 6.5 } } 26.5 - equal { sum list { } } 0 - } - - group "mul" - "" - { - } - - { - equal { mul { 1 2 3 4 5 } } 120 - equal { mul { 1 2.0 3.3 4 5 } } 132.0 - } - - group "sort" - "" - { - } - - { - equal { sort { 6 12 1 } } { 1 6 12 } - equal { sort x: { 6 12 1 } x } { 6 12 1 } - equal { sort { "b" "c" "a" } } { "a" "b" "c" } - } - - group "sort!" - "" - { - } - - { - error { x: { 6 12 1 } , sort! x } - equal { x: ref { 6 12 1 } , sort! x , x } { 1 6 12 } - } - - group "unique" - "" - { - } - - { - equal { list { 3 2 3 5 3 2 } .unique |sort } list { 2 3 5 } - equal { unique list { 1 1 2 2 3 } |sort } list { 1 2 3 } - equal { unique list { 1 1 2 2 } |sort } list { 1 2 } - equal { unique { 1 1 2 2 3 } |sort } { 1 2 3 } - equal { unique { 1 1 2 2 } |sort } { 1 2 } - equal { unique "aabbc" |length? } 3 - equal { unique "ab" |length? } 2 - } - - group "reverse" - "" - { - } - - { - equal { reverse { 3 1 2 3 } } { 3 2 1 3 } - equal { reverse { 3 1 2 3 } } { 3 2 1 3 } - } - - group "reverse!" - "" - { - } - - { - error { reverse! { 3 1 2 3 } } - equal { reverse! ref { 3 1 2 3 } } { 3 2 1 3 } - } - - group "does" - "" - { - } - - { - equal { does { 123 } |type? } 'function - equal { x: does { 123 } x } 123 - } - - group "fn1" - "" - { - } - - { - equal { fn1 { .pass { } } |type? } 'function - equal { x: fn1 { } , x 123 } 123 - equal { x: fn1 { .pass { } } , x 123 } 123 - equal { x: fn1 { + 1 } , x 123 } 124 - } - - group "fn" - "" - { - } - - { - equal { fn { } { } |type? } 'function - equal { x: fn { } { 234 } , x } 234 - equal { x: fn { x } { x } , x 123 } 123 - equal { x: fn { x } { + 123 } , x 123 } 246 - } - - group "pfn" - "" - { - } - - { - equal { pfn { } { } |type? } 'function - equal { x: pfn { x } { + 123 } , x 123 } 246 - error { x: pfn { x } { .print } , x 123 } - } - - group "newline" - "" - { - } - - { - equal { newline } "\n" - } - - group "ln" - "" - { - } - - { - equal { "123" .ln } "123\n" - } - - group "trim" - "" - { - } - - { - equal { trim " ASDF " } "ASDF" - } - - group "trim\\" - "" - { - } - - { - equal { trim\ "__ASDF__" "_" } "ASDF" - } - - group "trim\\right" - "" - { - } - - { - equal { trim\right "__ASDF__" "_" } "__ASDF" - } - - group "trim\\left" - "" - { - } - - { - equal { trim\left "___ASDF__" "_" } "ASDF__" - } - - group "replace" - "" - { - } - - { - equal { replace "...xoxo..." "xo" "LoL" } "...LoLLoL..." - } - - group "substring" - "" - { - } - - { - equal { substring "...xoxo..." 3 7 } "xoxo" - } - - group "contains" - "" - { - } - - { - equal { contains "...xoxo..." "xo" } 1 - equal { contains "...xoxo..." "lol" } 0 - } - - group "has-suffix" - "" - { - } - - { - equal { has-suffix "xoxo..." "xoxo" } 0 - equal { has-suffix "...xoxo" "xoxo" } 1 - } - - group "has-prefix" - "" - { - } - - { - equal { has-prefix "xoxo..." "xoxo" } 1 - equal { has-prefix "...xoxo" "xoxo" } 0 - } - - group "index?" - "" - { - } - - { - equal { index? "...xo..." "xo" } 3 - } - - group "position?" - "" - { - } - - { - equal { position? "...xo..." "xo" } 4 - } - - group "encode\\base64" - "" - { - } - - { - equal { encode\base64 "abcd" } "YWJjZA==" - } - - group "decode\\base64" - "" - { - } - - { - equal { decode\base64 encode\base64 "abcd" } "abcd" - } - - group "space" - "" - { - } - - { - equal { "abcd" .space } "abcd " - } - - group "concat" - "" - { - } - - { - equal { "abcd" .concat "cde" } "abcdcde" - equal { concat { 1 2 3 4 } { 2 4 5 } } { 1 2 3 4 2 4 5 } - } - - group "union" - "" - { - } - - { - ; equal { "abcd" .union "cde" } "abcde" - equal { union { 1 2 3 4 } { 2 4 5 } |length? } 5 ; order is not certain - equal { union list { 1 2 3 4 } list { 2 4 5 } |length? } 5 ; order is not certain - equal { union { 8 2 } { 1 9 } |sort } { 1 2 8 9 } - equal { union { 1 2 } { } |sort } { 1 2 } - equal { union { } { 1 9 } |sort } { 1 9 } - equal { union { } { } } { } - equal { union list { 1 2 } list { 1 2 3 4 } |sort } list { 1 2 3 4 } - equal { union list { 1 2 } list { 1 } |sort } list { 1 2 } - equal { union list { 1 2 } list { } |sort } list { 1 2 } - equal { union list { } list { 1 2 } |sort } list { 1 2 } - equal { union list { } list { } } list { } - } - - group "intersection" - "" - { - } - - { - equal { "abcd" .intersection "cde" } "cd" - equal { intersection { 1 2 3 4 } { 2 4 5 } } { 2 4 } - equal { intersection { 1 3 5 6 } { 2 3 4 5 } } { 3 5 } - equal { intersection { 1 2 3 } { } } { } - equal { intersection { } { 2 3 4 } } { } - equal { intersection { 1 2 3 } { 4 5 6 } } { } - equal { intersection { } { } } { } - equal { intersection list { 1 3 5 6 } list { 2 3 4 5 } } list { 3 5 } - equal { intersection list { 1 2 3 } list { } } list { } - equal { intersection list { } list { 2 3 4 } } list { } - equal { intersection list { 1 2 3 } list { 4 5 6 } } list { } - equal { intersection list { } list { } } list { } - } - - group "difference" - "" - { - } - - { - equal { "abcde" .difference "cde" } "ab" - equal { difference { 1 2 3 4 } { 2 4 } } { 1 3 } - equal { difference list { "Bob" "Sal" "Joe" } list { "Joe" } } list { "Bob" "Sal" } - equal { difference "abc" "bc" } "a" - equal { difference "abc" "abc" } "" - equal { difference "abc" "" } "abc" - equal { difference "" "" } "" - equal { difference { 1 3 5 6 } { 2 3 4 5 } } { 1 6 } - equal { difference { 1 2 3 } { } } { 1 2 3 } - equal { difference { } { 2 3 4 } } { } - equal { difference { } { } } { } - equal { difference list { 1 3 5 6 } list { 2 3 4 5 } } list { 1 6 } - equal { difference list { 1 2 3 } list { } } list { 1 2 3 } - equal { difference list { } list { 2 3 4 } } list { } - equal { difference list { } list { } } list { } - } - - group "capitalize" - "" - { - } - - { - equal { capitalize "abcde" } "Abcde" - } - - group "to-lower" - "" - { - } - - { - equal { to-lower "ABCDE" } "abcde" - } - - group "to-upper" - "" - { - } - - { - equal { to-upper "abcde" } "ABCDE" - } - - group "concat3" - "" - { - } - - { - equal { concat3 "aa" "BB" "cc" } "aaBBcc" - } - - group "join" - "" - { - } - - { - equal { join { "Mary" "Anne" } } "MaryAnne" - equal { join { "Spot" "Fido" "Rex" } } "SpotFidoRex" - } - - group "join\\with" - "" - { - arg "* to-join" - arg "* delimiter" - } - - { - equal { join\with { "Mary" "Anne" } " " } "Mary Anne" - equal { join\with { "Spot" "Fido" "Rex" } "/" } "Spot/Fido/Rex" - } - - group "split" - "" - { - } - - { - equal { split "a,b,c" "," } { "a" "b" "c" } - } - - group "split\\quoted" - "" - { - arg "to-split" - arg "splitter" - arg "quote" - } - - { - equal { split\quoted "`a,b`,c,d" "," "`" } { "`a,b`" "c" "d" } - } - - group "split\\many" - "" - { - arg "* string" - arg "* separator-set" - } - - { - equal { split\many "192.0.0.1" "." } { "192" "0" "0" "1" } - equal { split\many "abcd..e.q|bar" ".|" } { "abcd" "e" "q" "bar" } - } - - group "split\\every" - "" - { - arg "* string" - arg "* N" - } - - { - equal { split\every "abcdefg" 3 } { "abc" "def" "g" } - equal { split\every "abcdefg" 2 } { "ab" "cd" "ef" "g" } - equal { split\every "abcdef" 2 } { "ab" "cd" "ef" } - } - - group "first" - "" - { - } - - { - equal { first { 1 2 3 4 } } 1 - equal { first "abcde" } "a" - equal { first list { 1 2 3 } } 1 - } - - group "rest" - "" - { - } - - { - equal { rest { 1 2 3 4 } } { 2 3 4 } - equal { rest "abcde" } "bcde" - equal { rest list { 1 2 3 } } list { 2 3 } - } - - group "rest\\from" - "" - { - } - - { - equal { rest\from { 1 2 3 4 5 6 } 3 } { 4 5 6 } - equal { rest\from "abcdefg" 1 } "bcdefg" - equal { rest\from list { 1 2 3 4 } 2 } list { 3 4 } - } - - group "tail" - "" - { - } - - { - equal { tail { 1 2 3 4 5 6 7 } 3 } { 5 6 7 } - equal { tail "abcdefg" 4 } "defg" - equal { tail list { 1 2 3 4 } 1 } list { 4 } - } - - group "second" - "" - { - } - - { - equal { second { 123 234 345 } } 234 - } - - group "third" - "" - { - } - - { - equal { third { 123 234 345 } } 345 - } - - group "last" - "" - { - } - - { - equal { last { 1 2 } } 2 - equal { last "abcd" } "d" - equal { last list { 4 5 6 } } 6 - } - - group "head" - "" - { - } - - { - equal { head { 4 5 6 7 } 3 } { 4 5 6 } - equal { head "abcdefg" 2 } "ab" - equal { head "abcdefg" 4 } "abcd" - equal { head list { 10 20 30 40 } 2 } list { 10 20 } - } - - group "nth" - "" - { - } - - { - equal { nth { 1 2 3 4 5 } 4 } 4 - equal { nth { "a" "b" "c" "d" "e" } 2 } "b" - } - - group "values" - "" - { - } - - { - equal { dict { "a" 1 "b" 2 "c" 3 } |values } list { 1 2 3 } - } - -} - -section "Logic" "" { - - group "transpose" - "" - { - } - - { - equal { { { 1 2 3 } { 4 5 6 } } .transpose } { { 1 4 } { 2 5 } { 3 6 } } - equal { { { 1 4 } { 2 5 } { 3 6 } } .transpose } { { 1 2 3 } { 4 5 6 } } - } - - group "remove-last!" - "" - { - } - - { - equal { x: ref { 1 2 3 4 } remove-last! 'x x } { 1 2 3 } - equal { x: ref { 1 2 3 4 } remove-last! 'x } { 1 2 3 } - } - - group "append!" - "" - { - } - - { - ; TODO equal { x: ref { 1 2 3 } append! { 4 } x , x } { 1 2 3 4 } - equal { x: ref { 1 2 3 } append! 4 'x , x } { 1 2 3 4 } - } - - group "change\\nth!" - "" - { - } - - { - equal { x: ref { 1 2 3 } change\nth! x 2 222 , x } { 1 222 3 } - } - - group "_->" - "" - { - } - - { - equal { { 23 34 45 } -> 1 } 34 - } - - group "_<-" - "" - { - } - - { - equal { 0 <- { 23 34 45 } } 23 - } - - group "_<~" - "" - { - } - - { - equal { 2 <~ { 23 34 45 } } 34 - } - - group "_~>" - "" - { - } - - { - equal { { 23 34 45 } ~> 1 } 23 - } - - group "return" - "" - { - } - - { - equal { x: fn { } { return 101 202 } x } 101 - } - - group "range" - "" - { - arg "* low-value" - arg "* high-value" - } - - { - equal { range 1 5 } { 1 2 3 4 5 } - } - - group "is-empty" - "" - { - } - - { - equal { { } .is-empty } 1 - equal { dict { } |is-empty } 1 - equal { table { 'a 'b } { } |is-empty } 1 - } - - group "length?" - "" - { - } - - { - equal { { 1 2 3 } .length? } 3 - equal { length? "abcd" } 4 - equal { table { 'val } { 1 2 3 4 } |length? } 4 - equal { vector { 10 20 30 } |length? } 3 - } - - group "cmd" - "" - { - } - - { - equal { cmd `echo "hello"` } 1 - } - - group "rye" - "" - { - } - - { -; equal { rye .type? } 'native - } - - group "sleep" - "" - { - } - - { -; equal { time-it { sleep 10 } } 10 - } - - group "seconds" - "" - { - } - - { -; equal { 5 .seconds } 5000000000 - } - - group "minutes" - "" - { - } - - { -; equal { 5 .minutes } 5000000000 * 60 - } - - group "hours" - "" - { - } - - { -; equal { 5 .hours } 5000000000 * 60 * 60 - } - -} - diff --git a/info/formats.html b/info/formats.html new file mode 100644 index 00000000..4172c413 --- /dev/null +++ b/info/formats.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + +
+ +
+ +

Regexp

Go like Regular expressions

+

regexp

+
regexp "[0-9]" |type?
+; returns native
+
+

regexp//is-match

+
regexp "[0-9]" |is-match "5"
+; returns 1
+
regexp "[0-9]" |is-match "a"
+; returns 0
+
+

regexp//submatch?

+
regexp "x([0-9]+)y" |submatch? "x123y"
+; returns "123"
+
+

regexp//submatches?

+
regexp "x([0-9]+)y" |submatches? "x123y x234y"
+; returns { "123" }
+
+

regexp//submatches\all?

+
regexp "x([0-9]+)(y+)?" |submatches\all? "x11yy x22"
+; returns { { "11" "yy" } { "22" "" } }
+
+

regexp//find-all

+
regexp "[0-9]+" |find-all "x123y x234y"
+; returns { "123" "234" }
+
+

regexp//match?

+
regexp "[0-9]+c+" |match? "aa33bb55cc"
+; returns "55cc"
+
+

regexp//replace-all

+
regexp "[0-9]+" |replace-all "x123y x234y" "XXX"
+; returns "xXXXy xXXXy"
+
+
+

Validation

validation dialect for Rye values

+

validate

+
validate dict { a: 1 } { a: required }
+; returns dict { a 1 }
+
validate dict { a: 1 } { b: optional 2 }
+; returns dict { b 2 }
+
validate dict { a: 1 } { a: optional 0 b: optional 2 }
+; returns dict { b 2 a 1 }
+
validate dict { a: 1 } { a: required integer }
+; returns dict { a 1 }
+
validate dict { a: "1" } { a: required integer }
+; returns dict { a 1 }
+
validate dict { a: "1" } { a: required integer } |-> "a" |type?
+; returns integer
+
validate dict { a: 3.14 } { a: required decimal }
+; returns dict { a 3.14 }
+
validate dict { a: 3 } { a: required decimal }
+; returns dict { a 3 }
+
validate dict { a: "3.14" } { a: required decimal }
+; returns dict { a 3.14 }
+
validate dict { a: "3.14" } { a: required decimal } |-> "a" |type?
+; returns decimal
+
validate dict { a: "jim" } { a: required string }
+; returns dict { a "jim" }
+
validate dict { a: "e@ma.il" } { a: required email }
+; returns dict { a "e@ma.il" }
+
validate dict { a: "e@ma.il" } { a: required email } |-> "a" |type?
+; returns string
+
validate dict { a: "30.12.2024" } { a: required date }
+; returns dict { a 2024-12-30 }
+
validate dict { a: "2024-12-30" } { a: required date }
+; returns dict { a 2024-12-30 }
+
validate dict { a: "2024-12-30" } { a: required date } |-> "a" |type?
+; returns date
+
validate dict { a: 5 } { a: required integer check { < 10 } }
+; returns dict { a 5 }
+
validate dict { a: 5 } { a: required integer calc { + 10 } }
+; returns dict { a 15 }
+
validate dict { a: 5 } { b: required } |disarm |type?
+; returns error
+
validate dict { b: "5c" } { b: optional 0 integer } |disarm |type?
+; returns error
+
validate dict { b: "2x0" } { b: required decimal } |disarm |status?
+; returns 403
+
validate dict { b: "not-mail" } { b: required email } |disarm |message?
+; returns "validation error"
+
validate dict { b: "2023-1-1" } { b: required date } |disarm |details?
+; returns dict { b "not date" }
+
+

validate>ctx

+
validate>ctx dict { a: 1 } { a: required } |type?
+; returns ctx
+
validate>ctx dict { a: 1 } { a: optional 0 } |-> 'a
+; returns 1
+
+
+

JSON

parsing and generating JSON

+

parse-json

+
"[ 1, 2, 3 ]" |parse-json |length?
+; returns 3
+
"[ 1, 2, 3 ]" |parse-json |type?
+; returns list
+
+

to-json

+
list { 1 2 3 } |to-json
+; returns "[1, 2, 3] "
+
+

to-json\lines

+
table { "a" "b" } { 2 "x" 3 "y" } |to-json\lines
+; returns "{"a": 2, "b": "x"} 
+; {"a": 3, "b": "y"} 
+; "
+
+
+

SXML

streaming, Sax like XML dialect (still in design)

+

rye-reader//do-sxml

+
"<scene><bot>C3PO</bot><bot>R2D2</bot><jedi>Luke</jedi></scene>" |reader .do-sxml { _ [ .prns ] }
+; prints "C3PO R2D2 Luke "
+
"<scene><bot>C3PO</bot><bot>R2D2</bot><jedi>Luke</jedi></scene>" |reader .do-sxml { <bot> { _ [ .prns ] } }
+; prints "C3PO R2D2 "
+
"<scene><ship>XWing</ship><bot>R2D2</bot><jedi>Luke</jedi></scene>" |reader .do-sxml { <bot> <jedi> { _ [ .prns ] } }
+; prints "R2D2 Luke "
+
"<scene><xwing><bot>R2D2</bot><person>Luke</person></xwing><destroyer><person>Vader</person></destroyer></scene>" |reader .do-sxml { <xwing> { <person> { _ [ .prns ] } } }
+; prints "Luke "
+
+

rye-sxml-start//attr?

+
"<scene><ship type="xwing"><person age="25">Luke</person></ship><ship type="destroyer"><person age="55">Vader</person></ship></scene>" |reader .do-sxml { <ship> [ .attr? 0 |prns ] }
+; prints "xwing destroyer "
+
"<scene><ship type="xwing"><person age="25">Luke</person></ship><ship type="destroyer"><person age="55">Vader</person></ship></scene>" |reader .do-sxml { <person> [ .attr? 0 |prns ] }
+; prints "25 55 "
+
+
+

HTML

streaming, Sax like HTML dialect (still in design)

+

unescape\html

+
unescape\html "&gt;hello&lt;"
+; returns ">hello<"
+
+

escape\html

+
escape\html "<hello>"
+; returns "&lt;hello&gt;"
+
+

html->markdown

+
html->markdown "<h1>title</h1><p>para</p>"
+; returns "# title
+; 
+; para"
+
+

rye-reader//parse-html

+
"<html><body><div class='menu'><a href='/'>home</a><a href='/about/'>about</a>" |reader .parse-html { <a> [ .attr? 'href |prns ] }
+; prints "/ /about/ "
+
+
+
+
+ + + + + diff --git a/info/formats.info.rye b/info/formats.info.rye new file mode 100644 index 00000000..52e4ec29 --- /dev/null +++ b/info/formats.info.rye @@ -0,0 +1,242 @@ +section "Regexp " "Go like Regular expressions" { + group "regexp" + "" + { + arg "* pattern: regular expression" + } + + { + equal { regexp "[0-9]" |type? } 'native + } + + group "regexp//is-match" + "" + { + arg "* regexp - native regexp value" + arg "* input - value to test for matching" + } + + { + equal { regexp "[0-9]" |is-match "5" } 1 + equal { regexp "[0-9]" |is-match "a" } 0 + } + + group "regexp//submatch?" + "" + { + } + + { + equal { regexp "x([0-9]+)y" |submatch? "x123y" } "123" + } + + group "regexp//submatches?" + "" + { + } + + { + equal { regexp "x([0-9]+)y" |submatches? "x123y x234y" } { "123" } + } + + group "regexp//submatches\all?" + "" + { + } + + { + equal { regexp "x([0-9]+)(y+)?" |submatches\all? "x11yy x22" } { { "11" "yy" } { "22" "" } } + } + + group "regexp//find-all" + "" + { + } + + { + equal { regexp "[0-9]+" |find-all "x123y x234y" } { "123" "234" } + } + + group "regexp//match?" + "" + { + arg "* regexp value" + arg "* input" + } + + { + equal { regexp "[0-9]+c+" |match? "aa33bb55cc" } "55cc" + } + + group "regexp//replace-all" + "" + { + } + + { + equal { regexp "[0-9]+" |replace-all "x123y x234y" "XXX" } "xXXXy xXXXy" + } + +} + +section "Validation " "validation dialect for Rye values" { + group "validate" + "" + { + } + + { + equal { validate dict { a: 1 } { a: required } } dict { a: 1 } + equal { validate dict { a: 1 } { b: optional 2 } } dict { b: 2 } + equal { validate dict { a: 1 } { a: optional 0 b: optional 2 } } dict { a: 1 b: 2 } + equal { validate dict { a: 1 } { a: required integer } } dict { a: 1 } + equal { validate dict { a: "1" } { a: required integer } } dict { a: 1 } + equal { validate dict { a: "1" } { a: required integer } -> "a" |type? } 'integer + equal { validate dict { a: 3.14 } { a: required decimal } } dict { a: 3.14 } + equal { validate dict { a: 3 } { a: required decimal } } dict { a: 3.0 } + equal { validate dict { a: "3.14" } { a: required decimal } } dict { a: 3.14 } + equal { validate dict { a: "3.14" } { a: required decimal } -> "a" |type? } 'decimal + equal { validate dict { a: "jim" } { a: required string } } dict { a: "jim" } + equal { validate dict { a: "e@ma.il" } { a: required email } } dict { a: "e@ma.il" } + equal { validate dict { a: "e@ma.il" } { a: required email } -> "a" |type? } 'string + equal { validate dict { a: "30.12.2024" } { a: required date } } dict [ "a" date "2024-12-30" ] + equal { validate dict { a: "2024-12-30" } { a: required date } } dict [ "a" date "2024-12-30" ] + equal { validate dict { a: "2024-12-30" } { a: required date } -> "a" |type? } 'date + equal { validate dict { a: 5 } { a: required integer check { < 10 } } } dict [ "a" 5 ] + equal { validate dict { a: 5 } { a: required integer calc { + 10 } } } dict [ "a" 15 ] + equal { validate dict { a: 5 } { b: required } |disarm |type? } 'error + equal { validate dict { b: "5c" } { b: optional 0 integer } |disarm |type? } 'error + equal { validate dict { b: "2x0" } { b: required decimal } |disarm |status? } 403 ; ("The server understood the request, but is refusing to fulfill it"). Contrary to popular opinion, RFC2616 doesn't say "403 is only intended for failed authentication", but "403: I know what you want, but I won't do that". That condition may or may not be due to authentication. + equal { validate dict { b: "not-mail" } { b: required email } |disarm |message? } "validation error" + equal { validate dict { b: "2023-1-1" } { b: required date } |disarm |details? } dict { b: "not date" } + } + + group "validate>ctx" + "" + { + } + + { + equal { validate>ctx dict { a: 1 } { a: required } |type? } 'ctx ; TODO rename to context + equal { validate>ctx dict { a: 1 } { a: optional 0 } -> 'a } 1 + } + +} + +section "JSON " "parsing and generating JSON" { + group "parse-json" + "" + { + } + + { + equal { "[ 1, 2, 3 ]" |parse-json |length? } 3 + equal { "[ 1, 2, 3 ]" |parse-json |type? } 'list + } + + group "to-json" + "" + { + } + + { + equal { list { 1 2 3 } |to-json } "[1, 2, 3] " + equal { dict { a: 1 b: 2 c: 3 } |to-json } `{"a": 1, "b": 2, "c": 3} ` + } + + group "to-json\lines" + "" + { + } + + { + equal { table { "a" "b" } { 2 "x" 3 "y" } |to-json\lines } `{"a": 2, "b": "x"} \n{"a": 3, "b": "y"} \n` + } + +} + +section "SXML " "streaming, Sax like XML dialect (still in design)" { + group "rye-reader//do-sxml" + "" + { + } + + { + stdout { + "C3POR2D2Luke" |reader + .do-sxml { _ [ .prns ] } + } "C3PO R2D2 Luke " + stdout { + "C3POR2D2Luke" |reader + .do-sxml { { _ [ .prns ] } } + } "C3PO R2D2 " + stdout { + "XWingR2D2Luke" |reader + .do-sxml { { _ [ .prns ] } } + } "R2D2 Luke " + stdout { + "R2D2LukeVader" |reader + .do-sxml { { { _ [ .prns ] } } } + } "Luke " + } + + group "rye-sxml-start//attr?" + "" + { + } + + { + stdout { + `LukeVader` |reader + .do-sxml { [ .attr? 0 |prns ] } + } "xwing destroyer " + stdout { + `LukeVader` |reader + .do-sxml { [ .attr? 0 |prns ] } + } "25 55 " + } + +} + +section "HTML " "streaming, Sax like HTML dialect (still in design)" { + group "unescape\html" + "" + { + } + + { + equal { unescape\html ">hello<" } ">hello<" + } + + group "escape\html" + "" + { + } + + { + equal { escape\html "" } "<hello>" + } + + group "html->markdown" + "" + { + } + + { + equal { html->markdown "

title

para

" } "# title\n\npara" + } + + group "rye-reader//parse-html" + "" + { + } + + { + stdout { "