38 lines
		
	
	
	
		
			698 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
	
		
			698 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| import json
 | |
| from functools import total_ordering
 | |
| 
 | |
| from bundlewrap.metadata import MetadataJSONEncoder
 | |
| 
 | |
| 
 | |
| @total_ordering
 | |
| class Hashable():
 | |
|     def _json(self):
 | |
|         return json.dumps(
 | |
|             self,
 | |
|             sort_keys=True,
 | |
|             cls=MetadataJSONEncoder,
 | |
|         )
 | |
| 
 | |
|     def __lt__(self, other):
 | |
|         return self._json() < other._json()
 | |
| 
 | |
|     def __eq__(self, other):
 | |
|         return self._json() == other._json()
 | |
| 
 | |
|     def __hash__(self):
 | |
|         return hash(self._json())
 | |
| 
 | |
| 
 | |
| class HashableDict(Hashable, dict):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class HashableSet(Hashable, set):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| def hashable(object):
 | |
|     return {
 | |
|         dict: HashableDict,
 | |
|         set: HashableSet,
 | |
|     }[type(object)](object)
 | 
