Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ pool:
vmImage: 'windows-latest'

variables:
major: 0
minor: 9
major: 1
minor: 1
revision: 0
solution: '**/*.sln'
buildPlatform: 'Any CPU'
Expand Down
58 changes: 57 additions & 1 deletion src/WldMr.Excel.Core/ArrayFunction.fs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ module ArrayFunction =

member internal uaa.evalCached f subEval i j =
result {
let! fp = subEval (f) i j
let! fp = subEval f i j
let! v = uaa.cachedConversion i j
return fp v
}
Expand Down Expand Up @@ -256,6 +256,62 @@ module ArrayFunction =
member uaa.EvalArrayIndexedFunction f = uaa.returnArray2dFromArrays (uaa.Eval f) false
member uaa.EvalArrayIndexedFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval f) true

member uaa.Add(name: string, c: xlObj -> _, value: xlObj[,]) =
ArrayFunctionDefinition<_, _, _, _, _, _, _, _, _, _>(name, value, uaa, c)

and ArrayFunctionDefinition<'T1, 'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10>(name: string, value: xlObj[,], rest: ArrayFunctionDefinition<'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10>, conversion: xlObj -> Result<'T1, string> ) =
inherit UdfArrayArgWithValue<'T1>(name, value, rest :> UdfArrayArgBase |> Some, conversion)

member internal uaa.Eval f i j = uaa.evalCached f rest.Eval i j
member uaa.EvalFunction f = uaa.returnArray2d (uaa.Eval (fun _ _ -> f))
member uaa.EvalArrayFunction f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) false
member uaa.EvalArrayFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) true
member uaa.EvalIndexedFunction f = uaa.returnArray2d (uaa.Eval f)
member uaa.EvalArrayIndexedFunction f = uaa.returnArray2dFromArrays (uaa.Eval f) false
member uaa.EvalArrayIndexedFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval f) true

member uaa.Add(name: string, c: xlObj -> _, value: xlObj[,]) =
ArrayFunctionDefinition<_, _, _, _, _, _, _, _, _, _, _>(name, value, uaa, c)

and ArrayFunctionDefinition<'T1, 'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10, 'T11>(name: string, value: xlObj[,], rest: ArrayFunctionDefinition<'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10, 'T11>, conversion: xlObj -> Result<'T1, string> ) =
inherit UdfArrayArgWithValue<'T1>(name, value, rest :> UdfArrayArgBase |> Some, conversion)

member internal uaa.Eval f i j = uaa.evalCached f rest.Eval i j
member uaa.EvalFunction f = uaa.returnArray2d (uaa.Eval (fun _ _ -> f))
member uaa.EvalArrayFunction f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) false
member uaa.EvalArrayFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) true
member uaa.EvalIndexedFunction f = uaa.returnArray2d (uaa.Eval f)
member uaa.EvalArrayIndexedFunction f = uaa.returnArray2dFromArrays (uaa.Eval f) false
member uaa.EvalArrayIndexedFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval f) true

member uaa.Add(name: string, c: xlObj -> _, value: xlObj[,]) =
ArrayFunctionDefinition<_, _, _, _, _, _, _, _, _, _, _, _>(name, value, uaa, c)

and ArrayFunctionDefinition<'T1, 'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10, 'T11, 'T12>(name: string, value: xlObj[,], rest: ArrayFunctionDefinition<'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10, 'T11, 'T12>, conversion: xlObj -> Result<'T1, string> ) =
inherit UdfArrayArgWithValue<'T1>(name, value, rest :> UdfArrayArgBase |> Some, conversion)

member internal uaa.Eval f i j = uaa.evalCached f rest.Eval i j
member uaa.EvalFunction f = uaa.returnArray2d (uaa.Eval (fun _ _ -> f))
member uaa.EvalArrayFunction f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) false
member uaa.EvalArrayFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) true
member uaa.EvalIndexedFunction f = uaa.returnArray2d (uaa.Eval f)
member uaa.EvalArrayIndexedFunction f = uaa.returnArray2dFromArrays (uaa.Eval f) false
member uaa.EvalArrayIndexedFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval f) true

member uaa.Add(name: string, c: xlObj -> _, value: xlObj[,]) =
ArrayFunctionDefinition<_, _, _, _, _, _, _, _, _, _, _, _, _>(name, value, uaa, c)

and ArrayFunctionDefinition<'T1, 'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10, 'T11, 'T12, 'T13>(name: string, value: xlObj[,], rest: ArrayFunctionDefinition<'T2, 'T3, 'T4, 'T5, 'T6, 'T7, 'T8, 'T9, 'T10, 'T11, 'T12, 'T13>, conversion: xlObj -> Result<'T1, string> ) =
inherit UdfArrayArgWithValue<'T1>(name, value, rest :> UdfArrayArgBase |> Some, conversion)

member internal uaa.Eval f i j = uaa.evalCached f rest.Eval i j
member uaa.EvalFunction f = uaa.returnArray2d (uaa.Eval (fun _ _ -> f))
member uaa.EvalArrayFunction f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) false
member uaa.EvalArrayFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval (fun _ _ -> f)) true
member uaa.EvalIndexedFunction f = uaa.returnArray2d (uaa.Eval f)
member uaa.EvalArrayIndexedFunction f = uaa.returnArray2dFromArrays (uaa.Eval f) false
member uaa.EvalArrayIndexedFunctionHorizontal f = uaa.returnArray2dFromArrays (uaa.Eval f) true

