module Sound.DF.Uniform.LL.K where
import Data.Int
import Data.Typeable
import Sound.DF.Uniform.LL.UId
data V_Id = V_Id Id deriving (Eq,Ord,Show)
data Vec a = Vec V_Id Int [a] deriving (Typeable,Eq,Ord,Show)
vec_id :: Vec t -> Id
vec_id (Vec (V_Id k) _ _) = k
vec_concise :: Vec a -> String
vec_concise (Vec (V_Id k) n _) = concat ["vec(",show k,",",show n,")"]
data K = N ()
| B Bool
| I Int32
| F Float
| V (Vec Float)
deriving(Eq)
k_typeOf :: K -> TypeRep
k_typeOf k =
case k of
N () -> nil_t
B _ -> bool_t
I _ -> int32_t
F _ -> float_t
V _ -> vec_float_t
deriving instance Typeable K
k_concise :: K -> String
k_concise k =
case k of
N () -> "()"
B b -> show b
I i -> show i
F f -> show f
V v -> vec_concise v
instance Show K where show = k_concise
nil_t :: TypeRep
nil_t = typeOf ()
bool_t :: TypeRep
bool_t = typeOf (undefined::Bool)
int32_t :: TypeRep
int32_t = typeOf (undefined::Int32)
float_t :: TypeRep
float_t = typeOf (undefined::Float)
vec_float_t :: TypeRep
vec_float_t = typeOf (undefined::Vec Float)
class (Typeable a,Eq a,Ord a,Show a) => K' a where
to_k :: a -> K
instance K' () where to_k () = N ()
instance K' Bool where to_k b = B b
instance K' Int32 where to_k i = I i
instance K' Float where to_k f = F f
instance K' (Vec Float) where to_k v = V v
class (K' a,Ord a) => K_Ord a where
instance K_Ord Bool
instance K_Ord Int32
instance K_Ord Float
class (K_Ord a,Num a) => K_Num a where
instance K_Num Int32
instance K_Num Float