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 ">hello<"
+; returns ">hello<"
+
+
escape\html
+
escape\html "<hello>"
+; returns "<hello>"
+
+
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 { "