diff --git a/reanimate-svg.cabal b/reanimate-svg.cabal
--- a/reanimate-svg.cabal
+++ b/reanimate-svg.cabal
@@ -1,5 +1,5 @@
 name:                reanimate-svg
-version:             0.10.2.0
+version:             0.10.3.0
 synopsis:            SVG file loader and serializer
 description:
   reanimate-svg provides types representing a SVG document,
@@ -62,6 +62,7 @@
                , mtl        >= 2.1 && < 2.3
                , lens       >= 4.6 && < 5
                , double-conversion >= 2.0.0.0 && < 3.0.0.0
+               , hashable >= 1.3.0.0
 
 test-suite test
   default-language: Haskell2010
diff --git a/src/Graphics/SvgTree/CssTypes.hs b/src/Graphics/SvgTree/CssTypes.hs
--- a/src/Graphics/SvgTree/CssTypes.hs
+++ b/src/Graphics/SvgTree/CssTypes.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 -- | Define the types used to describes CSS elements
@@ -24,10 +26,12 @@
 import           Data.Monoid            (mconcat)
 #endif
 
+import           Data.Hashable          (Hashable)
 import           Data.List              (intersperse)
 import           Data.Monoid            ((<>))
 import qualified Data.Text              as T
 import qualified Data.Text.Lazy.Builder as TB
+import           GHC.Generics           (Generic)
 import           Text.Printf
 
 import           Codec.Picture          (PixelRGBA8 (..))
@@ -195,7 +199,7 @@
   | Cm Double        -- ^ Number in centimeters, relative to DPI.
   | Point Double     -- ^ Number in points, relative to DPI.
   | Inches Double    -- ^ Number in inches, relative to DPI.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Helper function to modify inner value of a number
 mapNumber :: (Double -> Double) -> Number -> Number
