Repository: alvinwan/timefhuman

Issue:
Handle empty string
```
>>> timefhuman('')
File "/usr/local/Caskroom/miniconda/base/envs/epicdumplings/lib/python3.11/site-packages/timefhuman/main.py", line 34, in timefhuman
    tree = parser.parse(string)
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Caskroom/miniconda/base/envs/epicdumplings/lib/python3.11/site-packages/lark/lark.py", line 655, in parse
    return self.parser.parse(text, start=start, on_error=on_error)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Caskroom/miniconda/base/envs/epicdumplings/lib/python3.11/site-packages/lark/parser_frontends.py", line 104, in parse
    return self.parser.parse(stream, chosen_start, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/Caskroom/miniconda/base/envs/epicdumplings/lib/python3.11/site-packages/lark/parsers/earley.py", line 288, in parse
    raise UnexpectedEOF(expected_terminals, state=frozenset(i.s for i in to_scan))
lark.exceptions.UnexpectedEOF: Unexpected end-of-input. Expected one of:
	* __ANON_4
	* IN
	* IN
	* IN
	* IN
	* FOR
	* FOR
	* FOR
	* FOR
	* INT
	* INT
	* DATETIMENAME
	* WEEKDAY
	* __ANON_2
	* __ANON_3
	* DATENAME
	* MONTHNAME
	* __ANON_1
	* POSITION
	* INT
	* TIMENAME
	* FLOAT_NUMBER
	* INT
	* MODIFIER
	* DURATION_NUMBER
```

Hints from issue comments:

Solution patch:
diff --git a/timefhuman/main.py b/timefhuman/main.py
index cae4df4..ffe632c 100644
--- a/timefhuman/main.py
+++ b/timefhuman/main.py
@@ -30,6 +30,10 @@ def get_parser():
 
 
 def timefhuman(string, config: tfhConfig = DEFAULT_CONFIG, raw: bool=False, now: bool=False):
+    if not string.strip():
+        assert not raw, "Empty string not allowed when raw=True"
+        return []
+
     parser = get_parser()
     tree = parser.parse(string)
 


Test patch:
diff --git a/tests/test_e2e.py b/tests/test_e2e.py
index b42dbb2..d827435 100644
--- a/tests/test_e2e.py
+++ b/tests/test_e2e.py
@@ -73,6 +73,9 @@ def test_default(now, test_input, expected):
 
 
 @pytest.mark.parametrize("test_input, expected", [
+    # empty
+    ('', []),
+    
     # time only
     ('5p', [datetime.time(hour=17, minute=0)]),
     ("3 o'clock pm", [datetime.time(hour=15, minute=0)]), # fixes gh#12