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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion etuples/dispatch.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
from collections.abc import Callable, Sequence
from collections.abc import Callable, Sequence, Mapping

from multipledispatch import dispatch

from cons.core import ConsError, ConsNull, ConsPair, car, cdr, cons

from .core import etuple, ExpressionTuple

try:
from unification.core import _reify, _unify
except ModuleNotFoundError:
pass
else:

def _unify_ExpressionTuple(u, v, s):
return _unify(u._tuple, v._tuple, s)

_unify.add((ExpressionTuple, ExpressionTuple, Mapping), _unify_ExpressionTuple)

def _reify_ExpressionTuple(u, s):
return etuple(*_reify(u._tuple, s))

_reify.add((ExpressionTuple, Mapping), _reify_ExpressionTuple)


@dispatch(object)
def rator(x):
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
-e ./
unification
ipython
coveralls
pydocstyle>=3.0.0
Expand Down
3 changes: 2 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ exclude_lines =
def __repr__
raise NotImplementedError
if __name__ == .__main__.:
assert False
assert False
ModuleNotFoundError
20 changes: 19 additions & 1 deletion tests/test_dispatch.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from pytest import raises
from pytest import raises, importorskip

from operator import add
from collections.abc import Sequence
Expand Down Expand Up @@ -91,3 +91,21 @@ def test_etuplize():

assert etuplize(node_2) == etuple(op_1, etuple(op_2, 1, 2), 3)
assert etuplize(node_2, shallow=True) == etuple(op_1, node_1, 3)


def test_unification():
from cons import cons

uni = importorskip("unification")

var, unify, reify = uni.var, uni.unify, uni.reify

a_lv, b_lv = var(), var()
assert unify(etuple(add, 1, 2), etuple(add, 1, 2), {}) == {}
assert unify(etuple(add, 1, 2), etuple(a_lv, 1, 2), {}) == {a_lv: add}
assert reify(etuple(a_lv, 1, 2), {a_lv: add}) == etuple(add, 1, 2)

res = unify(etuple(add, 1, 2), cons(a_lv, b_lv), {})
assert res == {a_lv: add, b_lv: etuple(1, 2)}

assert reify(cons(a_lv, b_lv), res) == etuple(add, 1, 2)