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