wumpus-basic-0.17.0: src/Wumpus/Basic/Kernel/Objects/Connector.hs
{-# OPTIONS -Wall #-}
--------------------------------------------------------------------------------
-- |
-- Module : Wumpus.Basic.Kernel.Objects.Connector
-- Copyright : (c) Stephen Tetley 2011
-- License : BSD3
--
-- Maintainer : stephen.tetley@gmail.com
-- Stability : highly unstable
-- Portability : GHC
--
-- ConnImage and ConnGraphic types - these are functional types
-- from the DrawingContext plus start point and end point to a
-- graphic /primitive/.
--
--------------------------------------------------------------------------------
module Wumpus.Basic.Kernel.Objects.Connector
(
ConnectorImage
, ConnectorGraphic
, DConnectorImage
, DConnectorGraphic
, intoConnectorImage
, connectorGraphic_
, emptyConnectorGraphic
, uconvConnectorImageF
, uconvConnectorImageZ
)
where
import Wumpus.Basic.Kernel.Base.BaseDefs
import Wumpus.Basic.Kernel.Base.ContextFun
import Wumpus.Basic.Kernel.Objects.Basis
import Wumpus.Basic.Kernel.Objects.LocImage
import Control.Applicative
-- | ConnectorImage - function from DrawingContext and start and
-- end points to a polymorphic /answer/ and a graphic /primitive/.
--
type ConnectorImage u a = ConnectorQuery u (ImageAns u a)
-- | ConnectorGraphic - function from DrawingContext and start and
-- end points to a graphic /primitive/.
--
type ConnectorGraphic u = ConnectorQuery u (GraphicAns u)
-- | Type specialized version of 'ConnectorImage'.
--
type DConnectorImage a = ConnectorImage Double a
-- | Type specialized version of 'ConnectorGraphic'.
--
type DConnectorGraphic = ConnectorGraphic Double
-- | 'intoConnectorImage' : @ conn_query * conn_graphic -> LocImage @
--
-- /Connector/ version of 'intoImage'.
--
-- The 'ConnectorImage' is built as a function from an implicit
-- start and end points to the answer.
--
intoConnectorImage :: ConnectorQuery u a
-> ConnectorGraphic u
-> ConnectorImage u a
intoConnectorImage qf ma =
promoteR2 $ \a b -> replaceAns <$> apply2R2 qf a b <*> apply2R2 ma a b
-- | /Downcast/ an 'ConnectorImage' to a 'ConnectorGraphic'.
--
-- This means forgetting the answer of the Image, replacing it
-- with @()@.
--
connectorGraphic_ :: ConnectorImage u a -> ConnectorGraphic u
connectorGraphic_ = (fmap . fmap . fmap) ignoreAns
-- | 'emptyConnectorGraphic' : @ ConnectorGraphic @
--
-- Build an empty 'ConnectorGraphic'.
--
-- The 'emptyConnectorGraphic' is treated as a /null primitive/ by
-- @Wumpus-Core@ and is not drawn, although it does generate a
-- bounding box around the rectangular hull of the start and end
-- points.
--
emptyConnectorGraphic :: InterpretUnit u => ConnectorGraphic u
emptyConnectorGraphic = promoteR2 $ \start end ->
let a = emptyLocGraphic `at` start
b = emptyLocGraphic `at` end
in a `oplus` b
-- | Use this to convert 'ConnectorGraphic' or 'ConnectorImage'
-- with Functor answer.
--
uconvConnectorImageF :: (InterpretUnit u, InterpretUnit u1, Functor t)
=> ConnectorImage u (t u) -> ConnectorImage u1 (t u1)
uconvConnectorImageF = uconvR2ab szconvAnsF
-- | Use this to convert 'ConnectorImage' with unit-less answer.
--
uconvConnectorImageZ :: (InterpretUnit u, InterpretUnit u1)
=> ConnectorImage u a -> ConnectorImage u1 a
uconvConnectorImageZ = uconvR2ab szconvAnsZ
--------------------------------------------------------------------------------
--
-- Design note - potentially there are no useful combining
-- operators on Connectors (!).
--
-- Division - i.e. splitting a path at points between the start
-- and end - seems a more obvious operation on connector paths
-- than combination. See the ConnectorPath operations in
-- Wumpus-Drawing for some examples.
--