# -*- coding: utf-8 -*-
#
# Copyright 2013 Will Barton. 
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without 
# modification, are permitted provided that the following conditions
# are met:
# 
#   1. Redistributions of source code must retain the above copyright 
#      notice, this list of conditions and the following disclaimer.
#   2. Redistributions in binary form must reproduce the above copyright 
#      notice, this list of conditions and the following disclaimer in the 
#      documentation and/or other materials provided with the distribution.
#   3. The name of the author may not be used to endorse or promote products
#      derived from this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
# THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

def create_graph(storage_cls, *storage_args, **storage_kwargs):
    from percival.graph import Graph
    class StoredGraph(Graph, storage_cls):
        def __init__(self, *args, **kwargs):
            storage_cls.__init__(self, *storage_args, **storage_kwargs)
            Graph.__init__(self, *args, **kwargs)
    return StoredGraph

def create_digraph(storage_cls, *storage_args, **storage_kwargs):
    from percival.digraph import DiGraph
    class StoredDiGraph(DiGraph, storage_cls):
        def __init__(self, *args, **kwargs):
            storage_cls.__init__(self, *storage_args, **storage_kwargs)
            DiGraph.__init__(self, *args, **kwargs)
    return StoredDiGraph

def create_nx_graph(storage_cls, *storage_args, **storage_kwargs):
    from percival.nx.graph import Graph
    class StoredGraph(Graph, storage_cls):
        def __init__(self, *args, **kwargs):
            storage_cls.__init__(self, *storage_args, **storage_kwargs)
            Graph.__init__(self, *args, **kwargs)
    return StoredGraph

def create_nx_digraph(storage_cls, *storage_args, **storage_kwargs):
    from percival.nx.digraph import DiGraph
    class StoredDiGraph(DiGraph, storage_cls):
        def __init__(self, *args, **kwargs):
            storage_cls.__init__(self, *storage_args, **storage_kwargs)
            DiGraph.__init__(self, *args, **kwargs)
    return StoredDiGraph