diff --git a/src/Graphics/SvgTree/Types.hs b/src/Graphics/SvgTree/Types.hs
--- a/src/Graphics/SvgTree/Types.hs
+++ b/src/Graphics/SvgTree/Types.hs
@@ -1,4 +1,8 @@
+{-# OPTIONS_GHC -Wno-orphans -O0 #-}
+{-# LANGUAGE StandaloneDeriving #-}
 {-# LANGUAGE CPP                    #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleInstances      #-}
 {-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE MultiParamTypeClasses  #-}
@@ -222,16 +226,25 @@
 import           Control.Lens.TH
 import qualified Data.Foldable             as F
 import           Data.Function             (on)
+import           Data.Hashable             (Hashable)
 import           Data.List                 (inits)
 import           Data.Monoid               (Last (..))
 import           Data.Semigroup            (Semigroup (..))
 import qualified Data.Text                 as T
+import           GHC.Generics              (Generic)
 import           Graphics.SvgTree.CssTypes
 import           Graphics.SvgTree.Misc
 import           Linear                    hiding (angle)
 
 import           Text.Printf
 
+
+-- Orphan instances :(
+instance Hashable a => Hashable (Last a)
+
+deriving instance Generic PixelRGBA8
+instance Hashable PixelRGBA8
+
 -- | Basic coordinate type.
 type Coord = Double
 
@@ -247,12 +260,13 @@
 data Origin
   = OriginAbsolute -- ^ Next point in absolute coordinate
   | OriginRelative -- ^ Next point relative to the previous
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
+
 data MeshGradientType
   = GradientBilinear
   | GradientBicubic
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Path command definition.
 data PathCommand
@@ -278,7 +292,7 @@
     | EllipticalArc !Origin ![(Coord, Coord, Coord, Bool, Bool, RPoint)]
       -- | Close the path, 'Z' or 'z' svg path command.
     | EndPath
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Description of path used in meshgradient tag
 data GradientPathCommand
@@ -288,7 +302,7 @@
     | GCurve !Origin !RPoint !RPoint !(Maybe RPoint)
       -- | 'Z' command
     | GClose
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Little helper function to build a point.
 toPoint :: Number -> Number -> Point
@@ -308,7 +322,7 @@
 data CoordinateUnits
     = CoordUserSpace   -- ^ `userSpaceOnUse` value
     | CoordBoundingBox -- ^ `objectBoundingBox` value
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | This type represent the align information of the
 -- preserveAspectRatio SVGattribute
@@ -323,12 +337,12 @@
   | AlignxMinYMax -- ^ "xMinYMax" value
   | AlignxMidYMax -- ^ "xMidYMax" value
   | AlignxMaxYMax -- ^ "xMaxYMax" value
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | This type represent the "meet or slice" information
 -- of the preserveAspectRatio SVGattribute
 data MeetSlice = Meet | Slice
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Describe the content of the preserveAspectRatio attribute.
 data PreserveAspectRatio = PreserveAspectRatio
@@ -336,7 +350,7 @@
   , _aspectRatioAlign     :: !Alignment
   , _aspectRatioMeetSlice :: !(Maybe MeetSlice)
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 instance WithDefaultSvg PreserveAspectRatio where
   defaultSvg = PreserveAspectRatio
@@ -353,7 +367,7 @@
   = CapRound -- ^ End with a round (`round` value)
   | CapButt  -- ^ Define straight just at the end (`butt` value)
   | CapSquare -- ^ Straight further of the ends (`square` value)
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Define the possible values of the `stroke-linejoin`
 -- attribute.
@@ -362,7 +376,7 @@
     = JoinMiter -- ^ `miter` value
     | JoinBevel -- ^ `bevel` value
     | JoinRound -- ^ `round` value
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Describe the different value which can be used
 -- in the `fill` or `stroke` attributes.
@@ -370,14 +384,14 @@
   = ColorRef   PixelRGBA8 -- ^ Direct solid color (#rrggbb, #rgb)
   | TextureRef String     -- ^ Link to a complex texture (url(#name))
   | FillNone              -- ^ Equivalent to the `none` value.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Describe the possile filling algorithms.
 -- Map the values of the `fill-rule` attributes.
 data FillRule
     = FillEvenOdd -- ^ Correspond to the `evenodd` value.
     | FillNonZero -- ^ Correspond to the `nonzero` value.
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Describe the content of the `transformation` attribute.
 -- see `_transform` and `transform`.
@@ -398,7 +412,7 @@
     | SkewY !Double
       -- | Unkown transformation, like identity.
     | TransformUnknown
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Convert the Transformation to a string which can be
 -- directly used in a svg attributes.
@@ -435,7 +449,7 @@
   = FontStyleNormal
   | FontStyleItalic
   | FontStyleOblique
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Tell where to anchor the text, where the position
 -- given is realative to the text.
@@ -461,7 +475,7 @@
     --
     -- Equivalent to the `end` value.
   | TextAnchorEnd
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 
 -- | Correspond to the possible values of the
@@ -470,7 +484,7 @@
 data ElementRef
   = RefNone  -- ^ Value for `none`
   | Ref String -- ^ Equivalent to `url()` attribute.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 data FilterSource
   = SourceGraphic
@@ -480,7 +494,7 @@
   | FillPaint
   | StrokePaint
   | SourceRef String
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 data FilterAttributes = FilterAttributes
   { _filterHeight :: !(Last Number)
@@ -488,7 +502,7 @@
   , _filterWidth  :: !(Last Number)
   , _filterX      :: !(Last Number)
   , _filterY      :: !(Last Number)
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic, Hashable)
 
 instance WithDefaultSvg FilterAttributes where
   defaultSvg = FilterAttributes
@@ -575,7 +589,7 @@
     , _filterRef        :: !(Last ElementRef)
     , _preRendered      :: !(Maybe String)
     }
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 makeClassy ''DrawAttributes
 
@@ -589,7 +603,7 @@
     -- correspond to the `points` attribute
   , _polyLinePoints         :: ![RPoint]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 
 instance WithDefaultSvg PolyLine where
@@ -632,7 +646,7 @@
     -- the `points` attributes.
   , _polygonPoints         :: ![RPoint]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Polygon
 -- | Lenses for the Polygon type
@@ -675,7 +689,7 @@
     -- to the `x2` and `y2` attributes.
   , _linePoint2         :: !Point
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Line
 -- | Lenses for the Line type.
@@ -733,7 +747,7 @@
     -- `ry` attributes.
   , _rectCornerRadius    :: !(Maybe Number, Maybe Number)
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Rectangle
 -- | Lenses for the Rectangle type.
@@ -797,7 +811,7 @@
     -- `d` attributes.
   , _pathDefinition     :: ![PathCommand]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Path
 -- | Lenses for the Path type
@@ -842,7 +856,7 @@
     -- | used for symbols only
   , _groupAspectRatio    :: !PreserveAspectRatio
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Group
 -- | Lenses associated to the Group type.
@@ -897,7 +911,7 @@
 -- a hidden named group.
 newtype Symbol a =
     Symbol { _groupOfSymbol :: Group a }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 instance HasGroup (Symbol a) a where
   group = groupOfSymbol
@@ -918,7 +932,7 @@
 -- a named symbol.
 newtype Definitions a =
     Definitions { _groupOfDefinitions :: Group a }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 instance HasGroup (Definitions a) a where
   group = groupOfDefinitions
@@ -941,7 +955,7 @@
   , _filterSelfAttributes :: !FilterAttributes
   , _filterChildren       :: ![FilterElement]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 instance WithDefaultSvg Filter where
   defaultSvg = Filter
@@ -961,7 +975,7 @@
     -- attribute.
   , _circleRadius         :: !Number
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Circle
 -- | Lenses for the Circle type.
@@ -1015,7 +1029,7 @@
     -- `ry` attribute.
   , _ellipseYRadius        :: !Number
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Ellipse
 -- | Lenses for the ellipse type.
@@ -1074,7 +1088,7 @@
       -- | Stop color opacity
     , _gradientOpacity :: !(Maybe Float)
     }
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''GradientStop
 -- | Lenses for the GradientStop type.
@@ -1122,7 +1136,7 @@
   { -- | List of stop, from 2 to 4 in a patch
     _meshGradientPatchStops :: ![GradientStop]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''MeshGradientPatch
 class HasMeshGradientPatch c_annx where
@@ -1145,7 +1159,7 @@
   { -- | List of patch in a row
     _meshGradientRowPatches :: ![MeshGradientPatch]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''MeshGradientRow
 class HasMeshGradientRow c_antr where
@@ -1180,7 +1194,7 @@
     -- | List of patch rows in the the mesh.
   , _meshGradientRows           :: ![MeshGradientRow]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''MeshGradient
 class HasMeshGradient c_anxG where
@@ -1263,7 +1277,7 @@
     -- | preserveAspectRatio attribute
   , _imageAspectRatio     :: !PreserveAspectRatio
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Image
 -- | Lenses for the Image type.
@@ -1343,7 +1357,7 @@
     -- | Use draw attributes.
   , _useDrawAttributes :: DrawAttributes
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Use
 -- | Lenses for the Use type.
@@ -1404,7 +1418,7 @@
   , _textInfoRotate :: ![Double] -- ^ `rotate` attribute.
   , _textInfoLength :: !(Maybe Number) -- ^ `textLength` attribute.
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 instance Semigroup TextInfo where
   (<>) (TextInfo x1 y1 dx1 dy1 r1 l1)
@@ -1469,7 +1483,7 @@
     = SpanText    !T.Text -- ^ Raw text
     | SpanTextRef !String -- ^ Equivalent to a `<tref>`
     | SpanSub     !TextSpan -- ^ Define a `<tspan>`
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Define a `<tspan>` tag.
 data TextSpan = TextSpan
@@ -1480,7 +1494,7 @@
     -- | Content of the span.
   , _spanContent        :: ![TextSpanContent]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''TextSpan
 -- | Lenses for the TextSpan type.
@@ -1519,14 +1533,14 @@
 data TextPathMethod
   = TextPathAlign   -- ^ Map to the `align` value.
   | TextPathStretch -- ^ Map to the `stretch` value.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Describe the content of the `spacing` text path
 -- attribute.
 data TextPathSpacing
   = TextPathSpacingExact -- ^ Map to the `exact` value.
   | TextPathSpacingAuto  -- ^ Map to the `auto` value.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Describe the `<textpath>` SVG tag.
 data TextPath = TextPath
@@ -1540,7 +1554,7 @@
     -- | Correspond to the `spacing` attribute.
   , _textPathSpacing     :: !TextPathSpacing
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- -- | Lenses for the TextPath type.
 
@@ -1557,7 +1571,7 @@
 data TextAdjust
   = TextAdjustSpacing -- ^ Value `spacing`
   | TextAdjustSpacingAndGlyphs -- ^ Value `spacingAndGlyphs`
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Define the global `<tag>` SVG tag.
 data Text = Text
@@ -1566,7 +1580,7 @@
     -- | Root of the text content.
   , _textRoot   :: !TextSpan
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Text
 -- | Lenses for the Text type.
@@ -1635,7 +1649,7 @@
     | MaskTree      !Mask
     | ClipPathTree  !ClipPath
     | SvgTree       !Document
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 data FilterElement
   = FEBlend
@@ -1661,7 +1675,7 @@
   | FETile
   | FETurbulence Turbulence
   | FENone
-  deriving (Eq,Show)
+  deriving (Eq,Show, Generic, Hashable)
 
 instance WithDefaultSvg FilterElement where
   defaultSvg = FENone
@@ -1672,7 +1686,7 @@
   | TFDiscrete
   | TFLinear
   | TFGamma
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 data TransferFunction = TransferFunction
   { _transferFunctionDrawAttributes   :: !DrawAttributes
@@ -1684,14 +1698,14 @@
   , _transferFunctionAmplitude        :: Double
   , _transferFunctionExponent         :: Double
   , _transferFunctionOffset           :: Double
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic, Hashable)
 
 data ChannelSelector
   = ChannelR
   | ChannelG
   | ChannelB
   | ChannelA
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 data DisplacementMap = DisplacementMap
   { _displacementMapDrawAttributes   :: !DrawAttributes
@@ -1701,7 +1715,7 @@
   , _displacementMapScale            :: !(Last Double)
   , _displacementMapXChannelSelector :: ChannelSelector
   , _displacementMapYChannelSelector :: ChannelSelector
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic, Hashable)
 
 instance WithDefaultSvg DisplacementMap where
   defaultSvg = DisplacementMap
@@ -1719,7 +1733,7 @@
   | Saturate
   | HueRotate
   | LuminanceToAlpha
-  deriving (Eq,Show)
+  deriving (Eq,Show, Generic, Hashable)
 
 data ColorMatrix = ColorMatrix
   { _colorMatrixDrawAttributes :: !DrawAttributes
@@ -1727,7 +1741,7 @@
   , _colorMatrixIn             :: !(Last FilterSource)
   , _colorMatrixType           :: !ColorMatrixType
   , _colorMatrixValues         :: !String
-  } deriving (Eq,Show)
+  } deriving (Eq,Show, Generic, Hashable)
 
 instance WithDefaultSvg ColorMatrix where
   defaultSvg = ColorMatrix
@@ -1745,7 +1759,7 @@
   | CompositeAtop
   | CompositeXor
   | CompositeArithmetic
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 data Composite = Composite
   { _compositeDrawAttributes :: DrawAttributes
@@ -1757,7 +1771,7 @@
   , _compositeK2             :: Number
   , _compositeK3             :: Number
   , _compositeK4             :: Number
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic, Hashable)
 
 instance WithDefaultSvg Composite where
   defaultSvg = Composite
@@ -1780,17 +1794,17 @@
   , _turbulenceSeed           :: Double
   , _turbulenceStitchTiles    :: StitchTiles
   , _turbulenceType           :: TurbulenceType
-  } deriving (Eq, Show)
+  } deriving (Eq, Show, Generic, Hashable)
 
 data StitchTiles
   = NoStitch
   | Stitch
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 data TurbulenceType
   = FractalNoiseType
   | TurbulenceType
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 instance WithDefaultSvg Turbulence where
   defaultSvg = Turbulence
@@ -1807,7 +1821,7 @@
   = EdgeDuplicate
   | EdgeWrap
   | EdgeNone
-  deriving (Eq,Show)
+  deriving (Eq,Show, Generic, Hashable)
 
 data GaussianBlur = GaussianBlur
   { _gaussianBlurDrawAttributes :: DrawAttributes
@@ -1816,7 +1830,7 @@
   , _gaussianBlurStdDeviationX  :: Number
   , _gaussianBlurStdDeviationY  :: Last Number
   , _gaussianBlurEdgeMode       :: EdgeMode
-  } deriving (Eq,Show)
+  } deriving (Eq,Show, Generic, Hashable)
 
 instance WithDefaultSvg GaussianBlur where
   defaultSvg = GaussianBlur
@@ -1833,21 +1847,21 @@
 data MarkerOrientation
   = OrientationAuto        -- ^ Auto value
   | OrientationAngle Coord -- ^ Specific angle.
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Define the content of the `markerUnits` attribute
 -- on the Marker.
 data MarkerUnit
   = MarkerUnitStrokeWidth    -- ^ Value `strokeWidth`
   | MarkerUnitUserSpaceOnUse -- ^ Value `userSpaceOnUse`
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Define the content of the `markerUnits` attribute
 -- on the Marker.
 data Overflow
   = OverflowVisible    -- ^ Value `visible`
   | OverflowHidden     -- ^ Value `hidden`
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- | Define the `<marker>` tag.
 data Marker = Marker
@@ -1875,7 +1889,7 @@
     -- | Elements defining the marker.
   , _markerElements       :: [Tree]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Marker
 -- | Lenses for the Marker type.
@@ -2171,7 +2185,7 @@
     = SpreadRepeat  -- ^ `reapeat` value
     | SpreadPad     -- ^ `pad` value
     | SpreadReflect -- ^ `reflect value`
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Define a `<linearGradient>` tag.
 data LinearGradient = LinearGradient
@@ -2197,7 +2211,7 @@
       -- | List of color stops of the linear gradient.
     , _linearGradientStops          :: [GradientStop]
     }
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''LinearGradient
 -- | Lenses for the LinearGradient type.
@@ -2291,7 +2305,7 @@
     -- | List of color stops of the radial gradient.
   , _radialGradientStops          :: [GradientStop]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''RadialGradient
 -- | Lenses for the RadialGradient type.
@@ -2387,7 +2401,7 @@
     -- | Children of the `<mask>` tag.
   , _maskContent        :: [Tree]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Mask
 -- | Lenses for the Mask type.
@@ -2462,7 +2476,7 @@
     -- | Maps to the content of the tree
   , _clipPathContent        :: [Tree]
   }
-  deriving (Eq, Show)
+  deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''ClipPath
 -- | Lenses for the ClipPath type.
@@ -2529,7 +2543,7 @@
       -- | Value of "patternTransform" attribute
     , _patternTransform      :: !(Maybe [Transformation])
     }
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- makeClassy ''Pattern
 -- | Lenses for the Patter type.
@@ -2628,7 +2642,7 @@
     | ElementMarker Marker
     | ElementMask Mask
     | ElementClipPath ClipPath
-    deriving (Eq, Show)
+    deriving (Eq, Show, Generic, Hashable)
 
 -- | Represent a full svg document with style,
 -- geometry and named elements.
@@ -2641,7 +2655,7 @@
     , _documentLocation :: FilePath
     , _documentAspectRatio :: PreserveAspectRatio
     }
-    deriving (Show, Eq)
+    deriving (Show, Eq, Generic, Hashable)
 
 
 -- | Lenses associated to a SVG document.
