diff --git a/pykusto/functions.py b/pykusto/functions.py
index bae1253..bbf711b 100644
--- a/pykusto/functions.py
+++ b/pykusto/functions.py
@@ -1,4 +1,5 @@
 import json
+from itertools import chain
 from typing import Union
 
 from pykusto.expressions import AnyTypeColumn, NumberType, NumberExpression, TimespanType, \
@@ -32,11 +33,6 @@ class Functions:
         """
         return TimespanExpression.ago(expr)
 
-    # def array_concat(): return
-    #
-    #
-    # def array_iif(): return
-
     @staticmethod
     def array_length(expr: ArrayType) -> NumberExpression:
         """
@@ -710,14 +706,102 @@ class Functions:
     # def series_subtract(self): return
     #
     #
-    # def set_difference(self): return
-    #
-    #
     # def set_intersect(self): return
     #
     #
     # def set_union(self): return
 
+    @staticmethod
+    def set_has_element(array: ArrayType, value: ExpressionType) -> BooleanExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/sethaselementfunction
+        """
+        return BooleanExpression(KQL(f'set_has_element({to_kql(array)}, {to_kql(value)})'))
+
+    @staticmethod
+    def set_difference(array1: ArrayType, array2: ArrayType, *more_arrays: ArrayType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/setdifferencefunction
+        """
+        return ArrayExpression(KQL(f'set_difference({to_kql(array1)}, {", ".join(to_kql(a) for a in chain([array2], more_arrays))})'))
+
+    @staticmethod
+    def set_intersect(array1: ArrayType, array2: ArrayType, *more_arrays: ArrayType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/setintersectfunction
+        """
+        return ArrayExpression(KQL(f'set_intersect({to_kql(array1)}, {", ".join(to_kql(a) for a in chain([array2], more_arrays))})'))
+
+    @staticmethod
+    def set_union(array1: ArrayType, array2: ArrayType, *more_arrays: ArrayType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/setunionfunction
+        """
+        return ArrayExpression(KQL(f'set_union({to_kql(array1)}, {", ".join(to_kql(a) for a in chain([array2], more_arrays))})'))
+
+    @staticmethod
+    def array_concat(array1: ArrayType, array2: ArrayType, *more_arrays: ArrayType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/arrayconcatfunction
+        """
+        return ArrayExpression(KQL(f'array_concat({to_kql(array1)}, {", ".join(to_kql(a) for a in chain([array2], more_arrays))})'))
+
+    @staticmethod
+    def array_iif(condition_array: ArrayType, if_true: ArrayType, if_false: ArrayType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/arrayifffunction
+        """
+        return ArrayExpression(KQL(f'array_iif({to_kql(condition_array)}, {to_kql(if_true)}, {to_kql(if_false)})'))
+
+    @staticmethod
+    def array_index_of(array: ArrayType, value: ExpressionType) -> NumberExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/arrayindexoffunction
+        """
+        return NumberExpression(KQL(f'array_index_of({to_kql(array)}, {to_kql(value)})'))
+
+    @staticmethod
+    def array_rotate_left(array: ArrayType, rotate_count: NumberType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/array_rotate_leftfunction
+        """
+        return ArrayExpression(KQL(f'array_rotate_left({to_kql(array)}, {to_kql(rotate_count)})'))
+
+    @staticmethod
+    def array_rotate_right(array: ArrayType, rotate_count: NumberType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/array_rotate_rightfunction
+        """
+        return ArrayExpression(KQL(f'array_rotate_right({to_kql(array)}, {to_kql(rotate_count)})'))
+
+    @staticmethod
+    def array_shift_left(array: ArrayType, shift_count: NumberType, fill_value: ExpressionType = None) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/array_shift_leftfunction
+        """
+        return ArrayExpression(KQL(f'array_shift_left({to_kql(array)}, {to_kql(shift_count)}{"" if fill_value is None else ", " + to_kql(fill_value)})'))
+
+    @staticmethod
+    def array_shift_right(array: ArrayType, shift_count: NumberType, fill_value: ExpressionType = None) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/array_shift_rightfunction
+        """
+        return ArrayExpression(KQL(f'array_shift_right({to_kql(array)}, {to_kql(shift_count)}{"" if fill_value is None else ", " + to_kql(fill_value)})'))
+
+    @staticmethod
+    def array_slice(array: ArrayType, start: NumberType, end: NumberType) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/arrayslicefunction
+        """
+        return ArrayExpression(KQL(f'array_slice({to_kql(array)}, {to_kql(start)}, {to_kql(end)})'))
+
+    @staticmethod
+    def array_split(array: ArrayType, indices: Union[NumberType, ArrayType]) -> ArrayExpression:
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/arraysplitfunction
+        """
+        return ArrayExpression(KQL(f'array_split({to_kql(array)}, {to_kql(indices)})'))
+
     @staticmethod
     def sign(expr: NumberType) -> NumberExpression:
         """

add set_difference function
and while at it, more array operations...
diff --git a/test/test_functions.py b/test/test_functions.py
index 2d53aa8..8b3edaa 100644
--- a/test/test_functions.py
+++ b/test/test_functions.py
@@ -827,3 +827,81 @@ class TestFunction(TestBase):
             ' | extend foo = pack_array(numField, stringField)',
             Query().extend(foo=f.pack_array(t.numField, t.stringField)).render()
         )
+
+    def test_set_has_element(self):
+        self.assertEqual(
+            ' | extend foo = set_has_element(arrayField, numField)',
+            Query().extend(foo=f.set_has_element(t.arrayField, t.numField)).render()
+        )
+
+    def test_set_difference(self):
+        self.assertEqual(
+            ' | extend foo = set_difference(arrayField, arrayField2)',
+            Query().extend(foo=f.set_difference(t.arrayField, t.arrayField2)).render()
+        )
+
+    def test_set_intersect(self):
+        self.assertEqual(
+            ' | extend foo = set_intersect(arrayField, arrayField2)',
+            Query().extend(foo=f.set_intersect(t.arrayField, t.arrayField2)).render()
+        )
+
+    def test_set_union(self):
+        self.assertEqual(
+            ' | extend foo = set_union(arrayField, arrayField2)',
+            Query().extend(foo=f.set_union(t.arrayField, t.arrayField2)).render()
+        )
+
+    def test_array_concat(self):
+        self.assertEqual(
+            ' | extend foo = array_concat(arrayField, arrayField2)',
+            Query().extend(foo=f.array_concat(t.arrayField, t.arrayField2)).render()
+        )
+
+    def test_array_iif(self):
+        self.assertEqual(
+            ' | extend foo = array_iif(arrayField, arrayField2, arrayField3)',
+            Query().extend(foo=f.array_iif(t.arrayField, t.arrayField2, t.arrayField3)).render()
+        )
+
+    def test_array_index_of(self):
+        self.assertEqual(
+            ' | extend foo = array_index_of(arrayField, numField)',
+            Query().extend(foo=f.array_index_of(t.arrayField, t.numField)).render()
+        )
+
+    def test_array_rotate_left(self):
+        self.assertEqual(
+            ' | extend foo = array_rotate_left(arrayField, numField)',
+            Query().extend(foo=f.array_rotate_left(t.arrayField, t.numField)).render()
+        )
+
+    def test_array_rotate_right(self):
+        self.assertEqual(
+            ' | extend foo = array_rotate_right(arrayField, numField)',
+            Query().extend(foo=f.array_rotate_right(t.arrayField, t.numField)).render()
+        )
+
+    def test_array_shift_left(self):
+        self.assertEqual(
+            ' | extend foo = array_shift_left(arrayField, numField)',
+            Query().extend(foo=f.array_shift_left(t.arrayField, t.numField)).render()
+        )
+
+    def test_array_shift_right(self):
+        self.assertEqual(
+            ' | extend foo = array_shift_right(arrayField, numField, numField2)',
+            Query().extend(foo=f.array_shift_right(t.arrayField, t.numField, t.numField2)).render()
+        )
+
+    def test_array_slice(self):
+        self.assertEqual(
+            ' | extend foo = array_slice(arrayField, numField, numField2)',
+            Query().extend(foo=f.array_slice(t.arrayField, t.numField, t.numField2)).render()
+        )
+
+    def test_array_split(self):
+        self.assertEqual(
+            ' | extend foo = array_split(arrayField, numField)',
+            Query().extend(foo=f.array_split(t.arrayField, t.numField)).render()
+        )

pip install -e .
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
adal==1.2.7
attrs @ file:///croot/attrs_1668696182826/work
azure-core==1.30.1
azure-kusto-data==0.0.44
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi==1.15.1
charset-normalizer==3.4.1
cryptography==44.0.2
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
isodate==0.7.2
msrest==0.7.1
msrestazure==0.6.4.post1
numpy==1.21.6
oauthlib==3.2.2
packaging @ file:///croot/packaging_1671697413597/work
pandas==1.0.3
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycparser==2.21
PyJWT==2.8.0
-e git+https://github.com/Azure/pykusto.git@0930c481041f5165e870094d2716d9ebeb671c41#egg=pykusto
pytest==7.1.2
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.31.0
requests-oauthlib==2.0.0
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions==4.7.1
urllib3==2.0.7
zipp @ file:///croot/zipp_1672387121353/work

name: pykusto
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - adal==1.2.7
      - azure-core==1.30.1
      - azure-kusto-data==0.0.44
      - cffi==1.15.1
      - charset-normalizer==3.4.1
      - cryptography==44.0.2
      - idna==3.10
      - isodate==0.7.2
      - msrest==0.7.1
      - msrestazure==0.6.4.post1
      - numpy==1.21.6
      - oauthlib==3.2.2
      - pandas==1.0.3
      - pycparser==2.21
      - pyjwt==2.8.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.31.0
      - requests-oauthlib==2.0.0
      - six==1.17.0
      - typing-extensions==4.7.1
      - urllib3==2.0.7
prefix: /opt/conda/envs/pykusto

test/test_functions.py::TestFunction::test_array_concat test/test_functions.py::TestFunction::test_array_iif test/test_functions.py::TestFunction::test_array_index_of test/test_functions.py::TestFunction::test_array_rotate_left test/test_functions.py::TestFunction::test_array_rotate_right test/test_functions.py::TestFunction::test_array_shift_left test/test_functions.py::TestFunction::test_array_shift_right test/test_functions.py::TestFunction::test_array_slice test/test_functions.py::TestFunction::test_array_split test/test_functions.py::TestFunction::test_set_difference test/test_functions.py::TestFunction::test_set_has_element test/test_functions.py::TestFunction::test_set_intersect test/test_functions.py::TestFunction::test_set_union
test/test_functions.py::TestFunction::test_acos test/test_functions.py::TestFunction::test_aggregation_assign_to test/test_functions.py::TestFunction::test_aggregation_assign_to_multiple test/test_functions.py::TestFunction::test_aggregation_by_assign_to test/test_functions.py::TestFunction::test_ago test/test_functions.py::TestFunction::test_any test/test_functions.py::TestFunction::test_arg_max test/test_functions.py::TestFunction::test_arg_min test/test_functions.py::TestFunction::test_array_length test/test_functions.py::TestFunction::test_avg test/test_functions.py::TestFunction::test_avgif test/test_functions.py::TestFunction::test_bag_keys test/test_functions.py::TestFunction::test_bin test/test_functions.py::TestFunction::test_bin_at test/test_functions.py::TestFunction::test_bin_auto test/test_functions.py::TestFunction::test_case test/test_functions.py::TestFunction::test_ceiling test/test_functions.py::TestFunction::test_cos test/test_functions.py::TestFunction::test_count test/test_functions.py::TestFunction::test_countif test/test_functions.py::TestFunction::test_dcount test/test_functions.py::TestFunction::test_dcountif test/test_functions.py::TestFunction::test_endofday test/test_functions.py::TestFunction::test_endofmonth test/test_functions.py::TestFunction::test_endofweek test/test_functions.py::TestFunction::test_endofyear test/test_functions.py::TestFunction::test_exp test/test_functions.py::TestFunction::test_exp10 test/test_functions.py::TestFunction::test_exp2 test/test_functions.py::TestFunction::test_floor test/test_functions.py::TestFunction::test_format_datetime test/test_functions.py::TestFunction::test_format_timespan test/test_functions.py::TestFunction::test_getmonth test/test_functions.py::TestFunction::test_gettype test/test_functions.py::TestFunction::test_getyear test/test_functions.py::TestFunction::test_hash test/test_functions.py::TestFunction::test_hash_sha256 test/test_functions.py::TestFunction::test_hourofday test/test_functions.py::TestFunction::test_iff test/test_functions.py::TestFunction::test_iff_ambiguous_type test/test_functions.py::TestFunction::test_iff_different_types test/test_functions.py::TestFunction::test_iff_expression_return_type test/test_functions.py::TestFunction::test_iff_related_types test/test_functions.py::TestFunction::test_iif test/test_functions.py::TestFunction::test_isempty test/test_functions.py::TestFunction::test_isfinite test/test_functions.py::TestFunction::test_isinf test/test_functions.py::TestFunction::test_isnan test/test_functions.py::TestFunction::test_isnotempty test/test_functions.py::TestFunction::test_isnotnull test/test_functions.py::TestFunction::test_isnull test/test_functions.py::TestFunction::test_isutf8 test/test_functions.py::TestFunction::test_log test/test_functions.py::TestFunction::test_log10 test/test_functions.py::TestFunction::test_log2 test/test_functions.py::TestFunction::test_loggamma test/test_functions.py::TestFunction::test_make_bag test/test_functions.py::TestFunction::test_make_datetime test/test_functions.py::TestFunction::test_make_list test/test_functions.py::TestFunction::test_make_set test/test_functions.py::TestFunction::test_max test/test_functions.py::TestFunction::test_max_if test/test_functions.py::TestFunction::test_min test/test_functions.py::TestFunction::test_min_if test/test_functions.py::TestFunction::test_nesting test/test_functions.py::TestFunction::test_now test/test_functions.py::TestFunction::test_pack test/test_functions.py::TestFunction::test_pack_array test/test_functions.py::TestFunction::test_parse_json_array test/test_functions.py::TestFunction::test_parse_json_brackets test/test_functions.py::TestFunction::test_parse_json_dot test/test_functions.py::TestFunction::test_parse_json_nesting test/test_functions.py::TestFunction::test_parse_json_number_expression test/test_functions.py::TestFunction::test_parse_json_to_string test/test_functions.py::TestFunction::test_percentile test/test_functions.py::TestFunction::test_percentiles test/test_functions.py::TestFunction::test_pow test/test_functions.py::TestFunction::test_round test/test_functions.py::TestFunction::test_sign test/test_functions.py::TestFunction::test_split test/test_functions.py::TestFunction::test_sqrt test/test_functions.py::TestFunction::test_startofday test/test_functions.py::TestFunction::test_startofmonth test/test_functions.py::TestFunction::test_startofweek test/test_functions.py::TestFunction::test_startofyear test/test_functions.py::TestFunction::test_stdev test/test_functions.py::TestFunction::test_stdevif test/test_functions.py::TestFunction::test_stdevp test/test_functions.py::TestFunction::test_strcat test/test_functions.py::TestFunction::test_strcat_array test/test_functions.py::TestFunction::test_strcat_delim test/test_functions.py::TestFunction::test_strcat_one_argument test/test_functions.py::TestFunction::test_strcmp test/test_functions.py::TestFunction::test_string_size test/test_functions.py::TestFunction::test_strlen test/test_functions.py::TestFunction::test_strrep test/test_functions.py::TestFunction::test_substring test/test_functions.py::TestFunction::test_sum test/test_functions.py::TestFunction::test_sumif test/test_functions.py::TestFunction::test_tobool test/test_functions.py::TestFunction::test_todatetime test/test_functions.py::TestFunction::test_todecimal test/test_functions.py::TestFunction::test_todouble test/test_functions.py::TestFunction::test_tohex test/test_functions.py::TestFunction::test_toint test/test_functions.py::TestFunction::test_tolong test/test_functions.py::TestFunction::test_tolower test/test_functions.py::TestFunction::test_toreal test/test_functions.py::TestFunction::test_toupper test/test_functions.py::TestFunction::test_variance test/test_functions.py::TestFunction::test_varianceif test/test_functions.py::TestFunction::test_variancep
pykusto/functions.py
pykusto/functions.py