|
| 1 | +import contextlib |
1 | 2 | import functools
|
2 | 3 | import importlib
|
3 | 4 | import itertools
|
@@ -755,6 +756,37 @@ def set_current_ns(ns_name: str,
|
755 | 756 | return ns_var
|
756 | 757 |
|
757 | 758 |
|
| 759 | +@contextlib.contextmanager |
| 760 | +def ns_bindings(ns_name: str, |
| 761 | + module: types.ModuleType = None, |
| 762 | + ns_var_name: str = _NS_VAR_NAME, |
| 763 | + ns_var_ns: str = _NS_VAR_NS): |
| 764 | + """Context manager for temporarily changing the value of basilisp.core/*ns*.""" |
| 765 | + symbol = sym.Symbol(ns_name) |
| 766 | + ns = Namespace.get_or_create(symbol, module=module) |
| 767 | + ns_var = Maybe(Var.find(sym.Symbol(ns_var_name, ns=ns_var_ns))) \ |
| 768 | + .or_else_raise(lambda: RuntimeException(f"Dynamic Var {sym.Symbol(ns_var_name, ns=ns_var_ns)} not bound!")) |
| 769 | + |
| 770 | + try: |
| 771 | + ns_var.push_bindings(ns) |
| 772 | + yield ns_var.value |
| 773 | + finally: |
| 774 | + ns_var.pop_bindings() |
| 775 | + |
| 776 | + |
| 777 | +@contextlib.contextmanager |
| 778 | +def remove_ns_bindings(ns_var_name: str = _NS_VAR_NAME, |
| 779 | + ns_var_ns: str = _NS_VAR_NS): |
| 780 | + """Context manager to pop the most recent bindings for basilisp.core/*ns* after |
| 781 | + completion of the code under management.""" |
| 782 | + ns_var = Maybe(Var.find(sym.Symbol(ns_var_name, ns=ns_var_ns))) \ |
| 783 | + .or_else_raise(lambda: RuntimeException(f"Dynamic Var {sym.Symbol(ns_var_name, ns=ns_var_ns)} not bound!")) |
| 784 | + try: |
| 785 | + yield |
| 786 | + finally: |
| 787 | + ns_var.pop_bindings() |
| 788 | + |
| 789 | + |
758 | 790 | def get_current_ns(ns_var_name: str = _NS_VAR_NAME,
|
759 | 791 | ns_var_ns: str = _NS_VAR_NS) -> Namespace:
|
760 | 792 | """Get the value of the dynamic variable `*ns*` in the current thread."""
|
|
0 commit comments