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)
 |