
module Actor where

-- | 2D position on the screen.
type Position	= (Float, Float)

-- | Force and velocity vectors.
type Force	= (Float, Float)
type Velocity	= (Float, Float)

-- | Time in seconds
type Time	= Float

-- | Radius of a bead
type Radius	= Float

-- | Each actor has its own unique index.
type Index	= Int

-- | The actors in the world.
data Actor
	= Wall 	!Index 		-- ^ unique index of this actor
		!Position 	-- ^ wall starting point
		!Position	-- ^ wall ending point

	| Bead 	!Index 		-- ^ unique index of this actor 
		!Int 		-- ^ whether the bead is stuck
		!Radius 	-- ^ radius of bead
		!Position 	-- ^ position of bead
		!Velocity	-- ^ velocity of bead

	deriving Show

-- | Equality and ordering of actors will consider their index only.
--	We need Ord so we can put them in Maps and Sets.
instance Eq Actor where
 a1 == a2	= actorIx a1 == actorIx a2
	
instance Ord Actor where
 compare a1 a2	= compare (actorIx a1) (actorIx a2)

-- | Check whether an actor is a bead.
isBead :: Actor -> Bool
isBead (Bead _ _ _ _ _)	= True
isBead _		= False


-- | Check whether an actor is a wall.
isWall :: Actor -> Bool
isWall (Wall _ _ _)	= True
isWall _		= False


-- | Take the index of an actor
actorIx :: Actor -> Index
actorIx actor
 = case actor of
	Wall ix _ _	-> ix
 	Bead ix _ _ _ _	-> ix


-- | Set the index of an actor
actorSetIndex :: Actor -> Index -> Actor
actorSetIndex actor ix
 = case actor of
 	Bead _ m r pos vel 	-> Bead ix m r pos vel 
	Wall _ p1 p2		-> Wall ix p1 p2


-- | Set whether a bead is stuck
actorSetMode :: Int -> Actor -> Actor
actorSetMode m (Bead ix _ r p v)
	= Bead ix m r p v