type ArrayFunctionBuilder() =
static member Add(name: string, c: xlObj -> _, value: xlObj[,]) =
ArrayFunction.ArrayFunctionDefinition<_>(name, value, None, c)
12 changes: 9 additions & 3 deletions src/WldMr.Excel.Functions/xlFormat.fs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ let xlFormatA
o1: xlObj[,], t1: xlObj[,],
o2: xlObj[,], t2: xlObj[,],
o3: xlObj[,], t3: xlObj[,],
o4: xlObj[,], t4: xlObj[,]
o4: xlObj[,], t4: xlObj[,],
o5: xlObj[,], t5: xlObj[,],
o6: xlObj[,], t6: xlObj[,]
): xlObj[,] =
let convertXlObj (o: xlObj) (t: xlObj) =
match o, t with
Expand Down Expand Up @@ -51,11 +53,13 @@ let xlFormatA
(o2: xlObj) (t2: xlObj)
(o3: xlObj) (t3: xlObj)
(o4: xlObj) (t4: xlObj)
(o5: xlObj) (t5: xlObj)
(o6: xlObj) (t6: xlObj)
=
result {
let! args =
([ o1; o2; o3; o4],
[ t1; t2; t3; t4])
([ o1; o2; o3; o4; o5; o6],
[ t1; t2; t3; t4; t5; t6])
||> List.map2 convertXlObj
|> List.sequenceResultM

Expand All @@ -68,5 +72,7 @@ let xlFormatA
.Add("o2", Ok, o2).Add("t2", Ok, t2)
.Add("o3", Ok, o3).Add("t3", Ok, t3)
.Add("o4", Ok, o4).Add("t4", Ok, t4)
.Add("o5", Ok, o5).Add("t5", Ok, t5)
.Add("o6", Ok, o6).Add("t6", Ok, t6)
.EvalFunction scalarF
|> FunctionCall.eval
47 changes: 45 additions & 2 deletions src/WldMr.Excel.Functions/xlString.fs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ let regexFilter regex ignoreCase input: Result<xlObj[,], string> =
"This function also operates on arrays\r\n" +
"Returns FALSE for any non text input\r\n"
)>]
let xlStringStartsWith
let xlStartsWith
(
[<ExcelArgument(Description="The text string value (or range of values) which start is being queried")>]
input: xlObj[,],
Expand All @@ -62,6 +62,27 @@ let xlStringStartsWith
} |> XlObjRange.ofResult


[<ExcelFunction(Category= "WldMr Text",
IsThreadSafe=true,
IsHidden=true,
Description=
"Returns TRUE if the text string starts with the specified prefix\r\n" +
"This function also operates on arrays\r\n" +
"Returns FALSE for any non text input\r\n"
)>]
let xlStringStartsWith (
[<ExcelArgument(Description="The text string value (or range of values) which start is being queried")>]
input: xlObj[,],
[<ExcelArgument(Description="The text string value to be searched for at the start of the input")>]
prefix: string,
[<ExcelArgument(Description="If TRUE or omitted, a and A are considered equal, if FALSE, a and A are different")>]
ignoreCase: xlObj,
[<ExcelArgument(Description="If TRUE, 'prefix' is a regular expression, if FALSE or omitted, 'prefix' is a literal")>]
useRegex: xlObj
) =
xlStartsWith(input, prefix, ignoreCase, useRegex)


[<ExcelFunction(
Category= "WldMr Text",
IsThreadSafe=true,
Expand All @@ -70,7 +91,7 @@ let xlStringStartsWith
"This function also operates on arrays\r\n" +
"Returns FALSE for any non text input\r\n"
)>]
let xlStringEndsWith
let xlEndsWith
(
[<ExcelArgument(Description="The text string value (or range of values) which end is being queried")>]
input: xlObj[,],
Expand All @@ -93,6 +114,28 @@ let xlStringEndsWith
|> stringFilter (fun s -> s.EndsWith(suffix, ic, System.Globalization.CultureInfo.InvariantCulture))
} |> XlObjRange.ofResult

[<ExcelFunction(
Category= "WldMr Text",
IsThreadSafe=true,
IsHidden=true,
Description=
"Returns TRUE if the text string ends with the specified suffix\r\n" +
"This function also operates on arrays\r\n" +
"Returns FALSE for any non text input\r\n"
)>]
let xlStringEndsWith
(
[<ExcelArgument(Description="The text string value (or range of values) which end is being queried")>]
input: xlObj[,],
[<ExcelArgument(Description="The text string value to be searched for at the end of the input")>]
suffix: string,
[<ExcelArgument(Description="If TRUE or omitted, a and A are considered equal, if FALSE, a and A are different")>]
ignoreCase: xlObj,
[<ExcelArgument(Description="If TRUE, 'suffix' is a regular expression, if FALSE or omitted, 'suffix' is a literal")>]
useRegex: xlObj
) =
xlEndsWith(input, suffix, ignoreCase, useRegex)


[<ExcelFunction(Category= "WldMr Text",
IsThreadSafe=true,
Expand Down