-- | The Map module provides tools for developing function space 'Manifold's. -- A map is a 'Manifold' where the 'Point's of the Manifold represent -- parametric functions between 'Manifold's. The defining feature of 'Map's is -- that they have a particular 'Domain' and 'Codomain', which themselves are -- 'Manifold's. module Goal.Geometry.Map ( -- * Maps Map (Domain, domain, Codomain, codomain) , Apply ((>.>), (>$>)) -- * Map Charts , Function (Function) ) where --- Imports --- -- Goal -- import Goal.Geometry.Manifold --- Maps between Manifolds --- -- Charts on Maps -- data Function c d = Function c d -- | 'Function' Charts help track Charts on the 'Domain' and 'Codomain'. The -- first Chart corresponds to the 'Domain's chart. class Manifold m => Map m where type Domain m :: * domain :: m -> Domain m type Codomain m :: * codomain :: m -> Codomain m class Map m => Apply c d m where -- | 'Map' application. (>.>) :: Function c d :#: m -> c :#: Domain m -> d :#: Codomain m (>.>) f x = head $ f >$> [x] -- | 'Map' list application. May sometimes have a more efficient implementation -- than simply list-mapping (>.>). (>$>) :: Function c d :#: m -> [c :#: Domain m] -> [d :#: Codomain m] (>$>) f = map (f >.>) infix 8 >.> infix 8 >$> {- --- Tables --- newtype Table s = Table s deriving (Eq, Read, Show) --- Instances --- -- Table -- instance Discrete s => Manifold (Table s) where dimension (Table s) = length $ elements s instance Discrete s => Function Cartesian (Table s) where type Domain Cartesian (Table s) = s domain cm = let (Table s) = manifold cm in s type Codomain Cartesian (Table s) = Continuum codomain _ = Continuum (>.>) cm k = let ctgs = listCoordinates cm Just (ctg,_) = find ((==k) . snd) . zip ctgs . elements $ domain cm in ctg (>$>) cm ks = (cm >.>) <$> ks -}