module Data.TypeEq (

    TypeEq,
    typeEq

) where

    -- Data
    import Data.TypeLevel.Bool

    class TypeEq type1 type2 result | type1 type2 -> result where

        typeEq :: type1 -> type2 -> result

    instance TypeEq soleType soleType True where

        typeEq _ _ = true

    instance (TypeCast False result) => TypeEq type1 type2 result where

        typeEq _ _ = typeCast false

    class TypeCast type1 type2 | type1 -> type2, type2 -> type1 where

        typeCast :: type1 -> type2

    instance (TypeCastHelper () type1 type2) => TypeCast type1 type2 where

        typeCast = typeCastHelper ()

    class TypeCastHelper dummy type1 type2 | dummy type1 -> type2, dummy type2 -> type1 where

        typeCastHelper :: dummy -> type1 -> type2

    instance (TypeCastHelperHelper dummy type1 type2) => TypeCastHelper dummy type1 type2 where

        typeCastHelper = typeCastHelperHelper

    class TypeCastHelperHelper dummy type1 type2 | dummy type1 -> type2, dummy type2 -> type1 where

        typeCastHelperHelper :: dummy -> type1 -> type2

    instance TypeCastHelperHelper () soleType soleType where

        typeCastHelperHelper () value = value