{-# LANGUAGE NoImplicitPrelude #-}

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DefaultSignatures #-}

-- |
-- Module      : OAlg.Hom.Vectorial
-- Description : homomorphisms between vectorial structures
-- Copyright   : (c) Erich Gut
-- License     : BSD3
-- Maintainer  : zerich.gut@gmail.com
--
-- homomorphisms between 'Vectorial' structures having the same associated 'Scalar'.
module OAlg.Hom.Vectorial
  (
    -- * Vectorial
    HomVectorial
  )
  where

import Data.Typeable

import OAlg.Prelude

import OAlg.Category.Path

import OAlg.Structure.Vectorial

import OAlg.Hom.Definition
import OAlg.Hom.Oriented.Definition
import OAlg.Hom.Additive

--------------------------------------------------------------------------------
-- HomVectorial -

-- | type family of homomorphisms between 'Vectorial' structures having the same associated 'Scalar.
--
-- __Property__ Let @__h__@ be a type instance of the class @'HomVectorial' __k__@, then
-- for all @__a__@, @__b__@, @v@ in @__h__ __a__ __b__@ and @x@ in @__k__@ holds:
-- @'amap' h (x '!' v) '==' x '!' 'amap' h v@.
class (EmbeddableMorphism h (Vec k), HomAdditive h) => HomVectorial k h

instance HomVectorial k h => HomVectorial k (Path h)

instance (ForgetfulVec k s, ForgetfulTyp (s k), Typeable s, Typeable k)
  => HomVectorial k (IdHom (s k))

--------------------------------------------------------------------------------
-- Hom -

type instance Hom (Vec k) h = HomVectorial k h