Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c4eeb99aba | |||
| bd5022c8bc | |||
| db84b1c398 | |||
| f8f8410259 | |||
| 956adf0b93 | |||
| 0f2a33bcdd | |||
| b8f84846bb | |||
| adf6264061 | |||
| 08f19f17a2 | |||
| 8a4e882dc1 | |||
| fb7942a965 | |||
| e54454b099 | |||
| dac98ab38c | |||
| 1e8149aa6f | |||
| 8f12c29a78 | |||
| e3d09e6ebd | |||
| f33f4f0790 | |||
| fcf2044dd9 | |||
| 05d8cb9c02 | |||
| 13de2f90ff | |||
| 22fe810f63 | |||
| abdf6cf3b8 | |||
| f2ba243df0 | |||
| bb2851332a | |||
| 00225f3a06 | |||
| 7cb0bd077f | |||
| 0ba2aa310e | |||
| 1916668c6e | |||
| 919800da42 | |||
| 947580a2ec | |||
| 688b9a22b6 | |||
| 76ce0fc54f |
+185
-67
@@ -1,8 +1,32 @@
|
||||
# This file is machine-generated - editing it directly is not advised
|
||||
|
||||
julia_version = "1.12.5"
|
||||
julia_version = "1.12.6"
|
||||
manifest_format = "2.0"
|
||||
project_hash = "d50b7edf21ea6bb3104189be326e8a78a00fd426"
|
||||
project_hash = "c825feef41198c770952e1181ec41e9f2aa0c3c0"
|
||||
|
||||
[[deps.Accessors]]
|
||||
deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"]
|
||||
git-tree-sha1 = "7063ad1083578215c7c4bf410368150abe8d5524"
|
||||
uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
|
||||
version = "0.1.45"
|
||||
|
||||
[deps.Accessors.extensions]
|
||||
AxisKeysExt = "AxisKeys"
|
||||
IntervalSetsExt = "IntervalSets"
|
||||
LinearAlgebraExt = "LinearAlgebra"
|
||||
StaticArraysExt = "StaticArrays"
|
||||
StructArraysExt = "StructArrays"
|
||||
TestExt = "Test"
|
||||
UnitfulExt = "Unitful"
|
||||
|
||||
[deps.Accessors.weakdeps]
|
||||
AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
|
||||
IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
|
||||
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
|
||||
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
||||
StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
|
||||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
|
||||
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
|
||||
|
||||
[[deps.AliasTables]]
|
||||
deps = ["PtrArrays", "Random"]
|
||||
@@ -23,6 +47,10 @@ git-tree-sha1 = "6863c5b7fc997eadcabdbaf6c5f201dc30032643"
|
||||
uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
|
||||
version = "1.2.2"
|
||||
|
||||
[[deps.CRC32c]]
|
||||
uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc"
|
||||
version = "1.11.0"
|
||||
|
||||
[[deps.CSV]]
|
||||
deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"]
|
||||
git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d"
|
||||
@@ -30,10 +58,10 @@ uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
|
||||
version = "0.10.16"
|
||||
|
||||
[[deps.CodeTracking]]
|
||||
deps = ["InteractiveUtils", "UUIDs"]
|
||||
git-tree-sha1 = "b7231a755812695b8046e8471ddc34c8268cbad5"
|
||||
deps = ["InteractiveUtils", "REPL", "UUIDs"]
|
||||
git-tree-sha1 = "cfb7a2e89e245a9d5016b70323db412b3a7438d5"
|
||||
uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2"
|
||||
version = "3.0.0"
|
||||
version = "3.0.2"
|
||||
|
||||
[[deps.CodecBase]]
|
||||
deps = ["TranscodingStreams"]
|
||||
@@ -47,6 +75,11 @@ git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9"
|
||||
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
|
||||
version = "0.7.8"
|
||||
|
||||
[[deps.CommonSolve]]
|
||||
git-tree-sha1 = "99ee296f88c12485402e37c2fd025f95ae097637"
|
||||
uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
|
||||
version = "0.2.9"
|
||||
|
||||
[[deps.Compat]]
|
||||
deps = ["TOML", "UUIDs"]
|
||||
git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad"
|
||||
@@ -67,6 +100,30 @@ deps = ["Artifacts", "Libdl"]
|
||||
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
|
||||
version = "1.3.0+1"
|
||||
|
||||
[[deps.CompositionsBase]]
|
||||
git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
|
||||
uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
|
||||
version = "0.1.2"
|
||||
weakdeps = ["InverseFunctions"]
|
||||
|
||||
[deps.CompositionsBase.extensions]
|
||||
CompositionsBaseInverseFunctionsExt = "InverseFunctions"
|
||||
|
||||
[[deps.ConstructionBase]]
|
||||
git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb"
|
||||
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
|
||||
version = "1.6.0"
|
||||
|
||||
[deps.ConstructionBase.extensions]
|
||||
ConstructionBaseIntervalSetsExt = "IntervalSets"
|
||||
ConstructionBaseLinearAlgebraExt = "LinearAlgebra"
|
||||
ConstructionBaseStaticArraysExt = "StaticArrays"
|
||||
|
||||
[deps.ConstructionBase.weakdeps]
|
||||
IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
|
||||
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
|
||||
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
|
||||
|
||||
[[deps.Crayons]]
|
||||
git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15"
|
||||
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
|
||||
@@ -79,15 +136,15 @@ version = "1.16.0"
|
||||
|
||||
[[deps.DataFrames]]
|
||||
deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
|
||||
git-tree-sha1 = "d8928e9169ff76c6281f39a659f9bca3a573f24c"
|
||||
git-tree-sha1 = "5fab31e2e01e70ad66e3e24c968c264d1cf166d6"
|
||||
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
||||
version = "1.8.1"
|
||||
version = "1.8.2"
|
||||
|
||||
[[deps.DataStructures]]
|
||||
deps = ["OrderedCollections"]
|
||||
git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6"
|
||||
git-tree-sha1 = "6fb53a69613a0b2b68a0d12671717d307ab8b24e"
|
||||
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
|
||||
version = "0.19.3"
|
||||
version = "0.19.5"
|
||||
|
||||
[[deps.DataValueInterfaces]]
|
||||
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
|
||||
@@ -100,19 +157,21 @@ uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
||||
version = "1.11.0"
|
||||
|
||||
[[deps.Distributions]]
|
||||
deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
|
||||
git-tree-sha1 = "fbcc7610f6d8348428f722ecbe0e6cfe22e672c6"
|
||||
deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
|
||||
git-tree-sha1 = "cd3c5ac74cd3923c8945c6a81518c46abd0e73a3"
|
||||
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
|
||||
version = "0.25.123"
|
||||
version = "0.25.129"
|
||||
|
||||
[deps.Distributions.extensions]
|
||||
DistributionsChainRulesCoreExt = "ChainRulesCore"
|
||||
DistributionsDensityInterfaceExt = "DensityInterface"
|
||||
DistributionsSparseConnectivityTracerExt = "SparseConnectivityTracer"
|
||||
DistributionsTestExt = "Test"
|
||||
|
||||
[deps.Distributions.weakdeps]
|
||||
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
|
||||
DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d"
|
||||
SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
|
||||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
|
||||
|
||||
[[deps.DocStringExtensions]]
|
||||
@@ -120,6 +179,11 @@ git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c"
|
||||
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
|
||||
version = "0.9.5"
|
||||
|
||||
[[deps.EnumX]]
|
||||
git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c"
|
||||
uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
|
||||
version = "1.0.7"
|
||||
|
||||
[[deps.FilePathsBase]]
|
||||
deps = ["Compat", "Dates"]
|
||||
git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2"
|
||||
@@ -162,10 +226,16 @@ uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"
|
||||
version = "1.11.0"
|
||||
|
||||
[[deps.GeneralUtils]]
|
||||
deps = ["CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "JSON", "NATS", "PrettyPrinting", "Random", "SHA", "UUIDs"]
|
||||
deps = ["CSV", "DataFrames", "DataStructures", "Dates", "Distributions", "HTTP", "JSON", "NATS", "PrettyPrinting", "Random", "Revise", "SHA", "UUIDs"]
|
||||
path = "."
|
||||
uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe"
|
||||
version = "0.3.1"
|
||||
version = "0.4.10"
|
||||
|
||||
[[deps.HTTP]]
|
||||
deps = ["Base64", "CodecZlib", "Dates", "EnumX", "PrecompileTools", "Random", "Reseau", "SHA", "URIs", "UUIDs", "Zlib_jll"]
|
||||
git-tree-sha1 = "69343dd8afb1671b84c3aa2dda511238d0919a55"
|
||||
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
|
||||
version = "2.5.0"
|
||||
|
||||
[[deps.HashArrayMappedTries]]
|
||||
git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae"
|
||||
@@ -196,6 +266,19 @@ deps = ["Markdown"]
|
||||
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
|
||||
version = "1.11.0"
|
||||
|
||||
[[deps.InverseFunctions]]
|
||||
git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
|
||||
uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
|
||||
version = "0.1.17"
|
||||
|
||||
[deps.InverseFunctions.extensions]
|
||||
InverseFunctionsDatesExt = "Dates"
|
||||
InverseFunctionsTestExt = "Test"
|
||||
|
||||
[deps.InverseFunctions.weakdeps]
|
||||
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
||||
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
|
||||
|
||||
[[deps.InvertedIndices]]
|
||||
git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe"
|
||||
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
|
||||
@@ -213,15 +296,15 @@ version = "1.0.0"
|
||||
|
||||
[[deps.JLLWrappers]]
|
||||
deps = ["Artifacts", "Preferences"]
|
||||
git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2"
|
||||
git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e"
|
||||
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
|
||||
version = "1.7.1"
|
||||
version = "1.8.0"
|
||||
|
||||
[[deps.JSON]]
|
||||
deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"]
|
||||
git-tree-sha1 = "b3ad4a0255688dcb895a52fafbaae3023b588a90"
|
||||
git-tree-sha1 = "c89d196f5ffb64bfbf80985b699ea913b0d2c211"
|
||||
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
||||
version = "1.4.0"
|
||||
version = "1.6.1"
|
||||
|
||||
[deps.JSON.extensions]
|
||||
JSONArrowExt = ["ArrowTypes"]
|
||||
@@ -243,9 +326,9 @@ version = "1.14.3"
|
||||
|
||||
[[deps.JuliaInterpreter]]
|
||||
deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"]
|
||||
git-tree-sha1 = "80580012d4ed5a3e8b18c7cd86cebe4b816d17a6"
|
||||
git-tree-sha1 = "58927c485919bf17ea308d9d82156de1adf4b006"
|
||||
uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
|
||||
version = "0.10.9"
|
||||
version = "0.10.12"
|
||||
|
||||
[[deps.JuliaSyntaxHighlighting]]
|
||||
deps = ["StyledStrings"]
|
||||
@@ -283,9 +366,9 @@ version = "1.12.0"
|
||||
|
||||
[[deps.LogExpFunctions]]
|
||||
deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
|
||||
git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f"
|
||||
git-tree-sha1 = "bba2d9aa057d8f126415de240573e86a8f39d2a1"
|
||||
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
|
||||
version = "0.3.29"
|
||||
version = "1.0.1"
|
||||
|
||||
[deps.LogExpFunctions.extensions]
|
||||
LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
|
||||
@@ -303,9 +386,14 @@ version = "1.11.0"
|
||||
|
||||
[[deps.LoweredCodeUtils]]
|
||||
deps = ["CodeTracking", "Compiler", "JuliaInterpreter"]
|
||||
git-tree-sha1 = "65ae3db6ab0e5b1b5f217043c558d9d1d33cc88d"
|
||||
git-tree-sha1 = "3733419e9a71156b389f3e331672d2e95436783f"
|
||||
uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b"
|
||||
version = "3.5.0"
|
||||
version = "3.6.2"
|
||||
|
||||
[[deps.MacroTools]]
|
||||
git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522"
|
||||
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
|
||||
version = "0.5.16"
|
||||
|
||||
[[deps.Markdown]]
|
||||
deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"]
|
||||
@@ -314,9 +402,9 @@ version = "1.11.0"
|
||||
|
||||
[[deps.MbedTLS]]
|
||||
deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
|
||||
git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf"
|
||||
git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92"
|
||||
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
|
||||
version = "1.1.9"
|
||||
version = "1.1.10"
|
||||
|
||||
[[deps.MbedTLS_jll]]
|
||||
deps = ["Artifacts", "JLLWrappers", "Libdl"]
|
||||
@@ -340,9 +428,9 @@ version = "2025.11.4"
|
||||
|
||||
[[deps.NATS]]
|
||||
deps = ["Base64", "BufferedStreams", "CodecBase", "Dates", "DocStringExtensions", "JSON3", "MbedTLS", "NanoDates", "Random", "ScopedValues", "Sockets", "Sodium", "StructTypes", "URIs"]
|
||||
git-tree-sha1 = "d9d9a189fb9155a460e6b5e8966bf6a66737abf8"
|
||||
git-tree-sha1 = "a1cdf34ba90ee5cd2658e487d3277ffafee712ce"
|
||||
uuid = "55e73f9c-eeeb-467f-b4cc-a633fde63d2a"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
|
||||
[[deps.NanoDates]]
|
||||
deps = ["Dates", "Parsers"]
|
||||
@@ -376,15 +464,15 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
|
||||
version = "0.5.6+0"
|
||||
|
||||
[[deps.OrderedCollections]]
|
||||
git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee"
|
||||
git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4"
|
||||
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
|
||||
version = "1.8.1"
|
||||
version = "1.8.2"
|
||||
|
||||
[[deps.PDMats]]
|
||||
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
|
||||
git-tree-sha1 = "e4cff168707d441cd6bf3ff7e4832bdf34278e4a"
|
||||
git-tree-sha1 = "26766d4b5f1a410c218a19b85a672c6edb693c65"
|
||||
uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
|
||||
version = "0.11.37"
|
||||
version = "0.11.40"
|
||||
weakdeps = ["StatsBase"]
|
||||
|
||||
[deps.PDMats.extensions]
|
||||
@@ -392,9 +480,9 @@ weakdeps = ["StatsBase"]
|
||||
|
||||
[[deps.Parsers]]
|
||||
deps = ["Dates", "PrecompileTools", "UUIDs"]
|
||||
git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810"
|
||||
git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9"
|
||||
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
|
||||
version = "2.8.3"
|
||||
version = "2.8.6"
|
||||
|
||||
[[deps.PooledArrays]]
|
||||
deps = ["DataAPI", "Future"]
|
||||
@@ -404,15 +492,15 @@ version = "1.4.3"
|
||||
|
||||
[[deps.PrecompileTools]]
|
||||
deps = ["Preferences"]
|
||||
git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77"
|
||||
git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c"
|
||||
uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
|
||||
version = "1.3.3"
|
||||
version = "1.3.4"
|
||||
|
||||
[[deps.Preferences]]
|
||||
deps = ["TOML"]
|
||||
git-tree-sha1 = "522f093a29b31a93e34eaea17ba055d850edea28"
|
||||
git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4"
|
||||
uuid = "21216c6a-2e73-6563-6e65-726566657250"
|
||||
version = "1.5.1"
|
||||
version = "1.5.2"
|
||||
|
||||
[[deps.PrettyPrinting]]
|
||||
git-tree-sha1 = "142ee93724a9c5d04d78df7006670a93ed1b244e"
|
||||
@@ -421,9 +509,9 @@ version = "0.4.2"
|
||||
|
||||
[[deps.PrettyTables]]
|
||||
deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"]
|
||||
git-tree-sha1 = "211530a7dc76ab59087f4d4d1fc3f086fbe87594"
|
||||
git-tree-sha1 = "624de6279ab7d94fc9f672f0068107eb6619732c"
|
||||
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
|
||||
version = "3.2.3"
|
||||
version = "3.3.2"
|
||||
|
||||
[deps.PrettyTables.extensions]
|
||||
PrettyTablesTypstryExt = "Typstry"
|
||||
@@ -437,15 +525,15 @@ uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
|
||||
version = "1.11.0"
|
||||
|
||||
[[deps.PtrArrays]]
|
||||
git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d"
|
||||
git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe"
|
||||
uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
|
||||
version = "1.3.0"
|
||||
version = "1.4.0"
|
||||
|
||||
[[deps.QuadGK]]
|
||||
deps = ["DataStructures", "LinearAlgebra"]
|
||||
git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284"
|
||||
git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e"
|
||||
uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
|
||||
version = "2.11.2"
|
||||
version = "2.11.3"
|
||||
|
||||
[deps.QuadGK.extensions]
|
||||
QuadGKEnzymeExt = "Enzyme"
|
||||
@@ -468,11 +556,17 @@ git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
|
||||
uuid = "189a3867-3050-52da-a836-e630ba90ab69"
|
||||
version = "1.2.2"
|
||||
|
||||
[[deps.Reseau]]
|
||||
deps = ["NetworkOptions", "OpenSSL_jll", "PrecompileTools", "Random", "SHA"]
|
||||
git-tree-sha1 = "0eab6d95ed40c2ef3992255c1c71e4f9748932b5"
|
||||
uuid = "802f3686-a58f-41ce-bb0c-3c43c75bba36"
|
||||
version = "1.3.1"
|
||||
|
||||
[[deps.Revise]]
|
||||
deps = ["CodeTracking", "FileWatching", "InteractiveUtils", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Preferences", "REPL", "UUIDs"]
|
||||
git-tree-sha1 = "14d1bfb0a30317edc77e11094607ace3c800f193"
|
||||
deps = ["CRC32c", "CodeTracking", "FileWatching", "InteractiveUtils", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Preferences", "REPL", "UUIDs"]
|
||||
git-tree-sha1 = "27e3ee13fc8739a59b380d6163d6a82f52c03bd7"
|
||||
uuid = "295af30f-e4ad-537b-8983-00126c2a3abe"
|
||||
version = "3.13.2"
|
||||
version = "3.15.1"
|
||||
|
||||
[deps.Revise.extensions]
|
||||
DistributedExt = "Distributed"
|
||||
@@ -492,21 +586,43 @@ git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8"
|
||||
uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
|
||||
version = "0.5.1+0"
|
||||
|
||||
[[deps.Roots]]
|
||||
deps = ["Accessors", "CommonSolve", "Printf"]
|
||||
git-tree-sha1 = "91cfb1cb4f6e27557cc2df798a31eff6089a41eb"
|
||||
uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
|
||||
version = "3.0.0"
|
||||
|
||||
[deps.Roots.extensions]
|
||||
RootsChainRulesCoreExt = "ChainRulesCore"
|
||||
RootsForwardDiffExt = "ForwardDiff"
|
||||
RootsIntervalRootFindingExt = "IntervalRootFinding"
|
||||
RootsSymPyExt = "SymPy"
|
||||
RootsSymPyPythonCallExt = "SymPyPythonCall"
|
||||
RootsUnitfulExt = "Unitful"
|
||||
|
||||
[deps.Roots.weakdeps]
|
||||
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
|
||||
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
|
||||
IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807"
|
||||
SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6"
|
||||
SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c"
|
||||
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
|
||||
|
||||
[[deps.SHA]]
|
||||
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
|
||||
version = "0.7.0"
|
||||
|
||||
[[deps.ScopedValues]]
|
||||
deps = ["HashArrayMappedTries", "Logging"]
|
||||
git-tree-sha1 = "c3b2323466378a2ba15bea4b2f73b081e022f473"
|
||||
git-tree-sha1 = "67a144433c4ce877ee6d1ada69a124d6b1ecf7be"
|
||||
uuid = "7e506255-f358-4e82-b7e4-beb19740aa63"
|
||||
version = "1.5.0"
|
||||
version = "1.6.2"
|
||||
|
||||
[[deps.SentinelArrays]]
|
||||
deps = ["Dates", "Random"]
|
||||
git-tree-sha1 = "ebe7e59b37c400f694f52b58c93d26201387da70"
|
||||
git-tree-sha1 = "084c47c7c5ce5cfecefa0a98dff69eb3646b5a80"
|
||||
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
|
||||
version = "1.4.9"
|
||||
version = "1.4.10"
|
||||
|
||||
[[deps.Serialization]]
|
||||
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
|
||||
@@ -524,9 +640,9 @@ version = "1.1.2"
|
||||
|
||||
[[deps.SortingAlgorithms]]
|
||||
deps = ["DataStructures"]
|
||||
git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9"
|
||||
git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a"
|
||||
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
|
||||
version = "1.2.2"
|
||||
version = "1.2.3"
|
||||
|
||||
[[deps.SparseArrays]]
|
||||
deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
|
||||
@@ -535,9 +651,9 @@ version = "1.12.0"
|
||||
|
||||
[[deps.SpecialFunctions]]
|
||||
deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
|
||||
git-tree-sha1 = "5acc6a41b3082920f79ca3c759acbcecf18a8d78"
|
||||
git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f"
|
||||
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
|
||||
version = "2.7.1"
|
||||
version = "2.8.0"
|
||||
|
||||
[deps.SpecialFunctions.extensions]
|
||||
SpecialFunctionsChainRulesCoreExt = "ChainRulesCore"
|
||||
@@ -563,15 +679,15 @@ version = "1.8.0"
|
||||
|
||||
[[deps.StatsBase]]
|
||||
deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
|
||||
git-tree-sha1 = "aceda6f4e598d331548e04cc6b2124a6148138e3"
|
||||
git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee"
|
||||
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
|
||||
version = "0.34.10"
|
||||
version = "0.34.12"
|
||||
|
||||
[[deps.StatsFuns]]
|
||||
deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
|
||||
git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685"
|
||||
git-tree-sha1 = "770240df9a3b8888065046948f7a09b4e0f997d5"
|
||||
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
|
||||
version = "1.5.2"
|
||||
version = "2.2.0"
|
||||
|
||||
[deps.StatsFuns.extensions]
|
||||
StatsFunsChainRulesCoreExt = "ChainRulesCore"
|
||||
@@ -583,9 +699,9 @@ version = "1.5.2"
|
||||
|
||||
[[deps.StringManipulation]]
|
||||
deps = ["PrecompileTools"]
|
||||
git-tree-sha1 = "a3c1536470bf8c5e02096ad4853606d7c8f62721"
|
||||
git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5"
|
||||
uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e"
|
||||
version = "0.4.2"
|
||||
version = "0.4.4"
|
||||
|
||||
[[deps.StructTypes]]
|
||||
deps = ["Dates", "UUIDs"]
|
||||
@@ -595,16 +711,18 @@ version = "1.11.0"
|
||||
|
||||
[[deps.StructUtils]]
|
||||
deps = ["Dates", "UUIDs"]
|
||||
git-tree-sha1 = "28145feabf717c5d65c1d5e09747ee7b1ff3ed13"
|
||||
git-tree-sha1 = "82bee338d650aa515f31866c460cb7e3bcef90b8"
|
||||
uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42"
|
||||
version = "2.6.3"
|
||||
version = "2.8.2"
|
||||
|
||||
[deps.StructUtils.extensions]
|
||||
StructUtilsMeasurementsExt = ["Measurements"]
|
||||
StructUtilsStaticArraysCoreExt = ["StaticArraysCore"]
|
||||
StructUtilsTablesExt = ["Tables"]
|
||||
|
||||
[deps.StructUtils.weakdeps]
|
||||
Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
|
||||
StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
|
||||
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
|
||||
|
||||
[[deps.StyledStrings]]
|
||||
@@ -633,9 +751,9 @@ version = "1.0.1"
|
||||
|
||||
[[deps.Tables]]
|
||||
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"]
|
||||
git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344"
|
||||
git-tree-sha1 = "0f38a06c83f0007bbab3cf911262841c9a0f07e0"
|
||||
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
|
||||
[[deps.TranscodingStreams]]
|
||||
git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
|
||||
@@ -658,9 +776,9 @@ version = "1.11.0"
|
||||
|
||||
[[deps.WeakRefStrings]]
|
||||
deps = ["DataAPI", "InlineStrings", "Parsers"]
|
||||
git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23"
|
||||
git-tree-sha1 = "0716e01c3b40413de5dedbc9c5c69f27cddfddfc"
|
||||
uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
|
||||
version = "1.4.2"
|
||||
version = "1.4.3"
|
||||
|
||||
[[deps.WorkerUtilities]]
|
||||
git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7"
|
||||
|
||||
+4
-2
@@ -1,6 +1,6 @@
|
||||
name = "GeneralUtils"
|
||||
uuid = "c6c72f09-b708-4ac8-ac7c-2084d70108fe"
|
||||
version = "0.3.2"
|
||||
version = "0.4.10"
|
||||
authors = ["tonaerospace <tonaerospace.etc@gmail.com>"]
|
||||
|
||||
[deps]
|
||||
@@ -9,6 +9,7 @@ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
|
||||
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
|
||||
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
|
||||
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
|
||||
HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
|
||||
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
|
||||
NATS = "55e73f9c-eeeb-467f-b4cc-a633fde63d2a"
|
||||
PrettyPrinting = "54e16d92-306c-5ea0-a30b-337be88ac337"
|
||||
@@ -18,6 +19,7 @@ SHA = "ea8e919c-243c-51af-8825-aaa63cd721ce"
|
||||
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
|
||||
|
||||
[compat]
|
||||
JSON = "1.3.0"
|
||||
HTTP = "2.5.0 - 2.9.9"
|
||||
JSON = "1.3.0 - 1.9.9"
|
||||
NATS = "0.1.0"
|
||||
Revise = "3.13.2"
|
||||
|
||||
+43
-1
@@ -121,7 +121,8 @@ function generateInsertSQL(table_name::String, columnToInsert::Vector{Symbol}, d
|
||||
for (key, value) in data
|
||||
if key ∈ columnToInsert
|
||||
push!(columns, string(key))
|
||||
push!(values, "'$value'") #[] number should not wrapped in ''
|
||||
value_str = isa(value, AbstractString) ? "'$value'" : "$value"
|
||||
push!(values, value_str)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -131,6 +132,22 @@ function generateInsertSQL(table_name::String, columnToInsert::Vector{Symbol}, d
|
||||
return "INSERT INTO $table_name ($columns_str) VALUES ($values_str);"
|
||||
end
|
||||
|
||||
function generateInsertSQL(table_name::String, data::AbstractDict{String, Any})
|
||||
columns = String[]
|
||||
values = String[]
|
||||
|
||||
for (key, value) in data
|
||||
push!(columns, string(key))
|
||||
value_str = isa(value, AbstractString) ? "'$value'" : "$value"
|
||||
push!(values, value_str)
|
||||
end
|
||||
|
||||
columns_str = join(columns, ", ")
|
||||
values_str = join(values, ", ")
|
||||
|
||||
return "INSERT INTO $table_name ($columns_str) VALUES ($values_str);"
|
||||
end
|
||||
|
||||
|
||||
# ---------------------------------------------- 100 --------------------------------------------- #
|
||||
|
||||
@@ -185,5 +202,30 @@ function generateUpdateSQL(table_name::String, pk_column::String, pk_value,
|
||||
return "UPDATE $table_name SET $set_clause WHERE $pk_column = $pk_val_str;"
|
||||
end
|
||||
|
||||
function generateUpdateSQL(table_name::String, pk_dict::AbstractDict{String, Any},
|
||||
data::AbstractDict{String, Any})
|
||||
# Build SET clause
|
||||
set_parts = String[]
|
||||
for (key, value) in data
|
||||
if key ∉ keys(pk_dict)
|
||||
value_str = isa(value, AbstractString) ? "'$value'" : "$value"
|
||||
push!(set_parts, "$(string(key)) = $value_str")
|
||||
end
|
||||
end
|
||||
|
||||
set_clause = join(set_parts, ", ")
|
||||
|
||||
# Build WHERE clause for composite keys
|
||||
where_parts = String[]
|
||||
for (col, val) in pk_dict
|
||||
val_str = isa(val, AbstractString) ? "'$val'" : "$val"
|
||||
push!(where_parts, "$(string(col)) = $val_str")
|
||||
end
|
||||
|
||||
where_clause = join(where_parts, " AND ")
|
||||
|
||||
return "UPDATE $table_name SET $set_clause WHERE $where_clause;"
|
||||
end
|
||||
|
||||
|
||||
end # module
|
||||
+458
-201
@@ -5,7 +5,7 @@ export noNegative!, randomWithProb, randomChoiceWithProb, findIndex, limitvalue,
|
||||
replaceLessThan, replaceBetween, cartesianAssign!, sumAlongDim3, matMul3Dto3DmanyTo1batch,
|
||||
matMul_3Dto4D_batchwise, isNotEqual, linearToCartesian, vectorMax, findMax,
|
||||
multiply_last, multiplyRandomElements, replaceElements, replaceElements!, isBetween,
|
||||
isLess, allTrue, getStringBetweenCharacters, JSON3read_stringKey, mkDictPath!,
|
||||
isLess, allTrue, getStringBetweenCharacters, mkDictPath!, dict_to_string_html,
|
||||
getDictPath, detectKeywordVariation, textToDict, dictify, ordereddictify
|
||||
|
||||
using JSON, DataStructures, Distributions, Random, Dates, UUIDs, DataFrames, CSV
|
||||
@@ -150,14 +150,31 @@ end
|
||||
|
||||
# ---------------------------------------------- 100 --------------------------------------------- #
|
||||
|
||||
""" read_textfile_by_index(folder_path::String, read_file_number::Integer=1)
|
||||
""" Reads the x-th text file from a folder, where files are listed by the OS
|
||||
without explicit sorting. Returns the file number, filename, and content.
|
||||
|
||||
with multiple text file in a folder,
|
||||
this function read x_th text file in a folder (filename is sorted by OS)
|
||||
# Arguments
|
||||
- `folder_path::String`
|
||||
Path to the folder containing text files.
|
||||
- `read_file_number::Integer=1`
|
||||
Which file to read (1-based index). Defaults to the first file.
|
||||
|
||||
# Example
|
||||
utils.read_textfile_by_index(cleaned_data_path, 2)
|
||||
read 2nd txt file in a folder
|
||||
# Return
|
||||
- A tuple of `(file_number::Integer, filename::String, content)` where:
|
||||
- `file_number` is the index of the file that was read
|
||||
- `filename` is the actual filename string
|
||||
- `content` is a vector of lines from the file (or `nothing` if error)
|
||||
|
||||
# Notes
|
||||
- Errors if `folder_path` is not a valid directory.
|
||||
- Errors if `read_file_number` exceeds the number of files in the folder.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> result = read_textfile_by_index("/path/to/folder", 2)
|
||||
(2, "sample.txt", ["line1", "line2", ...])
|
||||
```
|
||||
"""
|
||||
function read_textfile_by_index(folder_path::String, read_file_number::Integer=1)
|
||||
if isdir(folder_path)
|
||||
@@ -186,36 +203,35 @@ function read_textfile_by_index(folder_path::String, read_file_number::Integer=1
|
||||
end
|
||||
|
||||
|
||||
""" Recursively convert dictionary-like variable (e.g. JSON.Object) into a dictionary.
|
||||
""" Recursively convert dictionary-like variable (e.g. JSON.Object) into an OrderedDict.
|
||||
|
||||
# What it does
|
||||
- Walks any nested structure composed of `AbstractDict` (e.g., `JSON.Object`,
|
||||
`Dict`, `OrderedDict`) and `AbstractArray` and produces a new tree where
|
||||
every dictionary-like node is a plain `Dict` and every array-like node is a
|
||||
`Vector{Any}`. Scalar values (numbers, strings, booleans, `nothing`, etc.)
|
||||
are returned unchanged.
|
||||
- Does **not** mutate the input; it always allocates new containers.
|
||||
The function walks any nested structure composed of `AbstractDict` (e.g., `JSON.Object`,
|
||||
`Dict`, `OrderedDict`) and `AbstractArray` and produces a new tree where
|
||||
every dictionary-like node is an `OrderedDict` and every array-like node is a `Vector{Any}`.
|
||||
Scalar values (numbers, strings, booleans, `nothing`, etc.) are returned unchanged.
|
||||
Does **not** mutate the input; it always allocates new containers.
|
||||
|
||||
# Arguments
|
||||
- `x`
|
||||
Any Julia value. If `x` is an `AbstractDict` it will be converted to a `Dict`;
|
||||
Any Julia value. If `x` is an `AbstractDict` it will be converted to an `OrderedDict`;
|
||||
if it is an `AbstractArray` its elements will be processed recursively.
|
||||
|
||||
# Keyword Arguments
|
||||
- `stringkey::Bool=false`
|
||||
If `true`, every dictionary key is converted to `String` via `string(k)`.
|
||||
If `false`, original key objects are preserved (useful when keys are already
|
||||
`String`, `Symbol`, or other types you want to keep).
|
||||
- `keytype::Type=Any`
|
||||
The key type for the output OrderedDict. Use `String` for `OrderedDict{String,Any}`,
|
||||
`Symbol` for `OrderedDict{Symbol,Any}`, or `Any` to preserve original key types.
|
||||
- `sort_order::Union{Nothing, Vector}=nothing`
|
||||
Vector of keys specifying the desired order. Keys are arranged in the specified order
|
||||
first, followed by any remaining keys.
|
||||
|
||||
# Return
|
||||
- A newly allocated nested structure composed of `Dict{Any,Any}` and
|
||||
`Vector{Any}` that mirrors the input shape but uses plain Julia containers.
|
||||
- A newly allocated nested structure composed of `OrderedDict{keytype,Any}` and `Vector{Any}`
|
||||
that mirrors the input shape but uses ordered Julia containers.
|
||||
|
||||
# Notes
|
||||
- The function treats any `AbstractDict` as a mapping source, so it works with
|
||||
`JSON.Object`, `Dict`, `OrderedDict`, etc.
|
||||
- Arrays are returned as `Vector{Any}` with their elements processed
|
||||
recursively.
|
||||
- Arrays are returned as `Vector{Any}` with their elements processed recursively.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
@@ -234,92 +250,105 @@ julia> d = Dict(
|
||||
)
|
||||
)
|
||||
|
||||
julia jsonstring = JSON.json(d)
|
||||
julia> jsonstring = JSON.json(d)
|
||||
julia> A1 = JSON.parse(jsonstring) # A1 type is JSON.Object
|
||||
julia> A2 = dictify(A1)
|
||||
Dict{Any,Any} with 3 entries:
|
||||
julia> A2 = dictify(A1; keytype=String)
|
||||
OrderedDict{String,Any} with 3 entries:
|
||||
"a" => 4
|
||||
"b" => 6
|
||||
"c" => Dict("d"=>7, "e"=>Dict("f"=>"hey", "g"=>Dict("world"=>[1, "2", 3, 4.7])))
|
||||
"c" => OrderedDict("d"=>7, "e"=>Dict("f"=>"hey", "g"=>Dict("world"=>[1, "2", 3, 4.7])))
|
||||
|
||||
julia> A3 = dictify(A1; stringkey=false) # preserves original key objects
|
||||
julia> B1 = dictify(d; stringkey=true) # convert all keys in to string
|
||||
Dict{Any, Any} with 3 entries:
|
||||
"c" => Dict{Any, Any}("e"=>Dict{Any, Any}("f"=>"hey", "g"=>Dict{Any, Any}("world"=>Any[1, "2", 3, Dict{Any, Any}("dd"=>4.7)])), "d"=>7)
|
||||
"b" => 6
|
||||
"a" => 4
|
||||
julia> A3 = dictify(A1; keytype=Symbol)
|
||||
OrderedDict{Symbol,Any} with 3 entries:
|
||||
:a => 4
|
||||
:b => 6
|
||||
:c => OrderedDict(:d=>7, :e=>Dict("f"=>"hey", "g"=>Dict("world"=>[1, "2", 3, 4.7])))
|
||||
|
||||
julia> B1 = dictify(d; keytype=String)
|
||||
OrderedDict{String, Any} with 3 entries:
|
||||
```
|
||||
|
||||
**With sort_order:**
|
||||
```jldoctest
|
||||
julia> d = Dict("a"=>1, "b"=>2, "c"=>3)
|
||||
julia> dictify(d; sort_order=["c", "a"])
|
||||
OrderedDict{String,Int} with 3 entries:
|
||||
"c" => 3
|
||||
"a" => 1
|
||||
"b" => 2
|
||||
```
|
||||
"""
|
||||
function dictify(x; stringkey::Bool=false)
|
||||
function dictify(x; keytype::Type=Any, sort_order::Union{Nothing, Vector}=nothing)
|
||||
# Dict-like objects
|
||||
if x isa AbstractDict
|
||||
# choose output key type container (String keys when requested)
|
||||
out = Dict{Any,Any}()
|
||||
for (k,v) in x
|
||||
newk = stringkey ? string(k) : k
|
||||
out[newk] = dictify(v; stringkey=stringkey)
|
||||
out = OrderedDict{keytype, Any}()
|
||||
|
||||
# 1. Process and normalize all keys from the input dictionary
|
||||
processed_dict = OrderedDict{keytype, Any}()
|
||||
for (k, v) in x
|
||||
if keytype === String
|
||||
newk = string(k)
|
||||
elseif keytype === Symbol
|
||||
newk = Symbol(string(k))
|
||||
else
|
||||
newk = k
|
||||
end
|
||||
processed_dict[newk] = dictify(v; keytype=keytype, sort_order=sort_order)
|
||||
end
|
||||
|
||||
# 2. If a sort order is specified, apply it
|
||||
if !isnothing(sort_order)
|
||||
# Normalize the sort_order elements to match the requested keytype
|
||||
normalized_order = map(sort_order) do tk
|
||||
if keytype === String
|
||||
return string(tk)
|
||||
elseif keytype === Symbol
|
||||
return Symbol(string(tk))
|
||||
else
|
||||
return tk
|
||||
end
|
||||
end
|
||||
|
||||
# First, insert keys that match the requested order
|
||||
for target_key in normalized_order
|
||||
if haskey(processed_dict, target_key)
|
||||
out[target_key] = processed_dict[target_key]
|
||||
end
|
||||
end
|
||||
|
||||
# Then, append any remaining keys that weren't in the sort_order
|
||||
for (k, v) in processed_dict
|
||||
if !haskey(out, k)
|
||||
out[k] = v
|
||||
end
|
||||
end
|
||||
else
|
||||
# If no sort order is given, just use the processed dict
|
||||
out = processed_dict
|
||||
end
|
||||
|
||||
return out
|
||||
# Arrays / vectors: map elements recursively and return a Vector{Any}
|
||||
|
||||
# Arrays / vectors: map elements recursively
|
||||
elseif x isa AbstractArray
|
||||
return [dictify(element; stringkey=stringkey) for element in x]
|
||||
# everything else: return as-is (primitives, numbers, strings, etc.)
|
||||
return [dictify(element; keytype=keytype, sort_order=sort_order) for element in x]
|
||||
|
||||
# Everything else: return as-is
|
||||
else
|
||||
return x
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
# ---------------------------------------------- 100 --------------------------------------------- #
|
||||
|
||||
""" Array_to_JSON_str(data::AbstractArray)
|
||||
|
||||
encode Array to JSON String
|
||||
|
||||
# Example
|
||||
|
||||
a = [1.23 4.7889; 9987.1 -123.07; -0.0027 -6.75]
|
||||
jsonStr = Array_to_JSON_str(a)
|
||||
jsonStr = "{\"Array\":[[1.23,9987.1,-0.0027],[4.7889,-123.07,-6.75]],\"size\":[3,2]}"
|
||||
"""
|
||||
function Array_to_JSON_str(data::AbstractArray)
|
||||
d = Dict("Array"=> data, "size"=>size(data))
|
||||
jsonStr = JSON.json(d)
|
||||
return jsonStr
|
||||
end
|
||||
|
||||
# ---------------------------------------------- 100 --------------------------------------------- #
|
||||
|
||||
""" JSON_str_to_Array(json_str::String)
|
||||
|
||||
decode JSON String to Array
|
||||
|
||||
# Example
|
||||
|
||||
jsonStr = "{\"Array\":[[1.23,9987.1,-0.0027],[4.7889,-123.07,-6.75]],\"size\":[3,2]}"
|
||||
a = JSON_str_to_Array(jsonStr)
|
||||
|
||||
"""
|
||||
function JSON_str_to_Array(jsonStr::String)
|
||||
jsonObj = JSON.parse(jsonStr)
|
||||
a = Array(jsonObj.Array)
|
||||
array = hcat(a...)
|
||||
return array
|
||||
end
|
||||
|
||||
# ---------------------------------------------- 100 --------------------------------------------- #
|
||||
|
||||
""" Recursively convert dictionary-like variable (e.g. JSON.Object) into a dictionary.
|
||||
|
||||
# What it does
|
||||
- Walks any nested structure composed of AbstractDict (e.g., JSON.Object,
|
||||
Dict, OrderedDict) and AbstractArray and produces a new tree where
|
||||
every dictionary-like node is an OrderedDict{Any,Any} and every array-like
|
||||
node is a Vector{Any}. Scalar values (numbers, strings, booleans,
|
||||
nothing, etc.) are returned unchanged.
|
||||
- Does **not** mutate the input; it always allocates new containers.
|
||||
The function walks any nested structure composed of AbstractDict (e.g., JSON.Object,
|
||||
Dict, OrderedDict) and AbstractArray and produces a new tree where
|
||||
every dictionary-like node is an OrderedDict{Any,Any} and every array-like
|
||||
node is a Vector{Any}. Scalar values (numbers, strings, booleans,
|
||||
nothing, etc.) are returned unchanged.
|
||||
Does **not** mutate the input; it always allocates new containers.
|
||||
|
||||
# Arguments
|
||||
- `x`
|
||||
@@ -328,13 +357,11 @@ end
|
||||
processed recursively.
|
||||
|
||||
# Keyword Arguments
|
||||
- `stringkey::Bool=false`
|
||||
If `true`, every dictionary key is converted to `String` via `string(k)`.
|
||||
If `false`, original key objects are preserved (useful when keys are already
|
||||
`String`, `Symbol`, or other types you want to keep).
|
||||
- `keytype::Type=Any`
|
||||
The key type for the output Dict. Use `String` for `OrderedDict{String,Any}`, `Symbol` for `OrderedDict{Symbol,Any}`, or `Any` to preserve original key types.
|
||||
|
||||
# Return
|
||||
- A newly allocated nested structure composed of `OrderedDict{Any,Any}` and
|
||||
- A newly allocated nested structure composed of `OrderedDict{keytype,Any}` and
|
||||
`Vector{Any}` that mirrors the input shape but uses ordered Julia containers.
|
||||
|
||||
# Notes
|
||||
@@ -361,41 +388,52 @@ julia> d = Dict(
|
||||
|
||||
julia jsonstring = JSON.json(d)
|
||||
julia> A1 = JSON.parse(jsonstring) # A1 type is JSON.Object
|
||||
julia> A2 = OrderedDict(A1)
|
||||
Dict{Any,Any} with 3 entries:
|
||||
julia> A2 = ordereddictify(A1; keytype=String)
|
||||
OrderedDict{String,Any} with 3 entries:
|
||||
"a" => 4
|
||||
"b" => 6
|
||||
"c" => Dict("d"=>7, "e"=>Dict("f"=>"hey", "g"=>Dict("world"=>[1, "2", 3, 4.7])))
|
||||
"c" => OrderedDict("d"=>7, "e"=>Dict("f"=>"hey", "g"=>Dict("world"=>[1, "2", 3, 4.7])))
|
||||
|
||||
julia> A3 = OrderedDict(A1; stringkey=false) # preserves original key objects
|
||||
julia> B1 = OrderedDict(d; stringkey=true) # convert all keys in to string
|
||||
Dict{Any, Any} with 3 entries:
|
||||
"c" => Dict{Any, Any}("e"=>Dict{Any, Any}("f"=>"hey", "g"=>Dict{Any, Any}("world"=>Any[1, "2", 3, Dict{Any, Any}("dd"=>4.7)])), "d"=>7)
|
||||
julia> A3 = ordereddictify(A1; keytype=Symbol)
|
||||
OrderedDict{Symbol,Any} with 3 entries:
|
||||
:a => 4
|
||||
:b => 6
|
||||
:c => OrderedDict(:d=>7, :e=>Dict("f"=>"hey", "g"=>Dict("world"=>[1, "2", 3, 4.7])))
|
||||
|
||||
julia> B1 = ordereddictify(d; keytype=String)
|
||||
OrderedDict{String, Any} with 3 entries:
|
||||
"c" => OrderedDict{String, Any}("e"=>OrderedDict{String, Any}("f"=>"hey", "g"=>OrderedDict{String, Any}("world"=>Any[1, "2", 3, OrderedDict{String, Any}("dd"=>4.7)])), "d"=>7)
|
||||
"b" => 6
|
||||
"a" => 4
|
||||
```
|
||||
Ref. https://github.com/andyferris/Dictionaries.jl
|
||||
"""
|
||||
function ordereddictify(x; stringkey::Bool=false)
|
||||
function ordereddictify(x; keytype::Type=Any)
|
||||
# Dict-like objects
|
||||
if x isa AbstractDict
|
||||
# choose output key type container (String keys when requested)
|
||||
out = OrderedDict{Any,Any}()
|
||||
# choose output key type container
|
||||
out = OrderedDict{keytype,Any}()
|
||||
for (k,v) in x
|
||||
newk = stringkey ? string(k) : k
|
||||
out[newk] = ordereddictify(v; stringkey=stringkey)
|
||||
if keytype === String
|
||||
newk = string(k)
|
||||
elseif keytype === Symbol
|
||||
newk = Symbol(string(k))
|
||||
else
|
||||
newk = k
|
||||
end
|
||||
out[newk] = ordereddictify(v; keytype=keytype)
|
||||
end
|
||||
return out
|
||||
# Arrays / vectors: map elements recursively and return a Vector{Any}
|
||||
elseif x isa AbstractArray
|
||||
return [ordereddictify(element; stringkey=stringkey) for element in x]
|
||||
return [ordereddictify(element; keytype=keytype) for element in x]
|
||||
# everything else: return as-is (primitives, numbers, strings, etc.)
|
||||
else
|
||||
return x
|
||||
end
|
||||
end
|
||||
|
||||
#------------------------------------------------------------------------------------------------100
|
||||
#----------------------------------------------100---------------------------------------------
|
||||
|
||||
"""
|
||||
print time of cpu executtion at the line inwhich this macro is used
|
||||
@@ -477,6 +515,32 @@ function randomChoiceOnTarget(target::AbstractVector, choiceList::AbstractVector
|
||||
return randomChoiceOnTarget.(target, 1, (choiceList,), (probability,))
|
||||
end
|
||||
|
||||
""" Compute the linearly weighted average of an array.
|
||||
The function assigns weights proportional to position indices (1, 2, 3, ...) to array
|
||||
elements and returns the weighted average.
|
||||
|
||||
# Arguments
|
||||
- `a::Array`
|
||||
Array of numeric values. Elements must support multiplication with numbers
|
||||
and summation.
|
||||
|
||||
# Return
|
||||
- The linearly weighted average as a floating-point number.
|
||||
|
||||
# Formula
|
||||
For an array `a` with `n` elements, computes:
|
||||
```
|
||||
sum(i * a[i]) / sum(a) for i = 1 to n
|
||||
```
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> a = [10, 20, 30]
|
||||
julia> linearly_weighted_avg(a)
|
||||
23.333333333333332
|
||||
```
|
||||
"""
|
||||
function linearly_weighted_avg(a::Array)
|
||||
total = 0.0
|
||||
for (i, v) in enumerate(a)
|
||||
@@ -487,10 +551,34 @@ function linearly_weighted_avg(a::Array)
|
||||
end
|
||||
|
||||
|
||||
""" Convert String that is holded inside a variable to Symbol
|
||||
# Example
|
||||
x = "hello" # x is a variable holding String "hello" \n
|
||||
y = variable_to_symbol(x) # y holds :hello
|
||||
""" Convert a variable's value (String) into a Symbol.
|
||||
The function takes a variable containing a String value and converts it to a Symbol
|
||||
using Julia's expression interpolation mechanism.
|
||||
|
||||
# Arguments
|
||||
- `variable`
|
||||
Any variable whose value is a String. The function uses `string(variable)`
|
||||
internally to obtain the value.
|
||||
|
||||
# Return
|
||||
- A `Symbol` constructed from the string value of the input variable.
|
||||
|
||||
# Notes
|
||||
- This function uses variable interpolation to capture the variable's
|
||||
value as a Symbol. It works with any variable type that can be converted
|
||||
to String.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> x = "hello"
|
||||
julia> variable_str_to_symbol(x)
|
||||
:hello
|
||||
|
||||
julia> y = "world_test"
|
||||
julia> variable_str_to_symbol(y)
|
||||
:world_test
|
||||
```
|
||||
"""
|
||||
function variable_str_to_symbol(variable)
|
||||
semi = :($variable)
|
||||
@@ -534,6 +622,43 @@ function fieldname_useable_type(somestruct, fieldname::Symbol;
|
||||
end
|
||||
|
||||
|
||||
""" Draw unique elements from a list without replacement.
|
||||
The function randomly selects a specified number of distinct elements from a collection,
|
||||
optionally excluding certain elements from consideration. Uses in-place
|
||||
shuffling for efficiency.
|
||||
|
||||
# Arguments
|
||||
- `drawOptions::Array`
|
||||
Collection of elements to draw from.
|
||||
- `draw_number::Integer`
|
||||
Number of unique elements to draw.
|
||||
|
||||
# Keyword Arguments
|
||||
- `exclude_list::Union{AbstractArray,Nothing}=nothing`
|
||||
Elements to exclude from the drawing pool. If `nothing`, no elements are
|
||||
excluded.
|
||||
|
||||
# Return
|
||||
- An array of `draw_number` unique elements drawn from `drawOptions`, excluding
|
||||
any elements in `exclude_list`.
|
||||
|
||||
# Notes
|
||||
- The function copies `drawOptions` and shuffles in-place, then pops elements
|
||||
sequentially to ensure uniqueness.
|
||||
- Errors if `draw_number` exceeds the number of available elements after
|
||||
exclusion.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> options = [1, 2, 3, 4, 5]
|
||||
julia> randomNoRepeat(options, 3)
|
||||
[3, 1, 5]
|
||||
|
||||
julia> randomNoRepeat(options, 2; exclude_list=[1, 5])
|
||||
[4, 2]
|
||||
```
|
||||
"""
|
||||
function randomNoRepeat(drawOptions::Array, draw_number::Integer;
|
||||
exclude_list::Union{AbstractArray,Nothing}=nothing)
|
||||
draw_option = copy(drawOptions)
|
||||
@@ -700,22 +825,46 @@ function selectRange(d::Dict{Symbol, <:AbstractVector}, range)
|
||||
return newDict
|
||||
end
|
||||
|
||||
""" Assign value to a given Dict by array of keys
|
||||
""" Recursively traverses a nested dictionary structure using a vector of keys
|
||||
and assigns a value to the final key. Creates intermediate dictionaries
|
||||
if they don't exist.
|
||||
|
||||
# Example
|
||||
d = Dict(
|
||||
:a1=> Dict(:c=> 5),
|
||||
:a2=> Dict(
|
||||
:k=> 10,
|
||||
:b=> Dict(
|
||||
:s=> "target",
|
||||
)
|
||||
)
|
||||
)
|
||||
index = [:a2, :b, :s] \n
|
||||
assignDict!(d, [:a2, :b, :s], "wow")
|
||||
# Arguments
|
||||
- `dict::Dict`
|
||||
The root dictionary to traverse and modify.
|
||||
- `accessArray::Array{Symbol}`
|
||||
A vector of symbols representing the key path to traverse.
|
||||
- `valueToAssign`
|
||||
The value to assign at the final key in the path.
|
||||
|
||||
return 1 if no target key in a given dict.
|
||||
# Return
|
||||
- `0` on success (value assigned)
|
||||
- `1` if the path cannot be traversed (missing intermediate keys)
|
||||
|
||||
# Notes
|
||||
- The function walks through each key in `accessArray` except the last one,
|
||||
expecting intermediate keys to already exist in the dictionary.
|
||||
- If any intermediate key is missing, the function returns `1` without
|
||||
modifying the dictionary.
|
||||
- The final key in `accessArray` receives the `valueToAssign`.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> d = Dict(
|
||||
:a1=> Dict(:c=> 5),
|
||||
:a2=> Dict(
|
||||
:k=> 10,
|
||||
:b=> Dict(
|
||||
:s=> "target",
|
||||
)
|
||||
)
|
||||
)
|
||||
julia> assignDict!(d, [:a2, :b, :s], "wow")
|
||||
0
|
||||
julia> d[:a2][:b][:s]
|
||||
"wow"
|
||||
```
|
||||
"""
|
||||
function assignDict!(dict::Dict, accessArray::Array{Symbol}, valueToAssign)
|
||||
wd = nothing
|
||||
@@ -736,9 +885,39 @@ function assignDict!(dict::Dict, accessArray::Array{Symbol}, valueToAssign)
|
||||
end
|
||||
end
|
||||
|
||||
""" convert hour(0-23), minute(0-59) into julia time object
|
||||
# Example
|
||||
time
|
||||
""" Converts hour (0-23) and minute (0-59) into a Julia `Time` object using
|
||||
12-hour format with AM/PM indicator.
|
||||
|
||||
# Arguments
|
||||
- `h::Integer`
|
||||
Hour in 24-hour format (0 to 23).
|
||||
- `m::Integer`
|
||||
Minute (0 to 59).
|
||||
|
||||
# Return
|
||||
- A `Time` object representing the time in 12-hour format with AM/PM.
|
||||
|
||||
# Notes
|
||||
- Hours 0 and 12 are special cases: 0 becomes 12 AM, 12 becomes 12 PM.
|
||||
- Hours 1-11 remain the same with "am" suffix.
|
||||
- Hours 13-23 are converted to 1-11 with "pm" suffix.
|
||||
- Minutes less than 10 are zero-padded.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> iTime(0, 30)
|
||||
12:30 AM
|
||||
|
||||
julia> iTime(9, 15)
|
||||
9:15 AM
|
||||
|
||||
julia> iTime(12, 0)
|
||||
12:00 PM
|
||||
|
||||
julia> iTime(14, 5)
|
||||
2:05 PM
|
||||
```
|
||||
"""
|
||||
function iTime(h::Integer, m::Integer)
|
||||
if h == 0
|
||||
@@ -782,19 +961,37 @@ function limitvalue(v::Number, lowerbound::Pair, upperbound::Pair)
|
||||
end
|
||||
|
||||
|
||||
""" Assign matrix b to matrix a according to matrix b's CartesianIndex.
|
||||
""" Assigns elements from matrix `b` to matrix `a` using the Cartesian indices
|
||||
of `b`. Elements are copied in the order they appear when iterating over `b`,
|
||||
and placed into `a` at the corresponding Cartesian positions of `b`.
|
||||
|
||||
Arguments:\n
|
||||
a : target matrix.
|
||||
b : source matrix.
|
||||
|
||||
Return:\n
|
||||
Resulting matrix a.
|
||||
# Arguments
|
||||
- `a`
|
||||
Target matrix where values from `b` will be assigned.
|
||||
- `b`
|
||||
Source matrix whose Cartesian indices determine where values are placed in `a`.
|
||||
|
||||
Example:\n
|
||||
```jldoctest
|
||||
julia> not done yet
|
||||
```
|
||||
# Return
|
||||
- `nothing`
|
||||
|
||||
# Notes
|
||||
- The function iterates through `b` in column-major order (Julia's default),
|
||||
retrieving each element's Cartesian index and assigning it to the same
|
||||
position in `a`.
|
||||
- Matrix `a` must have sufficient size to accommodate all Cartesian indices
|
||||
from `b`; otherwise, an `BoundsError` may occur.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> a = zeros(4, 4);
|
||||
julia> b = [1 2; 3 4];
|
||||
julia> cartesianAssign!(a, b);
|
||||
julia> a[1:2, 1:2]
|
||||
2×2 Matrix{Float64}:
|
||||
1.0 3.0
|
||||
2.0 4.0
|
||||
```
|
||||
"""
|
||||
function cartesianAssign!(a, b)
|
||||
for (i, v) in enumerate(b)
|
||||
@@ -1149,7 +1346,6 @@ julia> text = "{\"ask\": {\"text\": \"Could you please tell me about the special
|
||||
julia> GeneralUtils.getStringBetweenCharacters(text, '{', '}', endCharLocation="end")
|
||||
"{\"ask\": {\"text\": \"Could you please tell me about the special event?\"\n}}"
|
||||
```
|
||||
# Signature
|
||||
"""
|
||||
function getStringBetweenCharacters(text::T, startChar::Char, endChar::Char;
|
||||
endCharLocation::String="next", includeChar::Bool=true)::String where {T<:AbstractString}
|
||||
@@ -1181,59 +1377,40 @@ function getStringBetweenCharacters(text::T, startChar::Char, endChar::Char;
|
||||
end
|
||||
|
||||
|
||||
|
||||
""" Read JSON string and return a dictionary with string key. (JSON3 defaults to symbol key)
|
||||
This function solve the problem of reading JSON with string key.
|
||||
|
||||
Arguments:
|
||||
jsonString::String
|
||||
|
||||
Return:
|
||||
a dictionary with string key
|
||||
|
||||
Example:
|
||||
```jldoctest
|
||||
julia> jsonString = {\"wine type\": \"Red\", \"intensity level\": \"medium-bodied\"}
|
||||
julia> JSON3read_stringKey(jsonString)
|
||||
Dict{String, Any} with 2 entries:
|
||||
"intensity level" => "medium-bodied"
|
||||
"wine type" => "Red"
|
||||
```
|
||||
"""
|
||||
function JSON3read_stringKey(jsonString::AbstractString)
|
||||
jsonobj = JSON3.read(jsonString)
|
||||
newDict = OrderedDict{String,Any}()
|
||||
for (k,v) in jsonobj
|
||||
newDict[string(k)] = v
|
||||
end
|
||||
return newDict
|
||||
end
|
||||
|
||||
|
||||
""" Create nested dict path if it does not already exist. The same concept as Julia's mkpath()
|
||||
""" Recursively creates nested dictionary paths if they do not exist and assigns
|
||||
a value to the final key. Similar to `mkpath()` but for dictionaries.
|
||||
|
||||
# Arguments
|
||||
- `dict::Dict`
|
||||
target dict
|
||||
- `addkeys::Union{Vector{String}, Vector{Symbol}}`
|
||||
keys to be added to dict
|
||||
- `value`
|
||||
value to be added to dict at final key in keypath
|
||||
- `dict::Union{Dict{Symbol, Any}, Dict{String, Any}}`
|
||||
The target dictionary to traverse and modify. Must use consistent key types
|
||||
(either all `String` or all `Symbol`).
|
||||
- `addkeys::Union{Vector{String}, Vector{Symbol}}`
|
||||
A vector of keys representing the path to traverse. Intermediate dictionaries
|
||||
are created if they don't exist.
|
||||
- `value`
|
||||
The value to assign at the final key in the path.
|
||||
|
||||
# Return
|
||||
- dict with added keypath
|
||||
- The assigned `value`.
|
||||
|
||||
# Example
|
||||
# Notes
|
||||
- The function ensures key type consistency: the type of keys being added must
|
||||
match the type of existing keys in the dictionary.
|
||||
- Intermediate dictionaries are automatically created with the appropriate key
|
||||
type when they don't exist.
|
||||
- The function walks through each key in `addkeys` except the last one,
|
||||
creating intermediate dictionaries as needed, and assigns `value` to the final
|
||||
key.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using Revise
|
||||
julia> using GeneralUtils
|
||||
julia> d = Dict{String, Any}("a" => Dict{String, Any}("b" => 10))
|
||||
julia> GeneralUtils.mkDictPath!(d, ["a", "v", "x", "y", "z"], 42)
|
||||
Dict{String, Any} with 1 entry:
|
||||
"path" => Dict{Any, Any}("to"=>Dict{Any, Any}("nested"=>Dict{Any, Any}("value"=>42)))
|
||||
julia> d = Dict("a" => Dict("b" => 10))
|
||||
julia> mkDictPath!(d, ["a", "v", "x", "y", "z"], 42)
|
||||
42
|
||||
julia> d["a"]["v"]["x"]["y"]["z"]
|
||||
42
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function mkDictPath!(dict::Union{Dict{Symbol, Any}, Dict{String, Any}},
|
||||
addkeys::Union{Vector{String}, Vector{Symbol}}, value)
|
||||
@@ -1257,27 +1434,33 @@ function mkDictPath!(dict::Union{Dict{Symbol, Any}, Dict{String, Any}},
|
||||
end
|
||||
|
||||
|
||||
""" Get nested dict value using a vector of keys
|
||||
""" Retrieves a value from a nested dictionary by traversing a vector of keys.
|
||||
Creates intermediate dictionaries if they don't exist.
|
||||
|
||||
# Arguments
|
||||
- `dict::Dict`
|
||||
target dict
|
||||
- `keys::Vector`
|
||||
keys vector
|
||||
- `dict::Dict`
|
||||
The root dictionary to traverse.
|
||||
- `keys::Vector`
|
||||
A vector of keys representing the path to traverse. Each key in the vector
|
||||
is used to access the next level of nesting.
|
||||
|
||||
# Return
|
||||
- dict with added keypath
|
||||
- The value at the final key in the path.
|
||||
|
||||
# Example
|
||||
# Notes
|
||||
- Errors with `ArgumentError` if any intermediate key is missing from the
|
||||
dictionary path.
|
||||
- The function walks through each key in `keys` except the last one,
|
||||
expecting intermediate keys to exist in the dictionary.
|
||||
- The final key in `keys` is used to retrieve the value.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using Revise
|
||||
julia> using GeneralUtils
|
||||
julia> d = Dict{Symbol, Any}(:a => Dict{Symbol, Any}(:b => 10))
|
||||
julia> GeneralUtils.getDictPath(d, [:a, :b])
|
||||
julia> d = Dict(:a => Dict(:b => 10))
|
||||
julia> getDictPath(d, [:a, :b])
|
||||
10
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function getDictPath(dict::Dict, keys::Vector)
|
||||
current_dict = dict
|
||||
@@ -1429,8 +1612,6 @@ OrderedCollections.OrderedDict{Any, Any}(:thought => "what to do",
|
||||
:plan => "wake up and going out",
|
||||
:action => "1. wake up 2. eat 3. sleep")
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function textToDict(text::String, detectKeywords::Vector{String};
|
||||
dictKey::Union{Vector{String}, Nothing}=nothing,
|
||||
@@ -1491,6 +1672,82 @@ function textToDict(text::String, detectKeywords::Vector{String};
|
||||
return od2
|
||||
end
|
||||
|
||||
""" Recursively convert dictionary into an HTML string representation.
|
||||
The function walks a nested `AbstractDict` structure and produces a well-formed HTML string
|
||||
where each dictionary key becomes an HTML tag. Nested dictionaries become
|
||||
nested tags, and scalar values (numbers, strings, etc.) become the text
|
||||
content of leaf tags.
|
||||
|
||||
# Arguments
|
||||
- `d::AbstractDict`
|
||||
The dictionary to convert. Keys must be strings or symbols that form valid
|
||||
HTML tag names.
|
||||
|
||||
# Keyword Arguments
|
||||
- `indent_level::Integer=1`
|
||||
Initial indentation level for the output. Each recursive level increases
|
||||
indentation by one.
|
||||
- `indent_str::String=" "`
|
||||
String used for each indentation level.
|
||||
|
||||
# Return
|
||||
- A single HTML string representing the dictionary structure, with proper
|
||||
opening and closing tags and appropriate indentation.
|
||||
|
||||
# Notes
|
||||
- Keys are sorted alphabetically for deterministic output.
|
||||
- Works recursively: dictionary values produce nested tags; non-dictionary
|
||||
values are placed as text between opening/closing tags.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> d = Dict(
|
||||
"html" => Dict(
|
||||
"head" => Dict("title" => "Test"),
|
||||
"body" => Dict(
|
||||
"h1" => "Hello",
|
||||
"p" => "World"
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
julia> println(dict_to_string_html(d))
|
||||
<html>
|
||||
<head>
|
||||
<title>Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Hello</h1>
|
||||
<p>World</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
"""
|
||||
function dict_to_string_html(d::AbstractDict; indent_level=1, indent_str=" ")
|
||||
lines = String[]
|
||||
padding = indent_str ^ indent_level
|
||||
|
||||
for k in keys(d)
|
||||
v = d[k]
|
||||
|
||||
if v isa AbstractDict
|
||||
# Open tag, recurse for children, then close tag
|
||||
push!(lines, "$padding<$k>")
|
||||
ind_level = indent_level + 1
|
||||
push!(lines, dict_to_string_html(v; indent_level=ind_level, indent_str=indent_str))
|
||||
push!(lines, "$padding</$k>")
|
||||
else
|
||||
# Leaf node: put key and value on a single line
|
||||
push!(lines, "$padding<$k>$v</$k>")
|
||||
end
|
||||
end
|
||||
return join(lines, "\n")
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+110
-1
@@ -1,6 +1,7 @@
|
||||
module llmUtil
|
||||
|
||||
export formatLLMtext, formatLLMtext_llama3instruct, jsoncorrection, deFormatLLMtext, extractthink
|
||||
export formatLLMtext, formatLLMtext_llama3instruct, jsoncorrection, deFormatLLMtext, extractthink,
|
||||
checkAgentResponse_JSON, clean_json_response
|
||||
|
||||
using UUIDs, JSON, Dates
|
||||
using GeneralUtils
|
||||
@@ -440,6 +441,114 @@ end
|
||||
|
||||
|
||||
|
||||
""" Validate that an agent's JSON response contains all required keys and no extra keys.
|
||||
|
||||
The function checks if `responsedict` contains exactly the keys specified in `requiredKeys`
|
||||
with no duplicates and no missing keys. It is designed to validate structured agent responses
|
||||
against an expected schema.
|
||||
|
||||
# Arguments
|
||||
- `responsedict::Dict`
|
||||
A dictionary containing the agent's JSON response. Must be a plain `Dict` or
|
||||
dictionary-like object with String keys.
|
||||
- `requiredKeys::T` where `T<:Array{String}`
|
||||
An array of required key names that must be present in `responsedict`.
|
||||
|
||||
# Return
|
||||
- `Tuple{Bool, Union{String, Nothing}}`
|
||||
A tuple where the first element indicates whether validation passed (`true`) or failed (`false`),
|
||||
and the second element contains an error message if validation failed, or `nothing` if it passed.
|
||||
|
||||
# Details
|
||||
The validation logic checks:
|
||||
1. **Duplicate keys**: If `responsedict` contains more keys than `requiredKeys`, validation fails
|
||||
because the agent included extra/unexpected keys.
|
||||
2. **Missing keys**: If any key in `requiredKeys` is absent from `responsedict`, validation fails
|
||||
and the specific missing keys are listed in the error message.
|
||||
3. **Valid response**: If all required keys are present and no extra keys exist, validation passes.
|
||||
|
||||
# Example
|
||||
|
||||
```julia
|
||||
julia> using YiemAgent
|
||||
julia> requiredKeys = ["wine_name", "price", "rating"]
|
||||
julia> response = Dict("wine_name"=>"Château Margaux", "price"=>250.0, "rating"=>98)
|
||||
julia> YiemAgent.checkAgentResponse_JSON(response, requiredKeys)
|
||||
(true, nothing)
|
||||
|
||||
julia> response_missing = Dict("wine_name"=>"Château Margaux", "price"=>250.0)
|
||||
julia> YiemAgent.checkAgentResponse_JSON(response_missing, requiredKeys)
|
||||
(false, "rating are missing from your previous response")
|
||||
|
||||
julia> response_extra = Dict("wine_name"=>"Château Margaux", "price"=>250.0, "rating"=>98, "extra_field"=>"data")
|
||||
julia> YiemAgent.checkAgentResponse_JSON(response_extra, requiredKeys)
|
||||
(false, "Your previous attempt has duplicated points according to the required response format")
|
||||
```
|
||||
"""
|
||||
function checkAgentResponse_JSON(responsedict::T1, requiredKeys::T2
|
||||
)::Tuple where {T1<:AbstractDict, T2<:Array{String}}
|
||||
_responsedictKey = keys(responsedict)
|
||||
responsedictKey = [i for i in _responsedictKey] # convert into a list
|
||||
is_requiredKeys_in_responsedictKey = [i ∈ responsedictKey for i in requiredKeys]
|
||||
ispass = false
|
||||
errormsg = nothing
|
||||
if length(is_requiredKeys_in_responsedictKey) > length(requiredKeys)
|
||||
errormsg = "Your previous attempt has duplicated points according to the required response format"
|
||||
ispass = false
|
||||
elseif !all(is_requiredKeys_in_responsedictKey)
|
||||
zeroind = findall(x -> x == 0, is_requiredKeys_in_responsedictKey)
|
||||
missingkeys = [requiredKeys[i] for i in zeroind]
|
||||
errormsg = "$missingkeys are missing from your previous response"
|
||||
ispass = false
|
||||
else
|
||||
ispass = true
|
||||
end
|
||||
return (ispass, errormsg)
|
||||
end
|
||||
|
||||
""" Convert a plain text string containing key-value pairs into a JSON-formatted string.
|
||||
|
||||
This function takes text containing key-value pairs (typically extracted from LLM responses)
|
||||
and wraps them in proper JSON braces to create a valid JSON string. It cleans the input
|
||||
by removing common formatting artifacts like braces, code block markers, and language
|
||||
specifiers before wrapping the content.
|
||||
|
||||
# Arguments
|
||||
- `text::String`
|
||||
A string containing key-value pairs, typically in the format `key: value, key: value`.
|
||||
May contain leading/trailing braces, code block markers (```), or language specifiers
|
||||
(e.g., `json`) that will be removed.
|
||||
|
||||
# Return
|
||||
- `String`
|
||||
A JSON-formatted string with the key-value pairs wrapped in `{}` braces.
|
||||
|
||||
# Notes
|
||||
- The function removes `{`, `}`, `````, and `json` from the input before wrapping.
|
||||
- The output is always wrapped in curly braces to create valid JSON structure.
|
||||
- This is typically used to sanitize LLM responses that contain key-value data
|
||||
but may include formatting artifacts.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> text = "thought: Hello, action: CHATBOX, input: How can I help?"
|
||||
julia> clean_json_response(text)
|
||||
"{thought: Hello, action: CHATBOX, input: How can I help?}"
|
||||
|
||||
julia> text = "{thought: Hello, action: CHATBOX}"
|
||||
julia> clean_json_response(text)
|
||||
"{thought: Hello, action: CHATBOX}"
|
||||
|
||||
julia> text = "```json{thought: Hello, action: CHATBOX}```"
|
||||
julia> clean_json_response(text)
|
||||
"{thought: Hello, action: CHATBOX}"
|
||||
```
|
||||
"""
|
||||
function clean_json_response(text::String)
|
||||
removelist = ["{", "}", "```", "json", "\n"]
|
||||
return '{' * removestring(text, removelist) * '}'
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+144
-89
@@ -5,7 +5,7 @@ export timedifference, showstracktrace, findHighestIndexKey, uuid4snakecase, rep
|
||||
dataframeToCSV, dfToVectorDict, disintegrate_vectorDict, getDataFrameValue, dfRowtoString,
|
||||
dfToString, dataframe_to_json_list, dictToString, dictToString_noKey, issomething,
|
||||
dictToString_numbering, extract_triple_backtick_text,
|
||||
countGivenWords, remove_french_accents,
|
||||
countGivenWords, remove_french_accents, removestring,
|
||||
extractTextBetweenCharacter, extractTextBetweenString,
|
||||
convertCamelSnakeKebabCase, fitrange, recentElementsIndex, nonRecentElementsIndex
|
||||
|
||||
@@ -13,31 +13,34 @@ using JSON, DataStructures, Distributions, Random, Dates, UUIDs, DataFrames
|
||||
|
||||
# ---------------------------------------------- 100 --------------------------------------------- #
|
||||
|
||||
""" Compute time different between start time and stop time in a given unit.
|
||||
Unit can be "milliseconds", "seconds", "minutes", "hours".
|
||||
""" Computes the time difference between two `DateTime` values and returns the
|
||||
result in a specified unit: milliseconds, seconds, minutes, or hours.
|
||||
|
||||
# Arguments
|
||||
- `starttime::DateTime`
|
||||
start time
|
||||
- `stoptime::DateTime`
|
||||
stop time
|
||||
- `unit::String`
|
||||
unit of time difference
|
||||
- `starttime::DateTime`
|
||||
The starting `DateTime` value.
|
||||
- `stoptime::DateTime`
|
||||
The ending `DateTime` value.
|
||||
- `unit::String`
|
||||
The unit for the result. Must be one of: `"milliseconds"`, `"seconds"`,
|
||||
`"minutes"`, `"hours"`.
|
||||
|
||||
# Return
|
||||
- time difference in given unit
|
||||
- `Integer`: The time difference converted to the specified unit.
|
||||
|
||||
# Example
|
||||
# Notes
|
||||
- The function computes `stoptime - starttime` and converts the result to the
|
||||
requested unit using integer division.
|
||||
- Errors with `ArgumentError` if an invalid unit is specified.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using Revise
|
||||
julia> using GeneralUtils, Dates
|
||||
julia> a = Dates.now()
|
||||
julia> b = a + Dates.Day(5) # add 5 days
|
||||
julia> GeneralUtils.timedifference(a, b, "hours")
|
||||
julia> b = a + Dates.Day(5)
|
||||
julia> timedifference(a, b, "hours")
|
||||
120
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function timedifference(starttime::DateTime, stoptime::DateTime, unit::String)::Integer
|
||||
diff = stoptime - starttime
|
||||
@@ -184,21 +187,27 @@ end
|
||||
|
||||
|
||||
|
||||
""" Get uuid4 with snake case
|
||||
|
||||
# Return
|
||||
- `uuid4::String`
|
||||
uuid4 with snake case
|
||||
""" Generates a UUID4 (version 4) identifier and converts it to snake case by
|
||||
replacing hyphens with underscores.
|
||||
|
||||
# Example
|
||||
# Arguments
|
||||
- This function takes no arguments.
|
||||
|
||||
# Return
|
||||
- `String`: A UUID4 string with underscores instead of hyphens (e.g.,
|
||||
`"0f6e4f_568c_4df4_8c79_1d7a58072f4a"`).
|
||||
|
||||
# Notes
|
||||
- Uses the `uuid4()` function from the UUIDs standard library to generate a
|
||||
random UUID.
|
||||
- The underscore character replaces all hyphens in the UUID string.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using Revise
|
||||
julia> using GeneralUtils
|
||||
julia> GeneralUtils.uuid4snakecase()
|
||||
julia> uuid4snakecase()
|
||||
"0f6e4f_568c_4df4_8c79_1d7a58072f4a"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function uuid4snakecase()::String
|
||||
_id = string(uuid4())
|
||||
@@ -207,32 +216,37 @@ function uuid4snakecase()::String
|
||||
end
|
||||
|
||||
|
||||
""" Replace a dictionary key with the new key
|
||||
""" Replaces keys in a dictionary according to a mapping, returning a new
|
||||
dictionary with updated keys while preserving the original values.
|
||||
|
||||
# Arguments
|
||||
- `d::Dict`
|
||||
The input dictionary that you want to modify
|
||||
- `replacementMap::Dict`
|
||||
A dictionary that maps old keys to new keys
|
||||
- `d::Dict`
|
||||
The input dictionary to modify.
|
||||
- `replacementMap::Dict`
|
||||
A dictionary mapping old keys to new keys. Keys not present in this map are
|
||||
left unchanged.
|
||||
|
||||
# Return
|
||||
- `newDict::Dict`
|
||||
new dictionary with the replaced keys
|
||||
- `Dict`: A new dictionary with replaced keys. Values are preserved from the
|
||||
original dictionary.
|
||||
|
||||
# Example
|
||||
# Notes
|
||||
- The function creates a new dictionary rather than modifying the input in
|
||||
place.
|
||||
- Keys not found in `replacementMap` are copied to the result with their
|
||||
original keys unchanged.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using Revise
|
||||
julia> using GeneralUtils
|
||||
julia> d = Dict(:a => 1, :b => 2, :c => 3)
|
||||
julia> replacement_map = Dict(:a => :x, :b => :y)
|
||||
julia> new_dict = GeneralUtils.replaceDictKeys(d, replacement_map)
|
||||
julia> replaceDictKeys(d, replacement_map)
|
||||
Dict{Any, Any} with 3 entries:
|
||||
:y => 2
|
||||
:c => 3
|
||||
:x => 1
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function replaceDictKeys(d::Dict, replacementMap::Dict)::Dict
|
||||
newDict = Dict()
|
||||
@@ -294,36 +308,43 @@ end
|
||||
|
||||
|
||||
|
||||
""" Execute a function with timer.
|
||||
""" Executes a function with a timeout mechanism. If the function does not
|
||||
complete within the specified time, it is interrupted and a timeout message
|
||||
is returned.
|
||||
|
||||
# Arguments
|
||||
- `f::Function`
|
||||
a function to run
|
||||
- `timeoutwindow::Integer``
|
||||
timeout in seconds
|
||||
- `f::Function`
|
||||
The function to execute.
|
||||
- `timeoutwindow::Integer`
|
||||
The timeout duration in seconds.
|
||||
|
||||
# Keyword Argument
|
||||
- `fargs`
|
||||
arguments for the function
|
||||
- `timeoutmsg::String`
|
||||
time out message
|
||||
# Keyword Arguments
|
||||
- `fargs`
|
||||
Arguments to pass to the function `f`. If `nothing`, the function is called
|
||||
without arguments.
|
||||
- `timeoutmsg::String`
|
||||
The message to return if the function times out. Defaults to `"task timed out"`.
|
||||
|
||||
# Return
|
||||
- task result otherwise timeout message
|
||||
- The result of the function if it completes within the timeout, otherwise the
|
||||
`timeoutmsg` string.
|
||||
|
||||
# Example
|
||||
```jldoctest
|
||||
# Notes
|
||||
- Uses Julia's `@task`, `schedule`, and `Timer` to implement non-blocking
|
||||
execution with interruption via `Base.throwto`.
|
||||
- Errors with `InterruptException` if the function exceeds the timeout.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> function testfunc(x)
|
||||
sleep(x)
|
||||
return "task done"
|
||||
end
|
||||
sleep(x)
|
||||
return "task done"
|
||||
end
|
||||
julia> result = timeout(testfunc, 10; fargs=20)
|
||||
"task timed out"
|
||||
julia> result = timeout(testfunc, 20; fargs=10)
|
||||
"task done"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function timeout(f::Function, timeoutwindow::Integer; fargs=nothing, timeoutmsg="task timed out")
|
||||
tsk = @task f(fargs)
|
||||
@@ -340,23 +361,26 @@ end
|
||||
|
||||
|
||||
|
||||
""" Convert a dataframe into CSV.
|
||||
""" Converts a DataFrame to a CSV string representation using the CSV.jl package.
|
||||
|
||||
# Arguments
|
||||
- `df::DataFrame`
|
||||
A connection object to Postgres database
|
||||
|
||||
# Return
|
||||
- `result::String`
|
||||
- `df::DataFrame`
|
||||
The DataFrame to convert to CSV format.
|
||||
|
||||
# Example
|
||||
# Return
|
||||
- `String`: The DataFrame contents as a CSV-formatted string.
|
||||
|
||||
# Notes
|
||||
- Uses `CSV.write` with an `IOBuffer` to capture the output as a string.
|
||||
- The returned string contains the full CSV representation including headers.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using DataFrames, GeneralUtils
|
||||
julia> df = DataFrame(A=1:3, B=5:7, fixed=1)
|
||||
julia> result = GeneralUtils.dataframeToCSV(df)
|
||||
julia> dataframeToCSV(df)
|
||||
"1,5,1\n2,6,1\n3,7,1\n"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function dataframeToCSV(df::DataFrame)
|
||||
# Create an IOBuffer to capture the output
|
||||
@@ -426,8 +450,6 @@ end
|
||||
3 => [Dict("a"=>7), Dict("a"=>8), Dict("a"=>9)]
|
||||
4 => [Dict("a"=>10)]
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function disintegrate_vectorDict(data::Vector, partsize::Integer
|
||||
)
|
||||
@@ -473,8 +495,6 @@ end
|
||||
julia> getDataFrameValue(df[1, :], :name)
|
||||
"Alice"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
getDataFrameValue(row::DataFrameRow, key::Symbol) = row.:($key)
|
||||
|
||||
@@ -543,8 +563,6 @@ end
|
||||
julia> dfToString(df)
|
||||
"1) name: Alice, age: 25\n2) name: Bob, age: 30"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function dfToString(df::DataFrame)
|
||||
dfstr = ""
|
||||
@@ -583,8 +601,6 @@ end
|
||||
"{\"name\":\"Alice\",\"age\":25}"
|
||||
"{\"name\":\"Bob\",\"age\":30}"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function dataframe_to_json_list(df::DataFrame)::Vector{String}
|
||||
json_list = []
|
||||
@@ -618,8 +634,6 @@ end
|
||||
julia> dict_to_string(od)
|
||||
"1) name: Alice, 2) age: 25"
|
||||
```
|
||||
|
||||
# Signature
|
||||
"""
|
||||
function dictToString(od::T) where {T<:AbstractDict}
|
||||
items = []
|
||||
@@ -733,27 +747,39 @@ end
|
||||
|
||||
|
||||
|
||||
"""
|
||||
remove_french_accents(text::String) -> String
|
||||
""" Remove French accents from the given text.
|
||||
|
||||
Remove French accents from the given text.
|
||||
The function replaces accented French characters with their non-accented
|
||||
counterparts using a dictionary mapping. Supported accented characters
|
||||
include: à, â, ä, á, é, è, ê, ë, î, ï, í, ñ, ô, ö, ò, ó, ù, û, ü, ÿ, ç,
|
||||
and their uppercase variants. The apostrophe character `’` is removed
|
||||
completely.
|
||||
|
||||
# Arguments
|
||||
- `text::String` The input string containing French accents.
|
||||
- `text::AbstractString`
|
||||
The input string containing French accented characters.
|
||||
|
||||
# Returns
|
||||
- `String` The input string with all French accents removed.
|
||||
# Return
|
||||
- `AbstractString`: A new string with all French accents replaced by their
|
||||
non-accented equivalents.
|
||||
|
||||
# Notes
|
||||
- The function creates a character list and replaces each accented character
|
||||
according to an internal dictionary mapping.
|
||||
- Does **not** mutate the input; it allocates a new string.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> remove_french_accents("Café")
|
||||
"Cafe"
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> remove_french_accents("Café")
|
||||
"Cafe"
|
||||
|
||||
julia> remove_french_accents("L'été est beau.")
|
||||
"L'ete est beau."
|
||||
```
|
||||
julia> remove_french_accents("L'été est beau.")
|
||||
"L'ete est beau."
|
||||
|
||||
# Signature
|
||||
julia> remove_french_accents("Noël, naïve, François")
|
||||
"Noel, naive, Francois"
|
||||
```
|
||||
"""
|
||||
function remove_french_accents(text::AbstractString)::AbstractString
|
||||
textcharlist = [i for i in text]
|
||||
@@ -1113,9 +1139,38 @@ function nonRecentElementsIndex(vectorlength::Integer, n::Integer)
|
||||
return 1:(vectorlength-n)
|
||||
end
|
||||
|
||||
""" Remove specified substrings from text.
|
||||
|
||||
Removes all occurrences of each string in `removelist` from the input text
|
||||
by repeatedly replacing them with empty strings until none remain.
|
||||
|
||||
# Arguments
|
||||
- `text::String`
|
||||
The input string to modify.
|
||||
- `removelist::Vector{String}`
|
||||
A vector of substrings to remove from the text.
|
||||
|
||||
# Return
|
||||
- `String`: The text with all specified substrings removed.
|
||||
|
||||
# Examples
|
||||
```jldoctest
|
||||
julia> using GeneralUtils
|
||||
julia> removestring("hello world", ["l", " "])
|
||||
"heoword"
|
||||
julia> removestring("foo bar baz", ["bar", " "])
|
||||
"foobaz"
|
||||
```
|
||||
"""
|
||||
function removestring(text::String, removelist::Vector{String})::String
|
||||
for i in removelist
|
||||
while occursin(i, text)
|
||||
text = replace(text, i => "")
|
||||
end
|
||||
end
|
||||
|
||||
return string(text)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user