feat: add a few more simple functions to Danger namespace

This commit is contained in:
NunoSempere 2022-09-04 17:12:18 +02:00
parent 3106a10b90
commit 803231d620
2 changed files with 56 additions and 2 deletions

View File

@ -4,6 +4,22 @@ open FunctionRegistry_Helpers
let nameSpace = "Danger" let nameSpace = "Danger"
let requiresNamespace = true let requiresNamespace = true
module NumberToNumber = {
let make = (name, fn) =>
FnDefinition.make(
~name,
~inputs=[FRTypeNumber],
~run=(_, inputs, _, _) => {
inputs
->getOrError(0)
->E.R.bind(Prepare.oneNumber)
->E.R2.fmap(fn)
->E.R2.fmap(Wrappers.evNumber)
},
(),
)
}
module TwoNumbersToNumber = { module TwoNumbersToNumber = {
let make = (name, fn) => let make = (name, fn) =>
FnDefinition.make( FnDefinition.make(
@ -28,18 +44,52 @@ module ThreeNumbersToNumber = {
) )
} }
module Internals = {
let factorial = Stdlib.Math.factorial
let choose = ((n, k)) => factorial(n) /. (factorial(n -. k) *. factorial(k))
let pow = (base, exp) => Js.Math.pow_float(~base, ~exp)
let binomial = ((n, k, p)) => choose((n, k)) *. pow(p, k) *. pow(1.0 -. p, n -. k)
}
let library = [ let library = [
Function.make( Function.make(
~name="laplace", ~name="laplace",
~nameSpace, ~nameSpace,
~requiresNamespace, ~requiresNamespace,
~output=EvtNumber, ~output=EvtNumber,
~examples=[`laplace(1, 20)`], ~examples=[`Danger.laplace(1, 20)`],
~definitions=[ ~definitions=[
TwoNumbersToNumber.make("laplace", ((successes, trials)) => TwoNumbersToNumber.make("laplace", ((successes, trials)) =>
(successes +. 1.0) /. (trials +. 1.0) (successes +. 1.0) /. (trials +. 2.0)
), ),
], ],
(), (),
), ),
Function.make(
~name="factorial",
~nameSpace,
~requiresNamespace,
~output=EvtNumber,
~examples=[`Danger.factorial(20)`],
~definitions=[NumberToNumber.make("factorial", Internals.factorial)],
(),
),
Function.make(
~name="choose",
~nameSpace,
~requiresNamespace,
~output=EvtNumber,
~examples=[`Danger.choose(1, 20)`],
~definitions=[TwoNumbersToNumber.make("choose", Internals.choose)],
(),
),
Function.make(
~name="binomial",
~nameSpace,
~requiresNamespace,
~output=EvtNumber,
~examples=[`Danger.binomial(1, 20, 0.5)`],
~definitions=[ThreeNumbersToNumber.make("binomial", Internals.binomial)],
(),
),
] ]

View File

@ -47,3 +47,7 @@ module Random = {
@module external sample: (array<float>, sampleArgs) => array<float> = "@stdlib/random/sample" @module external sample: (array<float>, sampleArgs) => array<float> = "@stdlib/random/sample"
let sample = sample let sample = sample
} }
module Math = {
@module external factorial: float => float = "@stdlib/math/base/special/factorial"
}