diff --git a/FRP/Helm/Automaton.hs b/FRP/Helm/Automaton.hs
--- a/FRP/Helm/Automaton.hs
+++ b/FRP/Helm/Automaton.hs
@@ -6,14 +6,15 @@
   pure,
   stateful,
   combine,
-  (>>>),
-  (<<<),
   -- * Computing
   step,
   run,
   counter
 ) where
 
+import Control.Arrow
+import Control.Category
+import Prelude hiding (id, (.))
 import FRP.Elerea.Simple (Signal, SignalGen, transfer)
 
 {-| A data structure describing an automaton.
@@ -24,6 +25,15 @@
     to create composable dynamic behavior, like animation systems. -}
 data Automaton a b = Step (a -> (Automaton a b, b))
 
+instance Category Automaton where
+  id = Step (\a -> (id, a))
+  (Step f) . (Step g) = Step (\a -> let (g', b) = g a
+                                        (f', c) = f b in (f' . g', c))
+
+instance Arrow Automaton where
+  arr = pure
+  first (Step f) = Step (\(b, d) -> let (f', c) = f b in (first f', (c, d)))
+
 {-| Creates a pure automaton that has no accumulated state. It applies input to
     a function at each step. -}
 pure :: (a -> b) -> Automaton a b
@@ -32,8 +42,7 @@
 {-| Creates an automaton that has an initial and accumulated state. It applies
     input and the last state to a function at each step. -}
 stateful :: b -> (a -> b -> b) -> Automaton a b
-stateful s f = Step (\x -> let s' = f x s
-                           in (stateful s' f, s'))
+stateful state f = Step (\x -> let state' = f x state in (stateful state' f, state'))
 
 {-| Steps an automaton forward, returning the next automaton to step
     and output of the step in a tuple. -}
@@ -49,20 +58,6 @@
   Step (\a -> let (autos', bs) = unzip $ map (step a) autos
               in  (combine autos', bs))
 
-{-| Pipes two automatons together. It essentially
-    returns an automaton that takes the input of the first
-    automaton and outputs the output of the second automaton,
-    with the directly connected values being discarded. -}
-(>>>) :: Automaton a b -> Automaton b c -> Automaton a c
-f >>> g =
-  Step (\a -> let (f', b) = step a f
-                  (g', c) = step b g
-              in (f' >>> g', c))
-
-{-| Pipes two automatons in the opposite order of '>>>'. -}
-(<<<) :: Automaton b c -> Automaton a b -> Automaton a c
-g <<< f = f >>> g
-
 {-| A useful automaton that outputs the amount of times it has been stepped,
     discarding its input value. -}
 counter :: Automaton a Int
@@ -72,7 +67,7 @@
     and creates an output signal generator that contains a signal that can be
     sampled for the output value. -}
 run :: Automaton a b -> b -> SignalGen (Signal a) -> SignalGen (Signal b)
-run auto initial feeder = do
-  stepper <- feeder >>= transfer (auto, initial) (\a (Step f, _) -> f a)
+run auto ini feeder = do
+  food <- feeder >>= transfer (auto, ini) (\a (Step f, _) -> f a)
 
-  return $ fmap snd stepper
+  return $ fmap snd food
diff --git a/FRP/Helm/Color.hs b/FRP/Helm/Color.hs
--- a/FRP/Helm/Color.hs
+++ b/FRP/Helm/Color.hs
@@ -34,7 +34,7 @@
 {-| A data structure describing a color. It is represented interally as an RGBA
     color, but the utility functions 'hsva', 'hsv', etc. can be used to convert
     from other popular formats to this structure. -}
-data Color = Color { r :: !Double, g :: !Double, b :: !Double, a :: !Double }
+data Color = Color { r :: !Double, g :: !Double, b :: !Double, a :: !Double } deriving (Show, Eq)
 
 {-| Creates an RGB color. -}
 rgb :: Double -> Double -> Double -> Color
@@ -153,7 +153,7 @@
     over certain radii in an arc pattern. Linear gradients are a set of colors
     transitioned in a straight line. -}
 data Gradient = Linear (Double, Double) (Double, Double) [(Double, Color)] |
-                Radial (Double, Double) Double (Double, Double) Double [(Double, Color)]
+                Radial (Double, Double) Double (Double, Double) Double [(Double, Color)] deriving (Show, Eq)
 
 
 {-| Creates a linear gradient. Takes a starting position, ending position and a list
diff --git a/FRP/Helm/Graphics.hs b/FRP/Helm/Graphics.hs
--- a/FRP/Helm/Graphics.hs
+++ b/FRP/Helm/Graphics.hs
@@ -63,7 +63,7 @@
     renders a collection of forms together. -}
 data Element = CollageElement Int Int [Form] |
                ImageElement (Int, Int) Int Int FilePath Bool |
-               TextElement Text
+               TextElement Text deriving (Show, Eq)
 
 {-| A data structure describing a piece of formatted text. -}
 data Text = Text {
@@ -73,7 +73,7 @@
   fontSize :: Double,
   fontWeight :: Cairo.FontWeight,
   fontSlant :: Cairo.FontSlant
-}
+} deriving (Show, Eq)
 
 {-| Create an element from an image with a given width, height and image file path.
     If the image dimensions are not the same as given, then it will stretch/shrink to fit.
@@ -102,18 +102,18 @@
   x :: Double,
   y :: Double,
   style :: FormStyle
-}
+} deriving (Show, Eq)
 
 {-| A data structure describing how a shape or path looks when filled. -}
-data FillStyle = Solid Color | Texture String | Gradient Gradient
+data FillStyle = Solid Color | Texture String | Gradient Gradient deriving (Show, Eq)
 
 {-| A data structure describing the shape of the ends of a line. -}
-data LineCap = Flat | Round | Padded
+data LineCap = Flat | Round | Padded deriving (Show, Eq, Enum, Ord)
 
 {-| A data structure describing the shape of the join of a line, i.e.
     where separate line segments join. The 'Sharp' variant takes
     an argument to limit the length of the join. -}
-data LineJoin = Smooth | Sharp Double | Clipped
+data LineJoin = Smooth | Sharp Double | Clipped deriving (Show, Eq)
 
 {-| A data structure describing how a shape or path looks when stroked. -}
 data LineStyle = LineStyle {
@@ -123,7 +123,7 @@
   join :: LineJoin,
   dashing :: [Double],
   dashOffset :: Double
-}
+} deriving (Show, Eq)
 
 {-| Creates the default line style. By default, the line is black with a width of 1,
     flat caps and regular sharp joints. -}
@@ -154,7 +154,7 @@
 data FormStyle = PathForm LineStyle Path |
                  ShapeForm (Either LineStyle FillStyle) Shape |
                  ElementForm Element |
-                 GroupForm Matrix [Form]
+                 GroupForm Matrix [Form] deriving (Show, Eq)
 
 {-| Utility function for creating a form. -}
 form :: FormStyle -> Form
@@ -243,7 +243,9 @@
 
 {-| A data structure describing a some sort of graphically representable object,
     such as a polygon formed from a set of points or a rectangle. -}
-data Shape = PolygonShape Path | RectangleShape (Double, Double) | ArcShape (Double, Double) Double Double Double (Double, Double)
+data Shape = PolygonShape Path |
+             RectangleShape (Double, Double) |
+             ArcShape (Double, Double) Double Double Double (Double, Double) deriving (Show, Eq)
 
 {-| Creates a shape from a path (a set of points). -}
 polygon :: Path -> Shape
diff --git a/FRP/Helm/Keyboard.hs b/FRP/Helm/Keyboard.hs
--- a/FRP/Helm/Keyboard.hs
+++ b/FRP/Helm/Keyboard.hs
@@ -50,7 +50,7 @@
            RShiftKey | LShiftKey | RCtrlKey | LCtrlKey | RAltKey | LAltKey |
            RMetaKey | LMetaKey | RSuperKey | LSuperKey | ModeKey | ComposeKey | HelpKey |
            PrintKey | SysReqKey | BreakKey | MenuKey | PowerKey | EuroKey |
-           UndoKey
+           UndoKey deriving (Show, Eq, Ord)
 
 {- All integer values of this enum are equivalent to the SDL key enum. -}
 instance Enum Key where
diff --git a/FRP/Helm/Mouse.hs b/FRP/Helm/Mouse.hs
--- a/FRP/Helm/Mouse.hs
+++ b/FRP/Helm/Mouse.hs
@@ -14,7 +14,7 @@
 import qualified Graphics.UI.SDL.Utilities as Util
 
 {-| A data structure describing a button on a mouse. -}
-data Mouse = LeftMouse | MiddleMouse | RightMouse
+data Mouse = LeftMouse | MiddleMouse | RightMouse deriving (Show, Eq, Ord)
 
 {- All integer values of this enum are equivalent to the SDL key enum. -}
 instance Enum Mouse where
diff --git a/helm.cabal b/helm.cabal
--- a/helm.cabal
+++ b/helm.cabal
@@ -1,5 +1,5 @@
 name: helm
-version: 0.3.0
+version: 0.3.1
 synopsis: A functionally reactive game engine.
 description: A functionally reactive game engine, with headgear to protect you
              from the headache of game development provided.
@@ -33,11 +33,11 @@
     FRP.Helm.Window
   build-depends:
     base >= 4 && < 5,
-    cairo >= 0.12.4 && < 1,
-    containers >= 0.5.0.0 && < 1,
-    elerea >= 2.7.0.1 && < 3,
-    filepath >= 1.3.0.1 && < 2,
-    SDL >= 0.6.4 && < 1
+    cairo >= 0.12 && < 1,
+    containers >= 0.5 && < 1,
+    elerea >= 2.7 && < 3,
+    filepath >= 1.3 && < 2,
+    SDL >= 0.6 && < 1
   default-language: Haskell2010
   default-extensions: RecordWildCards, NamedFieldPuns
   ghc-options: -Wall
