content: 
  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
  