Simple additions of first, last, cumulative sum, diff
This commit is contained in:
		
							parent
							
								
									12cdb4ed36
								
							
						
					
					
						commit
						fc40744053
					
				| 
						 | 
					@ -236,7 +236,16 @@ module OneArgDist = {
 | 
				
			||||||
module ArrayNumberDist = {
 | 
					module ArrayNumberDist = {
 | 
				
			||||||
  let make = (name, fn) => {
 | 
					  let make = (name, fn) => {
 | 
				
			||||||
    FnDefinition.make(~name, ~inputs=[FRTypeArray(FRTypeNumber)], ~run=(inputs, _) =>
 | 
					    FnDefinition.make(~name, ~inputs=[FRTypeArray(FRTypeNumber)], ~run=(inputs, _) =>
 | 
				
			||||||
      Prepare.ToTypedArray.numbers(inputs)->E.R2.fmap(fn)
 | 
					      Prepare.ToTypedArray.numbers(inputs)
 | 
				
			||||||
 | 
					      ->E.R.bind(r => E.A.length(r) === 0 ? Error("List is empty") : Ok(r))
 | 
				
			||||||
 | 
					      ->E.R.bind(fn)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  let make2 = (name, fn) => {
 | 
				
			||||||
 | 
					    FnDefinition.make(~name, ~inputs=[FRTypeArray(FRTypeAny)], ~run=(inputs, _) =>
 | 
				
			||||||
 | 
					      Prepare.ToTypedArray.numbers(inputs)
 | 
				
			||||||
 | 
					      ->E.R.bind(r => E.A.length(r) === 0 ? Error("List is empty") : Ok(r))
 | 
				
			||||||
 | 
					      ->E.R.bind(fn)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,41 +147,63 @@ let registry = [
 | 
				
			||||||
  Function.make(~name="Round", ~definitions=[NumberToNumber.make("round", Js.Math.round)]),
 | 
					  Function.make(~name="Round", ~definitions=[NumberToNumber.make("round", Js.Math.round)]),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Sum",
 | 
					    ~name="Sum",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("sum", r => r->E.A.Floats.sum->Wrappers.evNumber)],
 | 
					    ~definitions=[ArrayNumberDist.make("sum", r => r->E.A.Floats.sum->Wrappers.evNumber->Ok)],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Product",
 | 
					    ~name="Product",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("product", r => r->E.A.Floats.product->Wrappers.evNumber)],
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make("product", r => r->E.A.Floats.product->Wrappers.evNumber->Ok),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Min",
 | 
					    ~name="Min",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("min", r => r->E.A.Floats.min->Wrappers.evNumber)],
 | 
					    ~definitions=[ArrayNumberDist.make("min", r => r->E.A.Floats.min->Wrappers.evNumber->Ok)],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Max",
 | 
					    ~name="Max",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("max", r => r->E.A.Floats.max->Wrappers.evNumber)],
 | 
					    ~definitions=[ArrayNumberDist.make("max", r => r->E.A.Floats.max->Wrappers.evNumber->Ok)],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Mean",
 | 
					    ~name="Mean",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("mean", r => r->E.A.Floats.mean->Wrappers.evNumber)],
 | 
					    ~definitions=[ArrayNumberDist.make("mean", r => r->E.A.Floats.mean->Wrappers.evNumber->Ok)],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Geometric Mean",
 | 
					    ~name="Geometric Mean",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("geomean", r => r->E.A.Floats.geomean->Wrappers.evNumber)],
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make("geomean", r => r->E.A.Floats.geomean->Wrappers.evNumber->Ok),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Standard Deviation",
 | 
					    ~name="Standard Deviation",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("stdev", r => r->E.A.Floats.stdev->Wrappers.evNumber)],
 | 
					    ~definitions=[ArrayNumberDist.make("stdev", r => r->E.A.Floats.stdev->Wrappers.evNumber->Ok)],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Variance",
 | 
					    ~name="Variance",
 | 
				
			||||||
    ~definitions=[ArrayNumberDist.make("variance", r => r->E.A.Floats.stdev->Wrappers.evNumber)],
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make("variance", r => r->E.A.Floats.stdev->Wrappers.evNumber->Ok),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  Function.make(
 | 
				
			||||||
 | 
					    ~name="First",
 | 
				
			||||||
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make2("first", r =>
 | 
				
			||||||
 | 
					        r->E.A.first |> E.O.toResult(impossibleError) |> E.R.fmap(Wrappers.evNumber)
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  Function.make(
 | 
				
			||||||
 | 
					    ~name="Last",
 | 
				
			||||||
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make2("last", r =>
 | 
				
			||||||
 | 
					        r->E.A.last |> E.O.toResult(impossibleError) |> E.R.fmap(Wrappers.evNumber)
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  Function.make(
 | 
					  Function.make(
 | 
				
			||||||
    ~name="Sort",
 | 
					    ~name="Sort",
 | 
				
			||||||
    ~definitions=[
 | 
					    ~definitions=[
 | 
				
			||||||
      ArrayNumberDist.make("sort", r =>
 | 
					      ArrayNumberDist.make("sort", r =>
 | 
				
			||||||
        r->E.A.Floats.sort->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray
 | 
					        r->E.A.Floats.sort->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
| 
						 | 
					@ -189,7 +211,23 @@ let registry = [
 | 
				
			||||||
    ~name="Reverse",
 | 
					    ~name="Reverse",
 | 
				
			||||||
    ~definitions=[
 | 
					    ~definitions=[
 | 
				
			||||||
      ArrayNumberDist.make("reverse", r =>
 | 
					      ArrayNumberDist.make("reverse", r =>
 | 
				
			||||||
        r->Belt_Array.reverse->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray
 | 
					        r->Belt_Array.reverse->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  Function.make(
 | 
				
			||||||
 | 
					    ~name="Cumulative Sum",
 | 
				
			||||||
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make("cumsum", r =>
 | 
				
			||||||
 | 
					        r->E.A.Floats.cumsum->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					  ),
 | 
				
			||||||
 | 
					  Function.make(
 | 
				
			||||||
 | 
					    ~name="Diff",
 | 
				
			||||||
 | 
					    ~definitions=[
 | 
				
			||||||
 | 
					      ArrayNumberDist.make("diff", r =>
 | 
				
			||||||
 | 
					        r->E.A.Floats.diff->E.A2.fmap(Wrappers.evNumber)->Wrappers.evArray->Ok
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
| 
						 | 
					@ -296,7 +334,8 @@ let registry = [
 | 
				
			||||||
          ->E.A.R.firstErrorOrOpen
 | 
					          ->E.A.R.firstErrorOrOpen
 | 
				
			||||||
          ->E.R2.fmap(Js.Dict.fromArray)
 | 
					          ->E.R2.fmap(Js.Dict.fromArray)
 | 
				
			||||||
          ->E.R2.fmap(Wrappers.evRecord)
 | 
					          ->E.R2.fmap(Wrappers.evRecord)
 | 
				
			||||||
        inputs->E.A.unsafe_get(0)->Prepare.ToValueArray.Array.arrayOfArrays |> E.R2.bind(convertInternalItems)
 | 
					        inputs->E.A.unsafe_get(0)->Prepare.ToValueArray.Array.arrayOfArrays
 | 
				
			||||||
 | 
					          |> E.R2.bind(convertInternalItems)
 | 
				
			||||||
      }),
 | 
					      }),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -751,6 +751,9 @@ module A = {
 | 
				
			||||||
    let diff = (t: t): array<float> =>
 | 
					    let diff = (t: t): array<float> =>
 | 
				
			||||||
      Belt.Array.zipBy(t, Belt.Array.sliceToEnd(t, 1), (left, right) => right -. left)
 | 
					      Belt.Array.zipBy(t, Belt.Array.sliceToEnd(t, 1), (left, right) => right -. left)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let cumsum = (t: t): array<float> => accumulate((a, b) => a +. b, t)
 | 
				
			||||||
 | 
					    let cumProd = (t: t): array<float> => accumulate((a, b) => a *. b, t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    exception RangeError(string)
 | 
					    exception RangeError(string)
 | 
				
			||||||
    let range = (min: float, max: float, n: int): array<float> =>
 | 
					    let range = (min: float, max: float, n: int): array<float> =>
 | 
				
			||||||
      switch n {
 | 
					      switch n {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user