tiny abstract data type on python
Project description
how to use
## create Type
>>> from miniadt import ADTTypeProvider
>>> TreeType = ADTTypeProvider("Tree")
>>> Node = TreeType("Node", "e children")
>>> Leaf = TreeType("Leaf", "e")
## printing value
>>> Leaf(e=10)
Leaf(e=10)
>>> Node(e=10, children=[Leaf(e=20)])
Node(e=10, children=[Leaf(e=20)])
## use pattern match
>>> @TreeType.match
... class depth(object):
... def Node(e, children):
... return max(depth(e)for e in children) + 1
...
... def Leaf(e):
... return 1
>>> depth(Leaf(e=10))
1
>>> depth(Node(e=10, children=[Leaf(e=20), Node(e=30, children=[Leaf(e=40)])]))
3
miniadt has comprehensive check function.
## not comprehensive definition on pattern matching function error is occur
### 1. lack of dispatch andidates
>>> class invalid_dispatch(object):
... def Node(e, children):
... return "foo"
>>> TreeType.match(invalid_dispatch)
Traceback (most recent call last):
...
miniadt.NotComprehensive: Leaf is not found. expected=['Node', 'Leaf']
### 2. dispatch function's arguments are invalid.
>>> class invalid_dispatch2(object):
... def Node(e): ## correct argsspec is "e, children"
... return "foo"
... def Leaf(e):
... return "foo"
>>> TreeType.match(invalid_dispatch2)
Traceback (most recent call last):
...
miniadt.NotComprehensive: on Tree.Node: expected=['e', 'children'] != actual=['e']
similar functions
match
match_instance
classify
from miniadt import ADTTypeProvider
Tree = ADTTypeProvider("Tree")
Node = Tree("Node", "e children")
Leaf = Tree("Leaf", "e")
print(Leaf(e=10)) # => Leaf(e=10)
print(Node(e=10, children=[Leaf(e=20)])) # => Node(e=10, children=[Leaf(e=20)])
@Tree.match
class depth(object):
def Leaf(e):
return 1
def Node(e, children):
return max(depth(e) for e in children) + 1
print(depth(Leaf(e=10))) # => 10
print(depth(Node(e=10, children=[Leaf(e=20)]))) # 2
@Tree.match_instance
class Applicator(object):
def __init__(self, name):
self.name = name
def Leaf(self, e):
return self.name
def Node(self, e, children):
return [self.name, [self(x) for x in children]]
print(Applicator("foo")(Leaf(e=10))) # => foo
print(Applicator("foo")(Node(e=10, children=[Leaf(e=20)]))) # => ['foo', ['foo']]
@Tree.classify
class ToDict(object):
def Leaf(self, leaf):
return leaf.e
def Node(self, node):
return {"e": node.e, "children": [self(e) for e in node.children]}
todict = ToDict()
print(todict(Leaf(e=10))) # => 10
print(todict(Node(e=10, children=[Leaf(e=20)]))) # => {'e': 10, 'children': [20]}
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
miniadt-0.4.0.tar.gz
(5.9 kB
view hashes)