aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
authorEduardo Julian2020-12-04 01:13:01 -0400
committerEduardo Julian2020-12-04 01:13:01 -0400
commit8df63aae42c40ac0413ccfacc3b2e8eb72e00a15 (patch)
tree5e1eb6833398b8a67a2e3d0db4a615204a25f80f /stdlib
parent0205e5146b50ab066d152fccda0fc8cef4eef852 (diff)
Re-named old luxc-jvm to lux-bootstrapper.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/project.clj2
-rw-r--r--stdlib/source/lux.lux4
-rw-r--r--stdlib/source/lux/data/number/frac.lux8
-rw-r--r--stdlib/source/lux/data/number/int.lux47
-rw-r--r--stdlib/source/program/aedifex.lux132
-rw-r--r--stdlib/source/program/compositor/import.lux6
-rw-r--r--stdlib/source/test/lux/data/number/frac.lux240
-rw-r--r--stdlib/source/test/lux/data/number/i64.lux26
-rw-r--r--stdlib/source/test/lux/data/number/int.lux179
9 files changed, 400 insertions, 244 deletions
diff --git a/stdlib/project.clj b/stdlib/project.clj
index dcaec7c4c..62474fea1 100644
--- a/stdlib/project.clj
+++ b/stdlib/project.clj
@@ -20,7 +20,7 @@
:manifest {"lux" ~version}
:source-paths ["source"]
- :dependencies [[com.github.luxlang/luxc-jvm ~version]]
+ :dependencies [[com.github.luxlang/lux-bootstrapper ~version]]
:profiles {:bibliotheca {:description "Standard library for the Lux programming language."
:dependencies []
:lux {:test "test/lux"}}
diff --git a/stdlib/source/lux.lux b/stdlib/source/lux.lux
index a5ee64cab..8a64392e4 100644
--- a/stdlib/source/lux.lux
+++ b/stdlib/source/lux.lux
@@ -2244,9 +2244,9 @@
#Nil
(-> Int Text)
(if ("lux i64 =" +0 value)
- "0"
+ "+0"
(let' [sign (if ("lux i64 <" value +0)
- ""
+ "+"
"-")]
(("lux check" (-> Int Text Text)
(function' recur [input output]
diff --git a/stdlib/source/lux/data/number/frac.lux b/stdlib/source/lux/data/number/frac.lux
index d8bc34f93..34b2d6532 100644
--- a/stdlib/source/lux/data/number/frac.lux
+++ b/stdlib/source/lux/data/number/frac.lux
@@ -417,3 +417,11 @@
(..- standard)
..abs
(..< margin-of-error)))
+
+(def: #export (mod divisor dividend)
+ (All [m] (-> Frac Frac Frac))
+ (if (..= (..signum divisor) (..signum dividend))
+ (..% divisor dividend)
+ (case (..% divisor dividend)
+ +0.0 +0.0
+ rem (..+ divisor rem))))
diff --git a/stdlib/source/lux/data/number/int.lux b/stdlib/source/lux/data/number/int.lux
index 38a0dc63a..087302b8d 100644
--- a/stdlib/source/lux/data/number/int.lux
+++ b/stdlib/source/lux/data/number/int.lux
@@ -87,7 +87,9 @@
[(../ param subject)
(..% param subject)])
-(def: #export negate (-> Int Int) (..* -1))
+(def: #export (negate value)
+ (-> Int Int)
+ (..- value +0))
(def: #export (abs x)
(-> Int Int)
@@ -102,13 +104,13 @@
## else
+1))
-(def: #export (mod param subject)
+(def: #export (mod divisor dividend)
(All [m] (-> Int Int Int))
- (let [raw (..% param subject)]
- (if (..< +0 raw)
- (let [shift (if (..< +0 param) ..- ..+)]
- (|> raw (shift param)))
- raw)))
+ (if (..= (..signum divisor) (..signum dividend))
+ (..% divisor dividend)
+ (case (..% divisor dividend)
+ +0 +0
+ rem (..+ divisor rem))))
(def: #export even?
(-> Int Bit)
@@ -185,23 +187,26 @@
[minimum ..min (\ ..interval top)]
)
+(def: -sign "-")
+(def: +sign "+")
+
(def: (sign!! value)
(-> Int Text)
(if (..< +0 value)
- "-"
- "+"))
+ ..-sign
+ ..+sign))
(def: (sign?? representation)
(-> Text (Maybe Int))
- (case ("lux text char" 0 representation)
- (^ (char "-"))
- (#.Some -1)
+ (`` (case ("lux text char" 0 representation)
+ (^ (char (~~ (static ..-sign))))
+ (#.Some -1)
- (^ (char "+"))
- (#.Some +1)
+ (^ (char (~~ (static ..+sign))))
+ (#.Some +1)
- _
- #.None))
+ _
+ #.None)))
(def: (int-decode-loop input-size repr sign <base> <to-value> <error>)
(-> Nat Text Int Int (-> Char (Maybe Nat)) Text (Try Int))
@@ -217,7 +222,7 @@
(|> output (..* <base>) (..+ (.int digit-value)))))
(#try.Success (..* sign output)))))
-(template [<struct> <base> <to-character> <to-value> <error>]
+(template [<base> <struct> <to-character> <to-value> <error>]
[(structure: #export <struct>
(Codec Text Int)
@@ -245,10 +250,10 @@
(#try.Failure <error>))
(#try.Failure <error>)))))]
- [binary +2 //nat.binary-character //nat.binary-value "Invalid binary syntax for Int: "]
- [octal +8 //nat.octal-character //nat.octal-value "Invalid octal syntax for Int: "]
- [decimal +10 //nat.decimal-character //nat.decimal-value "Invalid syntax for Int: "]
- [hex +16 //nat.hexadecimal-character //nat.hexadecimal-value "Invalid hexadecimal syntax for Int: "]
+ [+02 binary //nat.binary-character //nat.binary-value "Invalid binary syntax for Int: "]
+ [+08 octal //nat.octal-character //nat.octal-value "Invalid octal syntax for Int: "]
+ [+10 decimal //nat.decimal-character //nat.decimal-value "Invalid syntax for Int: "]
+ [+16 hex //nat.hexadecimal-character //nat.hexadecimal-value "Invalid hexadecimal syntax for Int: "]
)
(structure: #export hash
diff --git a/stdlib/source/program/aedifex.lux b/stdlib/source/program/aedifex.lux
index 06b75afd5..d804fd552 100644
--- a/stdlib/source/program/aedifex.lux
+++ b/stdlib/source/program/aedifex.lux
@@ -5,7 +5,7 @@
[control
[pipe (#+ do>)]
["." io (#+ IO)]
- ["." try (#+ Try)]
+ ["." try (#+ Try) ("#\." functor)]
["." exception (#+ exception:)]
[parser
["." cli (#+ program:)]
@@ -86,70 +86,80 @@
(program: [{[profile operation] /cli.command}]
(do {! io.monad}
- [?profile (/input.read io.monad file.default profile)
- ?console console.default]
- (case [?profile ?console]
- [(#try.Success profile) (#try.Success console)]
- (let [console (console.async console)]
- (case operation
- #/cli.Version
- (exec (/command/version.do! console profile)
- (wrap []))
-
- #/cli.Clean
- (exec (/command/clean.do! console (file.async file.default) profile)
- (wrap []))
+ [?console console.default]
+ (case (try\map console.async ?console)
+ (#try.Failure error)
+ (wrap (log! error))
- #/cli.POM
- (exec (/command/pom.do! console (file.async file.default) profile)
- (wrap []))
-
- #/cli.Install
- (exec (/command/install.do! console (file.async file.default) profile)
- (wrap []))
+ (#try.Success console)
+ (case operation
+ #/cli.Version
+ (exec (/command/version.do! console (\ /.monoid identity))
+ (wrap []))
- (#/cli.Deploy repository identity)
- (exec (case [(get@ #/.identity profile)
- (dictionary.get repository (get@ #/.deploy-repositories profile))]
- [(#.Some artifact) (#.Some repository)]
- (/command/deploy.do! console
- (/repository.async (/repository.remote repository))
- (file.async file.default)
- identity
- artifact
- profile)
+ _
+ (do !
+ [?profile (/input.read io.monad file.default profile)]
+ (case ?profile
+ (#try.Failure error)
+ (wrap (log! error))
- [#.None _]
- (promise\wrap (exception.throw /.no-identity []))
+ (#try.Success profile)
+ (case operation
+ #/cli.Version
+ (wrap [])
+
+ #/cli.Clean
+ (exec (/command/clean.do! console (file.async file.default) profile)
+ (wrap []))
+
+ #/cli.POM
+ (exec (/command/pom.do! console (file.async file.default) profile)
+ (wrap []))
+
+ #/cli.Install
+ (exec (/command/install.do! console (file.async file.default) profile)
+ (wrap []))
- [_ #.None]
- (promise\wrap (exception.throw ..cannot-find-repository [repository (get@ #/.deploy-repositories profile)])))
- (wrap []))
-
- #/cli.Dependencies
- (exec (/command/deps.do! console (file.async file.default) (..repositories profile) profile)
- (wrap []))
+ (#/cli.Deploy repository identity)
+ (exec (case [(get@ #/.identity profile)
+ (dictionary.get repository (get@ #/.deploy-repositories profile))]
+ [(#.Some artifact) (#.Some repository)]
+ (/command/deploy.do! console
+ (/repository.async (/repository.remote repository))
+ (file.async file.default)
+ identity
+ artifact
+ profile)
- (#/cli.Compilation compilation)
- (case compilation
- #/cli.Build (exec (..with-dependencies console /command/build.do! profile)
- (wrap []))
- #/cli.Test (exec (..with-dependencies console /command/test.do! profile)
- (wrap [])))
+ [#.None _]
+ (promise\wrap (exception.throw /.no-identity []))
- (#/cli.Auto auto)
- (do !
- [?watcher watch.default]
- (case ?watcher
- (#try.Failure error)
- (wrap (log! error))
+ [_ #.None]
+ (promise\wrap (exception.throw ..cannot-find-repository [repository (get@ #/.deploy-repositories profile)])))
+ (wrap []))
- (#try.Success watcher)
- (exec (case auto
- #/cli.Build (..with-dependencies console (/command/auto.do! watcher /command/build.do!) profile)
- #/cli.Test (..with-dependencies console (/command/auto.do! watcher /command/test.do!) profile))
- (wrap []))))))
-
- (^or [(#try.Failure error) _]
- [_ (#try.Failure error)])
- (wrap (log! error)))))
+ #/cli.Dependencies
+ (exec (/command/deps.do! console (file.async file.default) (..repositories profile) profile)
+ (wrap []))
+
+ (#/cli.Compilation compilation)
+ (case compilation
+ #/cli.Build (exec (..with-dependencies console /command/build.do! profile)
+ (wrap []))
+ #/cli.Test (exec (..with-dependencies console /command/test.do! profile)
+ (wrap [])))
+
+ (#/cli.Auto auto)
+ (do !
+ [?watcher watch.default]
+ (case ?watcher
+ (#try.Failure error)
+ (wrap (log! error))
+
+ (#try.Success watcher)
+ (exec (case auto
+ #/cli.Build (..with-dependencies console (/command/auto.do! watcher /command/build.do!) profile)
+ #/cli.Test (..with-dependencies console (/command/auto.do! watcher /command/test.do!) profile))
+ (wrap [])))))
+ ))))))
diff --git a/stdlib/source/program/compositor/import.lux b/stdlib/source/program/compositor/import.lux
index edc0160f5..54227c7f3 100644
--- a/stdlib/source/program/compositor/import.lux
+++ b/stdlib/source/program/compositor/import.lux
@@ -46,9 +46,9 @@
(def: (import-library system library import)
(-> (file.System Promise) Library Import (Action Import))
(do (try.with promise.monad)
- [library (: (Action (File Promise))
- (!.use (\ system file) [library]))
- binary (!.use (\ library content) [])]
+ [file (: (Action (File Promise))
+ (!.use (\ system file) [library]))
+ binary (!.use (\ file content) [])]
(promise\wrap
(do {! try.monad}
[tar (<b>.run tar.parser binary)]
diff --git a/stdlib/source/test/lux/data/number/frac.lux b/stdlib/source/test/lux/data/number/frac.lux
index fd963a3ef..193b4a960 100644
--- a/stdlib/source/test/lux/data/number/frac.lux
+++ b/stdlib/source/test/lux/data/number/frac.lux
@@ -12,9 +12,7 @@
["$." monoid]
["$." codec]]}]
[data
- ["." bit ("#\." equivalence)]
- [text
- ["%" format (#+ format)]]]
+ ["." bit ("#\." equivalence)]]
[math
["." random (#+ Random)]]]
{1
@@ -29,31 +27,6 @@
(Random Frac)
(\ random.monad map (|>> (i.% +1,000,000) i.frac) random.int))
-(def: signature
- Test
- (`` ($_ _.and
- (_.with-cover [/.equivalence /.=]
- ($equivalence.spec /.equivalence random.safe-frac))
- (_.with-cover [/.order /.<]
- ($order.spec /.order random.safe-frac))
- (~~ (template [<compose> <monoid>]
- [(_.with-cover [<monoid> <compose>]
- ($monoid.spec /.equivalence <monoid> ..random))]
-
- [/.+ /.addition]
- [/.* /.multiplication]
-
- [/.min /.minimum]
- [/.max /.maximum]
- ))
- (~~ (template [<codec>]
- [(_.with-cover [<codec>]
- ($codec.spec /.equivalence <codec> random.safe-frac))]
-
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
- )))
-
(def: constant
Test
(do random.monad
@@ -117,6 +90,31 @@
(|> expected r.frac /.rev (r.= expected))))
))
+(def: signature
+ Test
+ (`` ($_ _.and
+ (_.with-cover [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.safe-frac))
+ (_.with-cover [/.order /.<]
+ ($order.spec /.order random.safe-frac))
+ (~~ (template [<compose> <monoid>]
+ [(_.with-cover [<monoid> <compose>]
+ ($monoid.spec /.equivalence <monoid> ..random))]
+
+ [/.+ /.addition]
+ [/.* /.multiplication]
+
+ [/.min /.minimum]
+ [/.max /.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.with-cover [<codec>]
+ ($codec.spec /.equivalence <codec> random.safe-frac))]
+
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
+
(with-expansions [<jvm> (as-is (host.import: java/lang/Double
["#::."
(#static doubleToRawLongBits #manual [double] long)
@@ -128,92 +126,104 @@
Test
(<| (_.covering /._)
(_.with-cover [.Frac])
- (`` ($_ _.and
- (do random.monad
- [left random.safe-frac
- right random.safe-frac]
- ($_ _.and
- (_.cover [/.>]
- (bit\= (/.> left right)
- (/.< right left)))
- (_.cover [/.<= /.>=]
- (bit\= (/.<= left right)
- (/.>= right left)))
- ))
- (do random.monad
- [left ..random
- right ..random]
- ($_ _.and
- (_.cover [/.%]
- (let [rem (/.% left right)
- div (|> right (/.- rem) (/./ left))]
- (/.= right
- (|> div (/.* left) (/.+ rem)))))
- (_.cover [/./%]
- (let [[div rem] (/./% left right)]
- (and (/.= div (/./ left right))
- (/.= rem (/.% left right)))))
- ))
- (do random.monad
- [sample random.safe-frac]
- ($_ _.and
- (_.cover [/.-]
- (and (/.= +0.0 (/.- sample sample))
- (/.= sample (/.- +0.0 sample))
- (/.= (/.negate sample)
- (/.- sample +0.0))))
- (_.cover [/./]
- (and (/.= +1.0 (/./ sample sample))
- (/.= sample (/./ +1.0 sample))))
- (_.cover [/.abs]
- (bit\= (/.> sample (/.abs sample))
- (/.negative? sample)))
- (_.cover [/.signum]
- (/.= (/.abs sample)
- (/.* (/.signum sample) sample)))
- ))
- (with-expansions [<jvm> ($_ _.and
- (do random.monad
- [expected random.frac]
- (_.cover [/.to-bits]
- (n.= (.nat (java/lang/Double::doubleToRawLongBits expected))
- (/.to-bits expected))))
- (do random.monad
- [sample random.i64]
- (_.cover [/.from-bits]
- (let [expected (java/lang/Double::longBitsToDouble sample)
- actual (/.from-bits sample)]
- (or (/.= expected actual)
- (and (/.not-a-number? expected)
- (/.not-a-number? actual))))))
- )]
- (for {@.old <jvm>
- @.jvm <jvm>}
- (do random.monad
- [expected random.frac]
- (_.cover [/.to-bits /.from-bits]
- (let [actual (|> expected /.to-bits /.from-bits)]
- (or (/.= expected actual)
- (and (/.not-a-number? expected)
- (/.not-a-number? actual))))))))
- (do random.monad
- [sample random.frac]
- (_.cover [/.hash]
- (n.= (/.to-bits sample)
- (\ /.hash hash sample))))
- (do random.monad
- [expected random.safe-frac]
- (_.cover [/.negate]
- (let [subtraction!
- (/.= +0.0 (/.+ (/.negate expected) expected))
+ ($_ _.and
+ (do random.monad
+ [left random.safe-frac
+ right random.safe-frac]
+ ($_ _.and
+ (_.cover [/.>]
+ (bit\= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit\= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [sample random.safe-frac]
+ ($_ _.and
+ (_.cover [/.-]
+ (and (/.= +0.0 (/.- sample sample))
+ (/.= sample (/.- +0.0 sample))
+ (/.= (/.negate sample)
+ (/.- sample +0.0))))
+ (_.cover [/./]
+ (and (/.= +1.0 (/./ sample sample))
+ (/.= sample (/./ +1.0 sample))))
+ (_.cover [/.abs]
+ (bit\= (/.> sample (/.abs sample))
+ (/.negative? sample)))
+ (_.cover [/.signum]
+ (/.= (/.abs sample)
+ (/.* (/.signum sample) sample)))
+ ))
+ (do random.monad
+ [left ..random
+ right ..random]
+ ($_ _.and
+ (_.cover [/.%]
+ (let [rem (/.% left right)
+ div (|> right (/.- rem) (/./ left))]
+ (/.= right
+ (|> div (/.* left) (/.+ rem)))))
+ (_.cover [/./%]
+ (let [[div rem] (/./% left right)]
+ (and (/.= div (/./ left right))
+ (/.= rem (/.% left right)))))
+ (_.cover [/.mod]
+ (and (/.= (/.signum left)
+ (/.signum (/.mod left right)))
+ (/.= (/.signum right)
+ (/.signum (/.% left right)))
+ (if (/.= (/.signum left) (/.signum right))
+ (/.= (/.% left right)
+ (/.mod left right))
+ (or (and (/.= +0.0 (/.% left right))
+ (/.= +0.0 (/.mod left right)))
+ (/.= (/.+ left (/.% left right))
+ (/.mod left right))))))
+ ))
+ (with-expansions [<jvm> ($_ _.and
+ (do random.monad
+ [expected random.frac]
+ (_.cover [/.to-bits]
+ (n.= (.nat (java/lang/Double::doubleToRawLongBits expected))
+ (/.to-bits expected))))
+ (do random.monad
+ [sample random.i64]
+ (_.cover [/.from-bits]
+ (let [expected (java/lang/Double::longBitsToDouble sample)
+ actual (/.from-bits sample)]
+ (or (/.= expected actual)
+ (and (/.not-a-number? expected)
+ (/.not-a-number? actual))))))
+ )]
+ (for {@.old <jvm>
+ @.jvm <jvm>}
+ (do random.monad
+ [expected random.frac]
+ (_.cover [/.to-bits /.from-bits]
+ (let [actual (|> expected /.to-bits /.from-bits)]
+ (or (/.= expected actual)
+ (and (/.not-a-number? expected)
+ (/.not-a-number? actual))))))))
+ (do random.monad
+ [expected random.safe-frac]
+ (_.cover [/.negate]
+ (let [subtraction!
+ (/.= +0.0 (/.+ (/.negate expected) expected))
- inverse!
- (|> expected /.negate /.negate (/.= expected))]
- (and subtraction!
- inverse!))))
+ inverse!
+ (|> expected /.negate /.negate (/.= expected))]
+ (and subtraction!
+ inverse!))))
+ (do random.monad
+ [sample random.frac]
+ (_.cover [/.hash]
+ (n.= (/.to-bits sample)
+ (\ /.hash hash sample))))
- ..constant
- ..predicate
- ..conversion
- ..signature
- ))))
+ ..constant
+ ..predicate
+ ..conversion
+ ..signature
+ )))
diff --git a/stdlib/source/test/lux/data/number/i64.lux b/stdlib/source/test/lux/data/number/i64.lux
index 89dc6a669..a9cddc921 100644
--- a/stdlib/source/test/lux/data/number/i64.lux
+++ b/stdlib/source/test/lux/data/number/i64.lux
@@ -118,18 +118,20 @@
#let [spare (n.- size /.width)]
offset (\ ! map (n.% spare) random.nat)]
(_.cover [/.region]
- (\= (|> pattern
- ## NNNNYYYYNNNN
- (/.logic-right-shift offset)
- ## ____NNNNYYYY
- (/.left-shift spare)
- ## YYYY________
- (/.logic-right-shift spare)
- ## ________YYYY
- (/.left-shift offset)
- ## ____YYYY____
- )
- (/.and (/.region size offset) pattern))))
+ (case size
+ 0 (\= /.false (/.region size offset))
+ _ (\= (|> pattern
+ ## NNNNYYYYNNNN
+ (/.logic-right-shift offset)
+ ## ____NNNNYYYY
+ (/.left-shift spare)
+ ## YYYY________
+ (/.logic-right-shift spare)
+ ## ________YYYY
+ (/.left-shift offset)
+ ## ____YYYY____
+ )
+ (/.and (/.region size offset) pattern)))))
))))
(def: sub
diff --git a/stdlib/source/test/lux/data/number/int.lux b/stdlib/source/test/lux/data/number/int.lux
index 680def4f5..31b732b88 100644
--- a/stdlib/source/test/lux/data/number/int.lux
+++ b/stdlib/source/test/lux/data/number/int.lux
@@ -1,6 +1,5 @@
(.module:
[lux #*
- ["%" data/text/format (#+ format)]
["_" test (#+ Test)]
[abstract
[monad (#+ do)]
@@ -12,38 +11,160 @@
["$." interval]
["$." monoid]
["$." codec]]}]
+ [data
+ ["." bit ("#\." equivalence)]
+ [number
+ ["f" frac]
+ ["." i64 ("#\." hash)]]]
[math
- ["r" random]]]
+ ["." random]]]
{1
- ["." /
- //]})
+ ["." /]})
-(def: #export test
+(def: signature
Test
- (<| (_.context (%.name (name-of /._)))
- (`` ($_ _.and
- ($equivalence.spec /.equivalence r.int)
- ($order.spec /.order r.int)
- ($enum.spec /.enum r.int)
- ($interval.spec /.interval r.int)
- (~~ (template [<monoid>]
- [(<| (_.context (%.name (name-of <monoid>)))
- ($monoid.spec /.equivalence <monoid> r.int))]
+ (`` ($_ _.and
+ (_.with-cover [/.equivalence /.=]
+ ($equivalence.spec /.equivalence random.int))
+ (_.with-cover [/.order /.<]
+ ($order.spec /.order random.int))
+ (_.with-cover [/.enum]
+ ($enum.spec /.enum random.int))
+ (_.with-cover [/.interval]
+ ($interval.spec /.interval random.int))
+ (~~ (template [<compose> <monoid>]
+ [(_.with-cover [<monoid> <compose>]
+ ($monoid.spec /.equivalence <monoid> random.int))]
+
+ [/.+ /.addition]
+ [/.* /.multiplication]
+
+ [/.min /.minimum]
+ [/.max /.maximum]
+ ))
+ (~~ (template [<codec>]
+ [(_.with-cover [<codec>]
+ ($codec.spec /.equivalence <codec> random.int))]
- [/.addition] [/.multiplication] [/.minimum] [/.maximum]
- ))
- (~~ (template [<codec>]
- [(<| (_.context (%.name (name-of /.binary)))
- ($codec.spec /.equivalence <codec> r.int))]
+ [/.binary] [/.octal] [/.decimal] [/.hex]
+ ))
+ )))
+
+(def: predicate
+ Test
+ (do {! random.monad}
+ [sample random.int
+ shift (\ ! map /.abs random.int)]
+ ($_ _.and
+ (_.cover [/.negative?]
+ (bit\= (/.negative? sample)
+ (/.< +0 sample)))
+ (_.cover [/.positive?]
+ (bit\= (/.positive? sample)
+ (/.> +0 sample)))
+ (_.cover [/.zero?]
+ (bit\= (/.zero? sample)
+ (/.= +0 sample)))
+ (_.cover [/.even? /.odd?]
+ (bit\= (/.even? sample)
+ (not (/.odd? sample))))
+ )))
+
+(def: #export test
+ Test
+ (<| (_.covering /._)
+ (_.with-cover [.Int])
+ ($_ _.and
+ (do random.monad
+ [sample random.int]
+ ($_ _.and
+ (_.cover [/.-]
+ (and (/.= +0 (/.- sample sample))
+ (/.= sample (/.- +0 sample))
+ (/.= (/.negate sample)
+ (/.- sample +0))))
+ (_.cover [/./]
+ (and (/.= +1 (/./ sample sample))
+ (/.= sample (/./ +1 sample))))
+ (_.cover [/.abs]
+ (bit\= (/.> sample (/.abs sample))
+ (/.negative? sample)))
+ (_.cover [/.signum]
+ (/.= (/.abs sample)
+ (/.* (/.signum sample) sample)))
+ ))
+ (do random.monad
+ [left random.int
+ right random.int]
+ ($_ _.and
+ (_.cover [/.>]
+ (bit\= (/.> left right)
+ (/.< right left)))
+ (_.cover [/.<= /.>=]
+ (bit\= (/.<= left right)
+ (/.>= right left)))
+ ))
+ (do random.monad
+ [left (random.filter (|>> (/.= +0) not)
+ random.int)
+ right random.int]
+ ($_ _.and
+ (_.cover [/.%]
+ (let [rem (/.% left right)
+ div (|> right (/.- rem) (/./ left))]
+ (/.= right
+ (|> div (/.* left) (/.+ rem)))))
+ (_.cover [/./%]
+ (let [[div rem] (/./% left right)]
+ (and (/.= div (/./ left right))
+ (/.= rem (/.% left right)))))
+ (_.cover [/.mod]
+ (and (/.= (/.signum left)
+ (/.signum (/.mod left right)))
+ (/.= (/.signum right)
+ (/.signum (/.% left right)))
+ (if (/.= (/.signum left) (/.signum right))
+ (/.= (/.% left right)
+ (/.mod left right))
+ (or (and (/.= +0 (/.% left right))
+ (/.= +0 (/.mod left right)))
+ (/.= (/.+ left (/.% left right))
+ (/.mod left right))))))
+ ))
+ (do {! random.monad}
+ [#let [random (\ ! map (/.% +1,000) random.int)]
+ left random
+ right random]
+ ($_ _.and
+ (_.cover [/.gcd]
+ (let [gcd (/.gcd left right)]
+ (and (/.= +0 (/.% gcd left))
+ (/.= +0 (/.% gcd right)))))
+ (_.cover [/.lcm]
+ (let [lcm (/.lcm left right)]
+ (and (/.= +0 (/.% left lcm))
+ (/.= +0 (/.% right lcm)))))
+ ))
+ (do random.monad
+ [expected random.int]
+ (_.cover [/.negate]
+ (let [subtraction!
+ (/.= +0 (/.+ (/.negate expected) expected))
- [/.binary] [/.octal] [/.decimal] [/.hex]
- ))
+ inverse!
+ (|> expected /.negate /.negate (/.= expected))]
+ (and subtraction!
+ inverse!))))
+ (do {! random.monad}
+ [expected (\ ! map (/.% +1,000,000) random.int)]
+ (_.cover [/.frac]
+ (|> expected /.frac f.int (/.= expected))))
+ (do random.monad
+ [sample random.int]
+ (_.cover [/.hash]
+ (i64\= (i64\hash sample)
+ (\ /.hash hash sample))))
- (_.test "Alternate notations."
- (and (/.= (bin "+11001001")
- (bin "+11,00,10,01"))
- (/.= (oct "-615243")
- (oct "-615,243"))
- (/.= (hex "+deadBEEF")
- (hex "+dead,BEEF"))))
- ))))
+ ..predicate
+ ..signature
+ )))