diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.0.0.5
+
+* Remove unit data types.
+
 0.0.0.4
 
 * Fix export list
diff --git a/spacechar.cabal b/spacechar.cabal
--- a/spacechar.cabal
+++ b/spacechar.cabal
@@ -1,5 +1,5 @@
 name:                 spacechar
-version:              0.0.0.4
+version:              0.0.0.5
 synopsis:             Space Character
 description:          All the space characters as types
 license:              BSD3
diff --git a/src/Data/Char/Space.hs b/src/Data/Char/Space.hs
--- a/src/Data/Char/Space.hs
+++ b/src/Data/Char/Space.hs
@@ -4,2040 +4,1652 @@
 
 module Data.Char.Space(
   -- * Individual space characters
-  HorizontalTab
-, HasHorizontalTab(..)
-, AsHorizontalTab(..)
-, parseHorizontalTab
-, LineFeed
-, HasLineFeed(..)
-, AsLineFeed(..)
-, parseLineFeed
-, VerticalTab
-, HasVerticalTab(..)
-, AsVerticalTab(..)
-, parseVerticalTab
-, FormFeed
-, HasFormFeed(..)
-, AsFormFeed(..)
-, parseFormFeed
-, CarriageReturn
-, HasCarriageReturn(..)
-, AsCarriageReturn(..)
-, parseCarriageReturn
-, Whitespace
-, HasWhitespace(..)
-, AsWhitespace(..)
-, parseWhitespace
-, NoBreakSpace
-, HasNoBreakSpace(..)
-, AsNoBreakSpace(..)
-, parseNoBreakSpace
-, OghamSpaceMark
-, HasOghamSpaceMark(..)
-, AsOghamSpaceMark(..)
-, parseOghamSpaceMark
-, EnQuad
-, HasEnQuad(..)
-, AsEnQuad(..)
-, parseEnQuad
-, EmQuad
-, HasEmQuad(..)
-, AsEmQuad(..)
-, parseEmQuad
-, EnSpace
-, HasEnSpace(..)
-, AsEnSpace(..)
-, parseEnSpace
-, EmSpace
-, HasEmSpace(..)
-, AsEmSpace(..)
-, parseEmSpace
-, ThreePerEmSpace
-, HasThreePerEmSpace(..)
-, AsThreePerEmSpace(..)
-, parseThreePerEmSpace
-, FourPerEmSpace
-, HasFourPerEmSpace(..)
-, AsFourPerEmSpace(..)
-, parseFourPerEmSpace
-, SixPerEmSpace
-, HasSixPerEmSpace(..)
-, AsSixPerEmSpace(..)
-, parseSixPerEmSpace
-, FigureSpace
-, HasFigureSpace(..)
-, AsFigureSpace(..)
-, parseFigureSpace
-, PunctuationSpace
-, HasPunctuationSpace(..)
-, AsPunctuationSpace(..)
-, parsePunctuationSpace
-, ThinSpace
-, HasThinSpace(..)
-, AsThinSpace(..)
-, parseThinSpace
-, HairSpace
-, HasHairSpace(..)
-, AsHairSpace(..)
-, parseHairSpace
-, NarrowNoBreakSpace
-, HasNarrowNoBreakSpace(..)
-, AsNarrowNoBreakSpace(..)
-, parseNarrowNoBreakSpace
-, MediumMathematicalSpace
-, HasMediumMathematicalSpace(..)
-, AsMediumMathematicalSpace(..)
-, parseMediumMathematicalSpace
-, IdeographicSpace
-, HasIdeographicSpace(..)
-, AsIdeographicSpace(..)
-, parseIdeographicSpace
--- * All space characters
-, SpaceChar(..)
-, HasSpaceChar(..)
-, AsSpaceChar(..)
-, parseSpaceChar
--- * ISO Latin-1 space characters /(horizontal tab, line feed, form feed, carriage return, whitespace)/
-, IsoLatin1(..)
-, HasIsoLatin1(..)
-, AsIsoLatin1(..)
-, parseIsoLatin1
-) where
-
-import Control.Category ( Category(id) )
-import Control.Lens ( Prism', prism', (#), Lens' )
-import Data.Char ( Char )
-import Data.Eq ( Eq((==)) )
-import Data.Int ( Int )
-import Data.Foldable ( asum )
-import Data.Functor ( Functor((<$), fmap) )
-import Data.Maybe ( Maybe(Nothing, Just) )
-import Data.Monoid ( (<>), Monoid(mempty) )
-import Data.Ord ( Ord )
-import Data.Semigroup ( Semigroup )
-import GHC.Generics ( Generic )
-import GHC.Show ( Show )
-import Prelude(Integer)
-import Text.Parser.Char ( CharParsing(satisfy) )
-import Text.Parser.Combinators ( Parsing((<?>)) )
-
-data HorizontalTab = HorizontalTab
-  deriving (Eq, Ord, Show, Generic)
-
-class HasHorizontalTab a where
-  horizontalTab :: Lens' a HorizontalTab
-
-instance HasHorizontalTab HorizontalTab where
-  horizontalTab = id
-
-instance HasHorizontalTab () where
-  horizontalTab f x =
-    fmap (\HorizontalTab -> x) (f HorizontalTab)
-
-instance Semigroup HorizontalTab where
-  HorizontalTab <> HorizontalTab = HorizontalTab
-
-instance Monoid HorizontalTab where
-  mempty = HorizontalTab
-
-class AsHorizontalTab a where
-  _HorizontalTab :: Prism' a HorizontalTab
-  _HorizontalTab' :: a
-  _HorizontalTab' = _HorizontalTab # HorizontalTab
-
-instance AsHorizontalTab HorizontalTab where
-  _HorizontalTab = id
-
-instance AsHorizontalTab () where
-  _HorizontalTab =
-    prism'
-      (\HorizontalTab -> ())
-      (\() -> Just HorizontalTab)
-
-instance AsHorizontalTab Char where
-  _HorizontalTab =
-    prism'
-      (\HorizontalTab -> '\9')
-      (\case
-          '\9' -> Just HorizontalTab
-          _ -> Nothing
-      )
-
-instance AsHorizontalTab Int where
-  _HorizontalTab =
-    prism'
-      (\HorizontalTab -> 9)
-      (\case
-          9 -> Just HorizontalTab
-          _ -> Nothing
-      )
-
-instance AsHorizontalTab Integer where
-  _HorizontalTab =
-    prism'
-      (\HorizontalTab -> 9)
-      (\case
-          9 -> Just HorizontalTab
-          _ -> Nothing
-      )
-
-parseHorizontalTab ::
-  CharParsing p =>
-  p HorizontalTab
-parseHorizontalTab =
-  HorizontalTab <$ satisfy (== '\9') <?> "horizontal tab character"
-
-data LineFeed = LineFeed
-  deriving (Eq, Ord, Show, Generic)
-
-class HasLineFeed a where
-  lineFeed :: Lens' a LineFeed
-
-instance HasLineFeed LineFeed where
-  lineFeed = id
-
-instance HasLineFeed () where
-  lineFeed f x =
-    fmap (\LineFeed -> x) (f LineFeed)
-
-instance Semigroup LineFeed where
-  LineFeed <> LineFeed = LineFeed
-
-instance Monoid LineFeed where
-  mempty = LineFeed
-
-class AsLineFeed a where
-  _LineFeed :: Prism' a LineFeed
-  _LineFeed' :: a
-  _LineFeed' = _LineFeed # LineFeed
-
-instance AsLineFeed LineFeed where
-  _LineFeed = id
-
-instance AsLineFeed () where
-  _LineFeed =
-    prism'
-      (\LineFeed -> ())
-      (\() -> Just LineFeed)
-
-instance AsLineFeed Char where
-  _LineFeed =
-    prism'
-      (\LineFeed -> '\10')
-      (\case
-          '\10' -> Just LineFeed
-          _ -> Nothing
-      )
-
-instance AsLineFeed Int where
-  _LineFeed =
-    prism'
-      (\LineFeed -> 10)
-      (\case
-          10 -> Just LineFeed
-          _ -> Nothing
-      )
-
-instance AsLineFeed Integer where
-  _LineFeed =
-    prism'
-      (\LineFeed -> 10)
-      (\case
-          10 -> Just LineFeed
-          _ -> Nothing
-      )
-
-parseLineFeed ::
-  CharParsing p =>
-  p LineFeed
-parseLineFeed =
-  LineFeed <$ satisfy (== '\10') <?> "line feed character"
-
-data VerticalTab = VerticalTab
-  deriving (Eq, Ord, Show, Generic)
-
-class HasVerticalTab a where
-  verticalTab :: Lens' a VerticalTab
-
-instance HasVerticalTab VerticalTab where
-  verticalTab = id
-
-instance HasVerticalTab () where
-  verticalTab f x =
-    fmap (\VerticalTab -> x) (f VerticalTab)
-
-instance Semigroup VerticalTab where
-  VerticalTab <> VerticalTab = VerticalTab
-
-instance Monoid VerticalTab where
-  mempty = VerticalTab
-
-class AsVerticalTab a where
-  _VerticalTab :: Prism' a VerticalTab
-  _VerticalTab' :: a
-  _VerticalTab' = _VerticalTab # VerticalTab
-
-instance AsVerticalTab VerticalTab where
-  _VerticalTab = id
-
-instance AsVerticalTab () where
-  _VerticalTab =
-    prism'
-      (\VerticalTab -> ())
-      (\() -> Just VerticalTab)
-
-instance AsVerticalTab Char where
-  _VerticalTab =
-    prism'
-      (\VerticalTab -> '\11')
-      (\case
-          '\11' -> Just VerticalTab
-          _ -> Nothing
-      )
-
-instance AsVerticalTab Int where
-  _VerticalTab =
-    prism'
-      (\VerticalTab -> 11)
-      (\case
-          11 -> Just VerticalTab
-          _ -> Nothing
-      )
-
-instance AsVerticalTab Integer where
-  _VerticalTab =
-    prism'
-      (\VerticalTab -> 11)
-      (\case
-          11 -> Just VerticalTab
-          _ -> Nothing
-      )
-
-parseVerticalTab ::
-  CharParsing p =>
-  p VerticalTab
-parseVerticalTab =
-  VerticalTab <$ satisfy (== '\11') <?> "vertical tab character"
-
-data FormFeed = FormFeed
-  deriving (Eq, Ord, Show, Generic)
-
-class HasFormFeed a where
-  formFeed :: Lens' a FormFeed
-
-instance HasFormFeed FormFeed where
-  formFeed = id
-
-instance HasFormFeed () where
-  formFeed f x =
-    fmap (\FormFeed -> x) (f FormFeed)
-
-instance Semigroup FormFeed where
-  FormFeed <> FormFeed = FormFeed
-
-instance Monoid FormFeed where
-  mempty = FormFeed
-
-class AsFormFeed a where
-  _FormFeed :: Prism' a FormFeed
-  _FormFeed' :: a
-  _FormFeed' = _FormFeed # FormFeed
-
-instance AsFormFeed FormFeed where
-  _FormFeed = id
-
-instance AsFormFeed () where
-  _FormFeed =
-    prism'
-      (\FormFeed -> ())
-      (\() -> Just FormFeed)
-
-instance AsFormFeed Char where
-  _FormFeed =
-    prism'
-      (\FormFeed -> '\12')
-      (\case
-          '\12' -> Just FormFeed
-          _ -> Nothing
-      )
-
-instance AsFormFeed Int where
-  _FormFeed =
-    prism'
-      (\FormFeed -> 12)
-      (\case
-          12 -> Just FormFeed
-          _ -> Nothing
-      )
-
-instance AsFormFeed Integer where
-  _FormFeed =
-    prism'
-      (\FormFeed -> 12)
-      (\case
-          12 -> Just FormFeed
-          _ -> Nothing
-      )
-
-parseFormFeed ::
-  CharParsing p =>
-  p FormFeed
-parseFormFeed =
-  FormFeed <$ satisfy (== '\12') <?> "form feed character"
-
-data CarriageReturn = CarriageReturn
-  deriving (Eq, Ord, Show, Generic)
-
-class HasCarriageReturn a where
-  carriageReturn :: Lens' a CarriageReturn
-
-instance HasCarriageReturn CarriageReturn where
-  carriageReturn = id
-
-instance HasCarriageReturn () where
-  carriageReturn f x =
-    fmap (\CarriageReturn -> x) (f CarriageReturn)
-
-instance Semigroup CarriageReturn where
-  CarriageReturn <> CarriageReturn = CarriageReturn
-
-instance Monoid CarriageReturn where
-  mempty = CarriageReturn
-
-class AsCarriageReturn a where
-  _CarriageReturn :: Prism' a CarriageReturn
-  _CarriageReturn' :: a
-  _CarriageReturn' = _CarriageReturn # CarriageReturn
-
-instance AsCarriageReturn CarriageReturn where
-  _CarriageReturn = id
-
-instance AsCarriageReturn () where
-  _CarriageReturn =
-    prism'
-      (\CarriageReturn -> ())
-      (\() -> Just CarriageReturn)
-
-instance AsCarriageReturn Char where
-  _CarriageReturn =
-    prism'
-      (\CarriageReturn -> '\13')
-      (\case
-          '\13' -> Just CarriageReturn
-          _ -> Nothing
-      )
-
-instance AsCarriageReturn Int where
-  _CarriageReturn =
-    prism'
-      (\CarriageReturn -> 13)
-      (\case
-          13 -> Just CarriageReturn
-          _ -> Nothing
-      )
-
-instance AsCarriageReturn Integer where
-  _CarriageReturn =
-    prism'
-      (\CarriageReturn -> 13)
-      (\case
-          13 -> Just CarriageReturn
-          _ -> Nothing
-      )
-
-parseCarriageReturn ::
-  CharParsing p =>
-  p CarriageReturn
-parseCarriageReturn =
-  CarriageReturn <$ satisfy (== '\13') <?> "carriage return character"
-
-data Whitespace = Whitespace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasWhitespace a where
-  whitespace :: Lens' a Whitespace
-
-instance HasWhitespace Whitespace where
-  whitespace = id
-
-instance HasWhitespace () where
-  whitespace f x =
-    fmap (\Whitespace -> x) (f Whitespace)
-
-instance Semigroup Whitespace where
-  Whitespace <> Whitespace = Whitespace
-
-instance Monoid Whitespace where
-  mempty = Whitespace
-
-class AsWhitespace a where
-  _Whitespace :: Prism' a Whitespace
-  _Whitespace' :: a
-  _Whitespace' = _Whitespace # Whitespace
-
-instance AsWhitespace Whitespace where
-  _Whitespace = id
-
-instance AsWhitespace () where
-  _Whitespace =
-    prism'
-      (\Whitespace -> ())
-      (\() -> Just Whitespace)
-
-instance AsWhitespace Char where
-  _Whitespace =
-    prism'
-      (\Whitespace -> '\32')
-      (\case
-          '\32' -> Just Whitespace
-          _ -> Nothing
-      )
-
-instance AsWhitespace Int where
-  _Whitespace =
-    prism'
-      (\Whitespace -> 32)
-      (\case
-          32 -> Just Whitespace
-          _ -> Nothing
-      )
-
-instance AsWhitespace Integer where
-  _Whitespace =
-    prism'
-      (\Whitespace -> 32)
-      (\case
-          32 -> Just Whitespace
-          _ -> Nothing
-      )
-
-parseWhitespace ::
-  CharParsing p =>
-  p Whitespace
-parseWhitespace =
-  Whitespace <$ satisfy (== '\32') <?> "whitespace character"
-
-data NoBreakSpace = NoBreakSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasNoBreakSpace a where
-  noBreakSpace :: Lens' a NoBreakSpace
-
-instance HasNoBreakSpace NoBreakSpace where
-  noBreakSpace = id
-
-instance HasNoBreakSpace () where
-  noBreakSpace f x =
-    fmap (\NoBreakSpace -> x) (f NoBreakSpace)
-
-instance Semigroup NoBreakSpace where
-  NoBreakSpace <> NoBreakSpace = NoBreakSpace
-
-instance Monoid NoBreakSpace where
-  mempty = NoBreakSpace
-
-class AsNoBreakSpace a where
-  _NoBreakSpace :: Prism' a NoBreakSpace
-  _NoBreakSpace' :: a
-  _NoBreakSpace' = _NoBreakSpace # NoBreakSpace
-
-instance AsNoBreakSpace NoBreakSpace where
-  _NoBreakSpace = id
-
-instance AsNoBreakSpace () where
-  _NoBreakSpace =
-    prism'
-      (\NoBreakSpace -> ())
-      (\() -> Just NoBreakSpace)
-
-instance AsNoBreakSpace Char where
-  _NoBreakSpace =
-    prism'
-      (\NoBreakSpace -> '\160')
-      (\case
-          '\160' -> Just NoBreakSpace
-          _ -> Nothing
-      )
-
-instance AsNoBreakSpace Int where
-  _NoBreakSpace =
-    prism'
-      (\NoBreakSpace -> 160)
-      (\case
-          160 -> Just NoBreakSpace
-          _ -> Nothing
-      )
-
-instance AsNoBreakSpace Integer where
-  _NoBreakSpace =
-    prism'
-      (\NoBreakSpace -> 160)
-      (\case
-          160 -> Just NoBreakSpace
-          _ -> Nothing
-      )
-
-parseNoBreakSpace ::
-  CharParsing p =>
-  p NoBreakSpace
-parseNoBreakSpace =
-  NoBreakSpace <$ satisfy (== '\160') <?> "no break space character"
-
-data OghamSpaceMark = OghamSpaceMark
-  deriving (Eq, Ord, Show, Generic)
-
-class HasOghamSpaceMark a where
-  oghamSpaceMark :: Lens' a OghamSpaceMark
-
-instance HasOghamSpaceMark OghamSpaceMark where
-  oghamSpaceMark = id
-
-instance HasOghamSpaceMark () where
-  oghamSpaceMark f x =
-    fmap (\OghamSpaceMark -> x) (f OghamSpaceMark)
-
-instance Semigroup OghamSpaceMark where
-  OghamSpaceMark <> OghamSpaceMark = OghamSpaceMark
-
-instance Monoid OghamSpaceMark where
-  mempty = OghamSpaceMark
-
-class AsOghamSpaceMark a where
-  _OghamSpaceMark :: Prism' a OghamSpaceMark
-  _OghamSpaceMark' :: a
-  _OghamSpaceMark' = _OghamSpaceMark # OghamSpaceMark
-
-instance AsOghamSpaceMark OghamSpaceMark where
-  _OghamSpaceMark = id
-
-instance AsOghamSpaceMark () where
-  _OghamSpaceMark =
-    prism'
-      (\OghamSpaceMark -> ())
-      (\() -> Just OghamSpaceMark)
-
-instance AsOghamSpaceMark Char where
-  _OghamSpaceMark =
-    prism'
-      (\OghamSpaceMark -> '\5760')
-      (\case
-          '\5760' -> Just OghamSpaceMark
-          _ -> Nothing
-      )
-
-instance AsOghamSpaceMark Int where
-  _OghamSpaceMark =
-    prism'
-      (\OghamSpaceMark -> 5760)
-      (\case
-          5760 -> Just OghamSpaceMark
-          _ -> Nothing
-      )
-
-instance AsOghamSpaceMark Integer where
-  _OghamSpaceMark =
-    prism'
-      (\OghamSpaceMark -> 5760)
-      (\case
-          5760 -> Just OghamSpaceMark
-          _ -> Nothing
-      )
-
-parseOghamSpaceMark ::
-  CharParsing p =>
-  p OghamSpaceMark
-parseOghamSpaceMark =
-  OghamSpaceMark <$ satisfy (== '\5760') <?> "ogham space mark character"
-
-data EnQuad = EnQuad
-  deriving (Eq, Ord, Show, Generic)
-
-class HasEnQuad a where
-  enQuad :: Lens' a EnQuad
-
-instance HasEnQuad EnQuad where
-  enQuad = id
-
-instance HasEnQuad () where
-  enQuad f x =
-    fmap (\EnQuad -> x) (f EnQuad)
-
-instance Semigroup EnQuad where
-  EnQuad <> EnQuad = EnQuad
-
-instance Monoid EnQuad where
-  mempty = EnQuad
-
-class AsEnQuad a where
-  _EnQuad :: Prism' a EnQuad
-  _EnQuad' :: a
-  _EnQuad' = _EnQuad # EnQuad
-
-instance AsEnQuad EnQuad where
-  _EnQuad = id
-
-instance AsEnQuad () where
-  _EnQuad =
-    prism'
-      (\EnQuad -> ())
-      (\() -> Just EnQuad)
-
-instance AsEnQuad Char where
-  _EnQuad =
-    prism'
-      (\EnQuad -> '\8192')
-      (\case
-          '\8192' -> Just EnQuad
-          _ -> Nothing
-      )
-
-instance AsEnQuad Int where
-  _EnQuad =
-    prism'
-      (\EnQuad -> 8192)
-      (\case
-          8192 -> Just EnQuad
-          _ -> Nothing
-      )
-
-instance AsEnQuad Integer where
-  _EnQuad =
-    prism'
-      (\EnQuad -> 8192)
-      (\case
-          8192 -> Just EnQuad
-          _ -> Nothing
-      )
-
-parseEnQuad ::
-  CharParsing p =>
-  p EnQuad
-parseEnQuad =
-  EnQuad <$ satisfy (== '\8192') <?> "en quad character"
-
-data EmQuad = EmQuad
-  deriving (Eq, Ord, Show, Generic)
-
-class HasEmQuad a where
-  emQuad :: Lens' a EmQuad
-
-instance HasEmQuad EmQuad where
-  emQuad = id
-
-instance HasEmQuad () where
-  emQuad f x =
-    fmap (\EmQuad -> x) (f EmQuad)
-
-instance Semigroup EmQuad where
-  EmQuad <> EmQuad = EmQuad
-
-instance Monoid EmQuad where
-  mempty = EmQuad
-
-class AsEmQuad a where
-  _EmQuad :: Prism' a EmQuad
-  _EmQuad' :: a
-  _EmQuad' = _EmQuad # EmQuad
-
-instance AsEmQuad EmQuad where
-  _EmQuad = id
-
-instance AsEmQuad () where
-  _EmQuad =
-    prism'
-      (\EmQuad -> ())
-      (\() -> Just EmQuad)
-
-instance AsEmQuad Char where
-  _EmQuad =
-    prism'
-      (\EmQuad -> '\8193')
-      (\case
-          '\8193' -> Just EmQuad
-          _ -> Nothing
-      )
-
-instance AsEmQuad Int where
-  _EmQuad =
-    prism'
-      (\EmQuad -> 8193)
-      (\case
-          8193 -> Just EmQuad
-          _ -> Nothing
-      )
-
-instance AsEmQuad Integer where
-  _EmQuad =
-    prism'
-      (\EmQuad -> 8193)
-      (\case
-          8193 -> Just EmQuad
-          _ -> Nothing
-      )
-
-parseEmQuad ::
-  CharParsing p =>
-  p EmQuad
-parseEmQuad =
-  EmQuad <$ satisfy (== '\8193') <?> "em quad character"
-
-data EnSpace = EnSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasEnSpace a where
-  enSpace :: Lens' a EnSpace
-
-instance HasEnSpace EnSpace where
-  enSpace = id
-
-instance HasEnSpace () where
-  enSpace f x =
-    fmap (\EnSpace -> x) (f EnSpace)
-
-instance Semigroup EnSpace where
-  EnSpace <> EnSpace = EnSpace
-
-instance Monoid EnSpace where
-  mempty = EnSpace
-
-class AsEnSpace a where
-  _EnSpace :: Prism' a EnSpace
-  _EnSpace' :: a
-  _EnSpace' = _EnSpace # EnSpace
-
-instance AsEnSpace EnSpace where
-  _EnSpace = id
-
-instance AsEnSpace () where
-  _EnSpace =
-    prism'
-      (\EnSpace -> ())
-      (\() -> Just EnSpace)
-
-instance AsEnSpace Char where
-  _EnSpace =
-    prism'
-      (\EnSpace -> '\8194')
-      (\case
-          '\8194' -> Just EnSpace
-          _ -> Nothing
-      )
-
-instance AsEnSpace Int where
-  _EnSpace =
-    prism'
-      (\EnSpace -> 8194)
-      (\case
-          8194 -> Just EnSpace
-          _ -> Nothing
-      )
-
-instance AsEnSpace Integer where
-  _EnSpace =
-    prism'
-      (\EnSpace -> 8194)
-      (\case
-          8194 -> Just EnSpace
-          _ -> Nothing
-      )
-
-parseEnSpace ::
-  CharParsing p =>
-  p EnSpace
-parseEnSpace =
-  EnSpace <$ satisfy (== '\8194') <?> "en space character"
-
-data EmSpace = EmSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasEmSpace a where
-  emSpace :: Lens' a EmSpace
-
-instance HasEmSpace EmSpace where
-  emSpace = id
-
-instance HasEmSpace () where
-  emSpace f x =
-    fmap (\EmSpace -> x) (f EmSpace)
-
-instance Semigroup EmSpace where
-  EmSpace <> EmSpace = EmSpace
-
-instance Monoid EmSpace where
-  mempty = EmSpace
-
-class AsEmSpace a where
-  _EmSpace :: Prism' a EmSpace
-  _EmSpace' :: a
-  _EmSpace' = _EmSpace # EmSpace
-
-instance AsEmSpace EmSpace where
-  _EmSpace = id
-
-instance AsEmSpace () where
-  _EmSpace =
-    prism'
-      (\EmSpace -> ())
-      (\() -> Just EmSpace)
-
-instance AsEmSpace Char where
-  _EmSpace =
-    prism'
-      (\EmSpace -> '\8195')
-      (\case
-          '\8195' -> Just EmSpace
-          _ -> Nothing
-      )
-
-instance AsEmSpace Int where
-  _EmSpace =
-    prism'
-      (\EmSpace -> 8195)
-      (\case
-          8195 -> Just EmSpace
-          _ -> Nothing
-      )
-
-instance AsEmSpace Integer where
-  _EmSpace =
-    prism'
-      (\EmSpace -> 8195)
-      (\case
-          8195 -> Just EmSpace
-          _ -> Nothing
-      )
-
-parseEmSpace ::
-  CharParsing p =>
-  p EmSpace
-parseEmSpace =
-  EmSpace <$ satisfy (== '\8195') <?> "em space character"
-
-data ThreePerEmSpace = ThreePerEmSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasThreePerEmSpace a where
-  threePerEmSpace :: Lens' a ThreePerEmSpace
-
-instance HasThreePerEmSpace ThreePerEmSpace where
-  threePerEmSpace = id
-
-instance HasThreePerEmSpace () where
-  threePerEmSpace f x =
-    fmap (\ThreePerEmSpace -> x) (f ThreePerEmSpace)
-
-instance Semigroup ThreePerEmSpace where
-  ThreePerEmSpace <> ThreePerEmSpace = ThreePerEmSpace
-
-instance Monoid ThreePerEmSpace where
-  mempty = ThreePerEmSpace
-
-class AsThreePerEmSpace a where
-  _ThreePerEmSpace :: Prism' a ThreePerEmSpace
-  _ThreePerEmSpace' :: a
-  _ThreePerEmSpace' = _ThreePerEmSpace # ThreePerEmSpace
-
-instance AsThreePerEmSpace ThreePerEmSpace where
-  _ThreePerEmSpace = id
-
-instance AsThreePerEmSpace () where
-  _ThreePerEmSpace =
-    prism'
-      (\ThreePerEmSpace -> ())
-      (\() -> Just ThreePerEmSpace)
-
-instance AsThreePerEmSpace Char where
-  _ThreePerEmSpace =
-    prism'
-      (\ThreePerEmSpace -> '\8196')
-      (\case
-          '\8196' -> Just ThreePerEmSpace
-          _ -> Nothing
-      )
-
-instance AsThreePerEmSpace Int where
-  _ThreePerEmSpace =
-    prism'
-      (\ThreePerEmSpace -> 8196)
-      (\case
-          8196 -> Just ThreePerEmSpace
-          _ -> Nothing
-      )
-
-instance AsThreePerEmSpace Integer where
-  _ThreePerEmSpace =
-    prism'
-      (\ThreePerEmSpace -> 8196)
-      (\case
-          8196 -> Just ThreePerEmSpace
-          _ -> Nothing
-      )
-
-parseThreePerEmSpace ::
-  CharParsing p =>
-  p ThreePerEmSpace
-parseThreePerEmSpace =
-  ThreePerEmSpace <$ satisfy (== '\8196') <?> "three per em space character"
-
-data FourPerEmSpace = FourPerEmSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasFourPerEmSpace a where
-  fourPerEmSpace :: Lens' a FourPerEmSpace
-
-instance HasFourPerEmSpace FourPerEmSpace where
-  fourPerEmSpace = id
-
-instance HasFourPerEmSpace () where
-  fourPerEmSpace f x =
-    fmap (\FourPerEmSpace -> x) (f FourPerEmSpace)
-
-instance Semigroup FourPerEmSpace where
-  FourPerEmSpace <> FourPerEmSpace = FourPerEmSpace
-
-instance Monoid FourPerEmSpace where
-  mempty = FourPerEmSpace
-
-class AsFourPerEmSpace a where
-  _FourPerEmSpace :: Prism' a FourPerEmSpace
-  _FourPerEmSpace' :: a
-  _FourPerEmSpace' = _FourPerEmSpace # FourPerEmSpace
-
-instance AsFourPerEmSpace FourPerEmSpace where
-  _FourPerEmSpace = id
-
-instance AsFourPerEmSpace () where
-  _FourPerEmSpace =
-    prism'
-      (\FourPerEmSpace -> ())
-      (\() -> Just FourPerEmSpace)
-
-instance AsFourPerEmSpace Char where
-  _FourPerEmSpace =
-    prism'
-      (\FourPerEmSpace -> '\8197')
-      (\case
-          '\8197' -> Just FourPerEmSpace
-          _ -> Nothing
-      )
-
-instance AsFourPerEmSpace Int where
-  _FourPerEmSpace =
-    prism'
-      (\FourPerEmSpace -> 8197)
-      (\case
-          8197 -> Just FourPerEmSpace
-          _ -> Nothing
-      )
-
-instance AsFourPerEmSpace Integer where
-  _FourPerEmSpace =
-    prism'
-      (\FourPerEmSpace -> 8197)
-      (\case
-          8197 -> Just FourPerEmSpace
-          _ -> Nothing
-      )
-
-parseFourPerEmSpace ::
-  CharParsing p =>
-  p FourPerEmSpace
-parseFourPerEmSpace =
-  FourPerEmSpace <$ satisfy (== '\8197') <?> "four per em space character"
-
-data SixPerEmSpace = SixPerEmSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasSixPerEmSpace a where
-  sixPerEmSpace :: Lens' a SixPerEmSpace
-
-instance HasSixPerEmSpace SixPerEmSpace where
-  sixPerEmSpace = id
-
-instance HasSixPerEmSpace () where
-  sixPerEmSpace f x =
-    fmap (\SixPerEmSpace -> x) (f SixPerEmSpace)
-
-instance Semigroup SixPerEmSpace where
-  SixPerEmSpace <> SixPerEmSpace = SixPerEmSpace
-
-instance Monoid SixPerEmSpace where
-  mempty = SixPerEmSpace
-
-class AsSixPerEmSpace a where
-  _SixPerEmSpace :: Prism' a SixPerEmSpace
-  _SixPerEmSpace' :: a
-  _SixPerEmSpace' = _SixPerEmSpace # SixPerEmSpace
-
-instance AsSixPerEmSpace SixPerEmSpace where
-  _SixPerEmSpace = id
-
-instance AsSixPerEmSpace () where
-  _SixPerEmSpace =
-    prism'
-      (\SixPerEmSpace -> ())
-      (\() -> Just SixPerEmSpace)
-
-instance AsSixPerEmSpace Char where
-  _SixPerEmSpace =
-    prism'
-      (\SixPerEmSpace -> '\8198')
-      (\case
-          '\8198' -> Just SixPerEmSpace
-          _ -> Nothing
-      )
-
-instance AsSixPerEmSpace Int where
-  _SixPerEmSpace =
-    prism'
-      (\SixPerEmSpace -> 8198)
-      (\case
-          8198 -> Just SixPerEmSpace
-          _ -> Nothing
-      )
-
-instance AsSixPerEmSpace Integer where
-  _SixPerEmSpace =
-    prism'
-      (\SixPerEmSpace -> 8198)
-      (\case
-          8198 -> Just SixPerEmSpace
-          _ -> Nothing
-      )
-
-parseSixPerEmSpace ::
-  CharParsing p =>
-  p SixPerEmSpace
-parseSixPerEmSpace =
-  SixPerEmSpace <$ satisfy (== '\8198') <?> "six per em space character"
-
-data FigureSpace = FigureSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasFigureSpace a where
-  figureSpace :: Lens' a FigureSpace
-
-instance HasFigureSpace FigureSpace where
-  figureSpace = id
-
-instance HasFigureSpace () where
-  figureSpace f x =
-    fmap (\FigureSpace -> x) (f FigureSpace)
-
-instance Semigroup FigureSpace where
-  FigureSpace <> FigureSpace = FigureSpace
-
-instance Monoid FigureSpace where
-  mempty = FigureSpace
-
-class AsFigureSpace a where
-  _FigureSpace :: Prism' a FigureSpace
-  _FigureSpace' :: a
-  _FigureSpace' = _FigureSpace # FigureSpace
-
-instance AsFigureSpace FigureSpace where
-  _FigureSpace = id
-
-instance AsFigureSpace () where
-  _FigureSpace =
-    prism'
-      (\FigureSpace -> ())
-      (\() -> Just FigureSpace)
-
-instance AsFigureSpace Char where
-  _FigureSpace =
-    prism'
-      (\FigureSpace -> '\8199')
-      (\case
-          '\8199' -> Just FigureSpace
-          _ -> Nothing
-      )
-
-instance AsFigureSpace Int where
-  _FigureSpace =
-    prism'
-      (\FigureSpace -> 8199)
-      (\case
-          8199 -> Just FigureSpace
-          _ -> Nothing
-      )
-
-instance AsFigureSpace Integer where
-  _FigureSpace =
-    prism'
-      (\FigureSpace -> 8199)
-      (\case
-          8199 -> Just FigureSpace
-          _ -> Nothing
-      )
-
-parseFigureSpace ::
-  CharParsing p =>
-  p FigureSpace
-parseFigureSpace =
-  FigureSpace <$ satisfy (== '\8199') <?> "figure space character"
-
-data PunctuationSpace = PunctuationSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasPunctuationSpace a where
-  punctuationSpace :: Lens' a PunctuationSpace
-
-instance HasPunctuationSpace PunctuationSpace where
-  punctuationSpace = id
-
-instance HasPunctuationSpace () where
-  punctuationSpace f x =
-    fmap (\PunctuationSpace -> x) (f PunctuationSpace)
-
-instance Semigroup PunctuationSpace where
-  PunctuationSpace <> PunctuationSpace = PunctuationSpace
-
-instance Monoid PunctuationSpace where
-  mempty = PunctuationSpace
-
-class AsPunctuationSpace a where
-  _PunctuationSpace :: Prism' a PunctuationSpace
-  _PunctuationSpace' :: a
-  _PunctuationSpace' = _PunctuationSpace # PunctuationSpace
-
-instance AsPunctuationSpace PunctuationSpace where
-  _PunctuationSpace = id
-
-instance AsPunctuationSpace () where
-  _PunctuationSpace =
-    prism'
-      (\PunctuationSpace -> ())
-      (\() -> Just PunctuationSpace)
-
-instance AsPunctuationSpace Char where
-  _PunctuationSpace =
-    prism'
-      (\PunctuationSpace -> '\8200')
-      (\case
-          '\8200' -> Just PunctuationSpace
-          _ -> Nothing
-      )
-
-instance AsPunctuationSpace Int where
-  _PunctuationSpace =
-    prism'
-      (\PunctuationSpace -> 8200)
-      (\case
-          8200 -> Just PunctuationSpace
-          _ -> Nothing
-      )
-
-instance AsPunctuationSpace Integer where
-  _PunctuationSpace =
-    prism'
-      (\PunctuationSpace -> 8200)
-      (\case
-          8200 -> Just PunctuationSpace
-          _ -> Nothing
-      )
-
-parsePunctuationSpace ::
-  CharParsing p =>
-  p PunctuationSpace
-parsePunctuationSpace =
-  PunctuationSpace <$ satisfy (== '\8200') <?> "punctuation space character"
-
-data ThinSpace = ThinSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasThinSpace a where
-  thinSpace :: Lens' a ThinSpace
-
-instance HasThinSpace ThinSpace where
-  thinSpace = id
-
-instance HasThinSpace () where
-  thinSpace f x =
-    fmap (\ThinSpace -> x) (f ThinSpace)
-
-instance Semigroup ThinSpace where
-  ThinSpace <> ThinSpace = ThinSpace
-
-instance Monoid ThinSpace where
-  mempty = ThinSpace
-
-class AsThinSpace a where
-  _ThinSpace :: Prism' a ThinSpace
-  _ThinSpace' :: a
-  _ThinSpace' = _ThinSpace # ThinSpace
-
-instance AsThinSpace ThinSpace where
-  _ThinSpace = id
-
-instance AsThinSpace () where
-  _ThinSpace =
-    prism'
-      (\ThinSpace -> ())
-      (\() -> Just ThinSpace)
-
-instance AsThinSpace Char where
-  _ThinSpace =
-    prism'
-      (\ThinSpace -> '\8201')
-      (\case
-          '\8201' -> Just ThinSpace
-          _ -> Nothing
-      )
-
-instance AsThinSpace Int where
-  _ThinSpace =
-    prism'
-      (\ThinSpace -> 8201)
-      (\case
-          8201 -> Just ThinSpace
-          _ -> Nothing
-      )
-
-instance AsThinSpace Integer where
-  _ThinSpace =
-    prism'
-      (\ThinSpace -> 8201)
-      (\case
-          8201 -> Just ThinSpace
-          _ -> Nothing
-      )
-
-parseThinSpace ::
-  CharParsing p =>
-  p ThinSpace
-parseThinSpace =
-  ThinSpace <$ satisfy (== '\8201') <?> "thin space character"
-
-data HairSpace = HairSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasHairSpace a where
-  hairSpace :: Lens' a HairSpace
-
-instance HasHairSpace HairSpace where
-  hairSpace = id
-
-instance HasHairSpace () where
-  hairSpace f x =
-    fmap (\HairSpace -> x) (f HairSpace)
-
-instance Semigroup HairSpace where
-  HairSpace <> HairSpace = HairSpace
-
-instance Monoid HairSpace where
-  mempty = HairSpace
-
-class AsHairSpace a where
-  _HairSpace :: Prism' a HairSpace
-  _HairSpace' :: a
-  _HairSpace' = _HairSpace # HairSpace
-
-instance AsHairSpace HairSpace where
-  _HairSpace = id
-
-instance AsHairSpace () where
-  _HairSpace =
-    prism'
-      (\HairSpace -> ())
-      (\() -> Just HairSpace)
-
-instance AsHairSpace Char where
-  _HairSpace =
-    prism'
-      (\HairSpace -> '\8202')
-      (\case
-          '\8202' -> Just HairSpace
-          _ -> Nothing
-      )
-
-instance AsHairSpace Int where
-  _HairSpace =
-    prism'
-      (\HairSpace -> 8202)
-      (\case
-          8202 -> Just HairSpace
-          _ -> Nothing
-      )
-
-instance AsHairSpace Integer where
-  _HairSpace =
-    prism'
-      (\HairSpace -> 8202)
-      (\case
-          8202 -> Just HairSpace
-          _ -> Nothing
-      )
-
-parseHairSpace ::
-  CharParsing p =>
-  p HairSpace
-parseHairSpace =
-  HairSpace <$ satisfy (== '\8202') <?> "hair space character"
-
-data NarrowNoBreakSpace = NarrowNoBreakSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasNarrowNoBreakSpace a where
-  narrowNoBreakSpace :: Lens' a NarrowNoBreakSpace
-
-instance HasNarrowNoBreakSpace NarrowNoBreakSpace where
-  narrowNoBreakSpace = id
-
-instance HasNarrowNoBreakSpace () where
-  narrowNoBreakSpace f x =
-    fmap (\NarrowNoBreakSpace -> x) (f NarrowNoBreakSpace)
-
-instance Semigroup NarrowNoBreakSpace where
-  NarrowNoBreakSpace <> NarrowNoBreakSpace = NarrowNoBreakSpace
-
-instance Monoid NarrowNoBreakSpace where
-  mempty = NarrowNoBreakSpace
-
-class AsNarrowNoBreakSpace a where
-  _NarrowNoBreakSpace :: Prism' a NarrowNoBreakSpace
-  _NarrowNoBreakSpace' :: a
-  _NarrowNoBreakSpace' = _NarrowNoBreakSpace # NarrowNoBreakSpace
-
-instance AsNarrowNoBreakSpace NarrowNoBreakSpace where
-  _NarrowNoBreakSpace = id
-
-instance AsNarrowNoBreakSpace () where
-  _NarrowNoBreakSpace =
-    prism'
-      (\NarrowNoBreakSpace -> ())
-      (\() -> Just NarrowNoBreakSpace)
-
-instance AsNarrowNoBreakSpace Char where
-  _NarrowNoBreakSpace =
-    prism'
-      (\NarrowNoBreakSpace -> '\8239')
-      (\case
-          '\8239' -> Just NarrowNoBreakSpace
-          _ -> Nothing
-      )
-
-instance AsNarrowNoBreakSpace Int where
-  _NarrowNoBreakSpace =
-    prism'
-      (\NarrowNoBreakSpace -> 8239)
-      (\case
-          8239 -> Just NarrowNoBreakSpace
-          _ -> Nothing
-      )
-
-instance AsNarrowNoBreakSpace Integer where
-  _NarrowNoBreakSpace =
-    prism'
-      (\NarrowNoBreakSpace -> 8239)
-      (\case
-          8239 -> Just NarrowNoBreakSpace
-          _ -> Nothing
-      )
-
-parseNarrowNoBreakSpace ::
-  CharParsing p =>
-  p NarrowNoBreakSpace
-parseNarrowNoBreakSpace =
-  NarrowNoBreakSpace <$ satisfy (== '\8239') <?> "narrow no break space character"
-
-data MediumMathematicalSpace = MediumMathematicalSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasMediumMathematicalSpace a where
-  mediumMathematicalSpace :: Lens' a MediumMathematicalSpace
-
-instance HasMediumMathematicalSpace MediumMathematicalSpace where
-  mediumMathematicalSpace = id
-
-instance HasMediumMathematicalSpace () where
-  mediumMathematicalSpace f x =
-    fmap (\MediumMathematicalSpace -> x) (f MediumMathematicalSpace)
-
-instance Semigroup MediumMathematicalSpace where
-  MediumMathematicalSpace <> MediumMathematicalSpace = MediumMathematicalSpace
-
-instance Monoid MediumMathematicalSpace where
-  mempty = MediumMathematicalSpace
-
-class AsMediumMathematicalSpace a where
-  _MediumMathematicalSpace :: Prism' a MediumMathematicalSpace
-  _MediumMathematicalSpace' :: a
-  _MediumMathematicalSpace' = _MediumMathematicalSpace # MediumMathematicalSpace
-
-instance AsMediumMathematicalSpace MediumMathematicalSpace where
-  _MediumMathematicalSpace = id
-
-instance AsMediumMathematicalSpace () where
-  _MediumMathematicalSpace =
-    prism'
-      (\MediumMathematicalSpace -> ())
-      (\() -> Just MediumMathematicalSpace)
-
-instance AsMediumMathematicalSpace Char where
-  _MediumMathematicalSpace =
-    prism'
-      (\MediumMathematicalSpace -> '\8287')
-      (\case
-          '\8287' -> Just MediumMathematicalSpace
-          _ -> Nothing
-      )
-
-instance AsMediumMathematicalSpace Int where
-  _MediumMathematicalSpace =
-    prism'
-      (\MediumMathematicalSpace -> 8287)
-      (\case
-          8287 -> Just MediumMathematicalSpace
-          _ -> Nothing
-      )
-
-instance AsMediumMathematicalSpace Integer where
-  _MediumMathematicalSpace =
-    prism'
-      (\MediumMathematicalSpace -> 8287)
-      (\case
-          8287 -> Just MediumMathematicalSpace
-          _ -> Nothing
-      )
-
-parseMediumMathematicalSpace ::
-  CharParsing p =>
-  p MediumMathematicalSpace
-parseMediumMathematicalSpace =
-  MediumMathematicalSpace <$ satisfy (== '\8287') <?> "medium mathematical space character"
-
-data IdeographicSpace = IdeographicSpace
-  deriving (Eq, Ord, Show, Generic)
-
-class HasIdeographicSpace a where
-  ideographicSpace :: Lens' a IdeographicSpace
-
-instance HasIdeographicSpace IdeographicSpace where
-  ideographicSpace = id
-
-instance HasIdeographicSpace () where
-  ideographicSpace f x =
-    fmap (\IdeographicSpace -> x) (f IdeographicSpace)
-
-instance Semigroup IdeographicSpace where
-  IdeographicSpace <> IdeographicSpace = IdeographicSpace
-
-instance Monoid IdeographicSpace where
-  mempty = IdeographicSpace
-
-class AsIdeographicSpace a where
-  _IdeographicSpace :: Prism' a IdeographicSpace
-  _IdeographicSpace' :: a
-  _IdeographicSpace' = _IdeographicSpace # IdeographicSpace
-
-instance AsIdeographicSpace IdeographicSpace where
-  _IdeographicSpace = id
-
-instance AsIdeographicSpace () where
-  _IdeographicSpace =
-    prism'
-      (\IdeographicSpace -> ())
-      (\() -> Just IdeographicSpace)
-
-instance AsIdeographicSpace Char where
-  _IdeographicSpace =
-    prism'
-      (\IdeographicSpace -> '\12288')
-      (\case
-          '\12288' -> Just IdeographicSpace
-          _ -> Nothing
-      )
-
-instance AsIdeographicSpace Int where
-  _IdeographicSpace =
-    prism'
-      (\IdeographicSpace -> 12288)
-      (\case
-          12288 -> Just IdeographicSpace
-          _ -> Nothing
-      )
-
-instance AsIdeographicSpace Integer where
-  _IdeographicSpace =
-    prism'
-      (\IdeographicSpace -> 12288)
-      (\case
-          12288 -> Just IdeographicSpace
-          _ -> Nothing
-      )
-
-parseIdeographicSpace ::
-  CharParsing p =>
-  p IdeographicSpace
-parseIdeographicSpace =
-  IdeographicSpace <$ satisfy (== '\12288') <?> "ideographic space character"
-
-data SpaceChar =
-  HorizontalTab_
-  | LineFeed_
-  | VerticalTab_
-  | FormFeed_
-  | CarriageReturn_
-  | Whitespace_
-  | NoBreakSpace_
-  | OghamSpaceMark_
-  | EnQuad_
-  | EmQuad_
-  | EnSpace_
-  | EmSpace_
-  | ThreePerEmSpace_
-  | FourPerEmSpace_
-  | SixPerEmSpace_
-  | FigureSpace_
-  | PunctuationSpace_
-  | ThinSpace_
-  | HairSpace_
-  | NarrowNoBreakSpace_
-  | MediumMathematicalSpace_
-  | IdeographicSpace_
-  deriving (Eq, Ord, Show, Generic)
-
-class HasSpaceChar a where
-  spaceChar :: Lens' a SpaceChar
-
-instance HasSpaceChar SpaceChar where
-  spaceChar = id
-
-class AsSpaceChar a where
-  _SpaceChar :: Prism' a SpaceChar
-
-instance AsSpaceChar SpaceChar where
-  _SpaceChar = id
-
-instance AsSpaceChar Char where
-  _SpaceChar =
-    prism'
-      (\case
-        HorizontalTab_ ->
-          '\9'
-        LineFeed_ ->
-          '\10'
-        VerticalTab_ ->
-          '\11'
-        FormFeed_ ->
-          '\12'
-        CarriageReturn_ ->
-          '\13'
-        Whitespace_ ->
-          '\32'
-        NoBreakSpace_ ->
-          '\160'
-        OghamSpaceMark_ ->
-          '\5760'
-        EnQuad_ ->
-          '\8192'
-        EmQuad_ ->
-          '\8193'
-        EnSpace_ ->
-          '\8194'
-        EmSpace_ ->
-          '\8195'
-        ThreePerEmSpace_ ->
-          '\8196'
-        FourPerEmSpace_ ->
-          '\8197'
-        SixPerEmSpace_ ->
-          '\8198'
-        FigureSpace_ ->
-          '\8199'
-        PunctuationSpace_ ->
-          '\8200'
-        ThinSpace_ ->
-          '\8201'
-        HairSpace_ ->
-          '\8202'
-        NarrowNoBreakSpace_ ->
-          '\8239'
-        MediumMathematicalSpace_ ->
-          '\8287'
-        IdeographicSpace_ ->
-          '\12288'
-      )
-      (\case
-        '\9' ->
-          Just HorizontalTab_
-        '\10' ->
-          Just LineFeed_
-        '\11' ->
-          Just VerticalTab_
-        '\12' ->
-          Just FormFeed_
-        '\13' ->
-          Just CarriageReturn_
-        '\32' ->
-          Just Whitespace_
-        '\160' ->
-          Just NoBreakSpace_
-        '\5760' ->
-          Just OghamSpaceMark_
-        '\8192' ->
-          Just EnQuad_
-        '\8193' ->
-          Just EmQuad_
-        '\8194' ->
-          Just EnSpace_
-        '\8195' ->
-          Just EmSpace_
-        '\8196' ->
-          Just ThreePerEmSpace_
-        '\8197' ->
-          Just FourPerEmSpace_
-        '\8198' ->
-          Just SixPerEmSpace_
-        '\8199' ->
-          Just FigureSpace_
-        '\8200' ->
-          Just PunctuationSpace_
-        '\8201' ->
-          Just ThinSpace_
-        '\8202' ->
-          Just HairSpace_
-        '\8239' ->
-          Just NarrowNoBreakSpace_
-        '\8287' ->
-          Just MediumMathematicalSpace_
-        '\12288' ->
-          Just IdeographicSpace_
-        _ ->
-          Nothing
-      )
-
-parseSpaceChar ::
-  CharParsing p =>
-  p SpaceChar
-parseSpaceChar =
-  asum [
-    HorizontalTab_ <$ parseHorizontalTab
-  , LineFeed_ <$ parseLineFeed
-  , VerticalTab_ <$ parseVerticalTab
-  , FormFeed_ <$ parseFormFeed
-  , CarriageReturn_ <$ parseCarriageReturn
-  , Whitespace_ <$ parseWhitespace
-  , NoBreakSpace_ <$ parseNoBreakSpace
-  , OghamSpaceMark_ <$ parseOghamSpaceMark
-  , EnQuad_ <$ parseEnQuad
-  , EmQuad_ <$ parseEmQuad
-  , EnSpace_ <$ parseEnSpace
-  , EmSpace_ <$ parseEmSpace
-  , ThreePerEmSpace_ <$ parseThreePerEmSpace
-  , FourPerEmSpace_ <$ parseFourPerEmSpace
-  , SixPerEmSpace_ <$ parseSixPerEmSpace
-  , FigureSpace_ <$ parseFigureSpace
-  , PunctuationSpace_ <$ parsePunctuationSpace
-  , ThinSpace_ <$ parseThinSpace
-  , HairSpace_ <$ parseHairSpace
-  , NarrowNoBreakSpace_ <$ parseNarrowNoBreakSpace
-  , MediumMathematicalSpace_ <$ parseMediumMathematicalSpace
-  , IdeographicSpace_ <$ parseIdeographicSpace
-  ]
-
-instance AsHorizontalTab SpaceChar where
-  _HorizontalTab =
-    prism'
-      (\HorizontalTab -> HorizontalTab_)
-      (\case
-          HorizontalTab_ -> Just HorizontalTab
-          _ -> Nothing
-      )
-
-instance AsLineFeed SpaceChar where
-  _LineFeed =
-    prism'
-      (\LineFeed -> LineFeed_)
-      (\case
-          LineFeed_ -> Just LineFeed
-          _ -> Nothing
-      )
-
-instance AsVerticalTab SpaceChar where
-  _VerticalTab =
-    prism'
-      (\VerticalTab -> VerticalTab_)
-      (\case
-          VerticalTab_ -> Just VerticalTab
-          _ -> Nothing
-      )
-
-instance AsFormFeed SpaceChar where
-  _FormFeed =
-    prism'
-      (\FormFeed -> FormFeed_)
-      (\case
-          FormFeed_ -> Just FormFeed
-          _ -> Nothing
-      )
-
-instance AsCarriageReturn SpaceChar where
-  _CarriageReturn =
-    prism'
-      (\CarriageReturn -> CarriageReturn_)
-      (\case
-          CarriageReturn_ -> Just CarriageReturn
-          _ -> Nothing
-      )
-
-instance AsWhitespace SpaceChar where
-  _Whitespace =
-    prism'
-      (\Whitespace -> Whitespace_)
-      (\case
-          Whitespace_ -> Just Whitespace
-          _ -> Nothing
-      )
-
-instance AsNoBreakSpace SpaceChar where
-  _NoBreakSpace =
-    prism'
-      (\NoBreakSpace -> NoBreakSpace_)
-      (\case
-          NoBreakSpace_ -> Just NoBreakSpace
-          _ -> Nothing
-      )
-
-instance AsOghamSpaceMark SpaceChar where
-  _OghamSpaceMark =
-    prism'
-      (\OghamSpaceMark -> OghamSpaceMark_)
-      (\case
-          OghamSpaceMark_ -> Just OghamSpaceMark
-          _ -> Nothing
-      )
-
-instance AsEnQuad SpaceChar where
-  _EnQuad =
-    prism'
-      (\EnQuad -> EnQuad_)
-      (\case
-          EnQuad_ -> Just EnQuad
-          _ -> Nothing
-      )
-
-instance AsEmQuad SpaceChar where
-  _EmQuad =
-    prism'
-      (\EmQuad -> EmQuad_)
-      (\case
-          EmQuad_ -> Just EmQuad
-          _ -> Nothing
-      )
-
-instance AsEnSpace SpaceChar where
-  _EnSpace =
-    prism'
-      (\EnSpace -> EnSpace_)
-      (\case
-          EnSpace_ -> Just EnSpace
-          _ -> Nothing
-      )
-
-instance AsEmSpace SpaceChar where
-  _EmSpace =
-    prism'
-      (\EmSpace -> EmSpace_)
-      (\case
-          EmSpace_ -> Just EmSpace
-          _ -> Nothing
-      )
-
-instance AsThreePerEmSpace SpaceChar where
-  _ThreePerEmSpace =
-    prism'
-      (\ThreePerEmSpace -> ThreePerEmSpace_)
-      (\case
-          ThreePerEmSpace_ -> Just ThreePerEmSpace
-          _ -> Nothing
-      )
-
-instance AsFourPerEmSpace SpaceChar where
-  _FourPerEmSpace =
-    prism'
-      (\FourPerEmSpace -> FourPerEmSpace_)
-      (\case
-          FourPerEmSpace_ -> Just FourPerEmSpace
-          _ -> Nothing
-      )
-
-instance AsSixPerEmSpace SpaceChar where
-  _SixPerEmSpace =
-    prism'
-      (\SixPerEmSpace -> SixPerEmSpace_)
-      (\case
-          SixPerEmSpace_ -> Just SixPerEmSpace
-          _ -> Nothing
-      )
-
-instance AsFigureSpace SpaceChar where
-  _FigureSpace =
-    prism'
-      (\FigureSpace -> FigureSpace_)
-      (\case
-          FigureSpace_ -> Just FigureSpace
-          _ -> Nothing
-      )
-
-instance AsPunctuationSpace SpaceChar where
-  _PunctuationSpace =
-    prism'
-      (\PunctuationSpace -> PunctuationSpace_)
-      (\case
-          PunctuationSpace_ -> Just PunctuationSpace
-          _ -> Nothing
-      )
-
-instance AsThinSpace SpaceChar where
-  _ThinSpace =
-    prism'
-      (\ThinSpace -> ThinSpace_)
-      (\case
-          ThinSpace_ -> Just ThinSpace
-          _ -> Nothing
-      )
-
-instance AsHairSpace SpaceChar where
-  _HairSpace =
-    prism'
-      (\HairSpace -> HairSpace_)
-      (\case
-          HairSpace_ -> Just HairSpace
-          _ -> Nothing
-      )
-
-instance AsNarrowNoBreakSpace SpaceChar where
-  _NarrowNoBreakSpace =
-    prism'
-      (\NarrowNoBreakSpace -> NarrowNoBreakSpace_)
-      (\case
-          NarrowNoBreakSpace_ -> Just NarrowNoBreakSpace
-          _ -> Nothing
-      )
-
-instance AsMediumMathematicalSpace SpaceChar where
-  _MediumMathematicalSpace =
-    prism'
-      (\MediumMathematicalSpace -> MediumMathematicalSpace_)
-      (\case
-          MediumMathematicalSpace_ -> Just MediumMathematicalSpace
-          _ -> Nothing
-      )
-
-instance AsIdeographicSpace SpaceChar where
-  _IdeographicSpace =
-    prism'
-      (\IdeographicSpace -> IdeographicSpace_)
-      (\case
-          IdeographicSpace_ -> Just IdeographicSpace
-          _ -> Nothing
-      )
-
-data IsoLatin1 =
-  HorizontalTab__
-  | LineFeed__
-  | FormFeed__
-  | CarriageReturn__
-  | Whitespace__
-  deriving (Eq, Ord, Show, Generic)
-
-class HasIsoLatin1 a where
-  isoLatin1 :: Lens' a IsoLatin1
-
-instance HasIsoLatin1 IsoLatin1 where
-  isoLatin1 = id
-
-class AsIsoLatin1 a where
-  _IsoLatin1 :: Prism' a IsoLatin1
-
-instance AsIsoLatin1 Char where
-  _IsoLatin1 =
-    prism'
-      (\case
-        HorizontalTab__ ->
-          '\9'
-        LineFeed__ ->
-          '\10'
-        FormFeed__ ->
-          '\12'
-        CarriageReturn__ ->
-          '\13'
-        Whitespace__ ->
-          '\32'
-      )
-      (\case
-        '\9' ->
-          Just HorizontalTab__
-        '\10' ->
-          Just LineFeed__
-        '\12' ->
-          Just FormFeed__
-        '\13' ->
-          Just CarriageReturn__
-        '\32' ->
-          Just Whitespace__
-        _ ->
-          Nothing
-      )
-
-instance AsIsoLatin1 IsoLatin1 where
-  _IsoLatin1 = id
-
-parseIsoLatin1 ::
-  CharParsing p =>
-  p IsoLatin1
-parseIsoLatin1 =
-  asum [
-    HorizontalTab__ <$ parseHorizontalTab
-  , LineFeed__ <$ parseLineFeed
-  , FormFeed__ <$ parseFormFeed
-  , CarriageReturn__ <$ parseCarriageReturn
-  , Whitespace__ <$ parseWhitespace
-  ]
-
-instance AsHorizontalTab IsoLatin1 where
-  _HorizontalTab =
-    prism'
-      (\HorizontalTab -> HorizontalTab__)
-      (\case
-          HorizontalTab__ -> Just HorizontalTab
-          _ -> Nothing
-      )
-
-instance AsLineFeed IsoLatin1 where
-  _LineFeed =
-    prism'
-      (\LineFeed -> LineFeed__)
-      (\case
-          LineFeed__ -> Just LineFeed
-          _ -> Nothing
-      )
-
-instance AsFormFeed IsoLatin1 where
-  _FormFeed =
-    prism'
-      (\FormFeed -> FormFeed__)
-      (\case
-          FormFeed__ -> Just FormFeed
-          _ -> Nothing
-      )
-
-instance AsCarriageReturn IsoLatin1 where
-  _CarriageReturn =
-    prism'
-      (\CarriageReturn -> CarriageReturn__)
-      (\case
-          CarriageReturn__ -> Just CarriageReturn
-          _ -> Nothing
-      )
-
-instance AsWhitespace IsoLatin1 where
-  _Whitespace =
-    prism'
-      (\Whitespace -> Whitespace__)
-      (\case
-          Whitespace__ -> Just Whitespace
-          _ -> Nothing
-      )
+  HasHorizontalTab(..)
+, AsHorizontalTab(..)
+, parseHorizontalTab
+, HasLineFeed(..)
+, AsLineFeed(..)
+, parseLineFeed
+, HasVerticalTab(..)
+, AsVerticalTab(..)
+, parseVerticalTab
+, HasFormFeed(..)
+, AsFormFeed(..)
+, parseFormFeed
+, HasCarriageReturn(..)
+, AsCarriageReturn(..)
+, parseCarriageReturn
+, HasWhitespace(..)
+, AsWhitespace(..)
+, parseWhitespace
+, HasNoBreakSpace(..)
+, AsNoBreakSpace(..)
+, parseNoBreakSpace
+, HasOghamSpaceMark(..)
+, AsOghamSpaceMark(..)
+, parseOghamSpaceMark
+, HasEnQuad(..)
+, AsEnQuad(..)
+, parseEnQuad
+, HasEmQuad(..)
+, AsEmQuad(..)
+, parseEmQuad
+, HasEnSpace(..)
+, AsEnSpace(..)
+, parseEnSpace
+, HasEmSpace(..)
+, AsEmSpace(..)
+, parseEmSpace
+, HasThreePerEmSpace(..)
+, AsThreePerEmSpace(..)
+, parseThreePerEmSpace
+, HasFourPerEmSpace(..)
+, AsFourPerEmSpace(..)
+, parseFourPerEmSpace
+, HasSixPerEmSpace(..)
+, AsSixPerEmSpace(..)
+, parseSixPerEmSpace
+, HasFigureSpace(..)
+, AsFigureSpace(..)
+, parseFigureSpace
+, HasPunctuationSpace(..)
+, AsPunctuationSpace(..)
+, parsePunctuationSpace
+, HasThinSpace(..)
+, AsThinSpace(..)
+, parseThinSpace
+, HasHairSpace(..)
+, AsHairSpace(..)
+, parseHairSpace
+, HasNarrowNoBreakSpace(..)
+, AsNarrowNoBreakSpace(..)
+, parseNarrowNoBreakSpace
+, HasMediumMathematicalSpace(..)
+, AsMediumMathematicalSpace(..)
+, parseMediumMathematicalSpace
+, HasIdeographicSpace(..)
+, AsIdeographicSpace(..)
+, parseIdeographicSpace
+-- * All space characters
+, SpaceChar(..)
+, HasSpaceChar(..)
+, AsSpaceChar(..)
+, parseSpaceChar
+-- * ISO Latin-1 space characters /(horizontal tab, line feed, form feed, carriage return, whitespace)/
+, IsoLatin1(..)
+, HasIsoLatin1(..)
+, AsIsoLatin1(..)
+, parseIsoLatin1
+) where
+
+import Control.Category ( Category(id) )
+import Control.Lens ( Prism', prism', (#), Lens' )
+import Data.Bool ( Bool )
+import Data.Char ( Char )
+import Data.Eq ( Eq((==)) )
+import Data.Int ( Int )
+import Data.Foldable ( asum )
+import Data.Functor ( Functor((<$)) )
+import Data.Maybe ( Maybe(Nothing, Just) )
+import Data.Ord ( Ord )
+import GHC.Generics ( Generic )
+import GHC.Show ( Show )
+import Prelude(Integer)
+import Text.Parser.Char ( CharParsing(satisfy) )
+import Text.Parser.Combinators ( Parsing((<?>)) )
+
+class HasHorizontalTab a where
+  horizontalTab :: Lens' a ()
+
+instance HasHorizontalTab () where
+  horizontalTab =
+    id
+
+class AsHorizontalTab a where
+  _HorizontalTab :: Prism' a ()
+  _HorizontalTab' :: a
+  _HorizontalTab' = _HorizontalTab # ()
+
+instance AsHorizontalTab () where
+  _HorizontalTab =
+    id
+
+instance AsHorizontalTab Char where
+  _HorizontalTab =
+    prism'
+      (\() -> '\9')
+      (\case
+          '\9' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsHorizontalTab Int where
+  _HorizontalTab =
+    prism'
+      (\() -> 9)
+      (\case
+          9 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsHorizontalTab Integer where
+  _HorizontalTab =
+    prism'
+      (\() -> 9)
+      (\case
+          9 -> Just ()
+          _ -> Nothing
+      )
+
+parseHorizontalTab ::
+  CharParsing p =>
+  p ()
+parseHorizontalTab =
+  satisfy' (== '\9') <?> "horizontal tab character"
+
+class HasLineFeed a where
+  lineFeed :: Lens' a ()
+
+instance HasLineFeed () where
+  lineFeed =
+    id
+
+class AsLineFeed a where
+  _LineFeed :: Prism' a ()
+  _LineFeed' :: a
+  _LineFeed' = _LineFeed # ()
+
+instance AsLineFeed () where
+  _LineFeed =
+    id
+
+instance AsLineFeed Char where
+  _LineFeed =
+    prism'
+      (\() -> '\10')
+      (\case
+          '\10' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsLineFeed Int where
+  _LineFeed =
+    prism'
+      (\() -> 10)
+      (\case
+          10 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsLineFeed Integer where
+  _LineFeed =
+    prism'
+      (\() -> 10)
+      (\case
+          10 -> Just ()
+          _ -> Nothing
+      )
+
+parseLineFeed ::
+  CharParsing p =>
+  p ()
+parseLineFeed =
+  satisfy' (== '\10') <?> "line feed character"
+
+class HasVerticalTab a where
+  verticalTab :: Lens' a ()
+
+instance HasVerticalTab () where
+  verticalTab =
+    id
+
+class AsVerticalTab a where
+  _VerticalTab :: Prism' a ()
+  _VerticalTab' :: a
+  _VerticalTab' = _VerticalTab # ()
+
+instance AsVerticalTab () where
+  _VerticalTab =
+    id
+
+instance AsVerticalTab Char where
+  _VerticalTab =
+    prism'
+      (\() -> '\11')
+      (\case
+          '\11' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsVerticalTab Int where
+  _VerticalTab =
+    prism'
+      (\() -> 11)
+      (\case
+          11 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsVerticalTab Integer where
+  _VerticalTab =
+    prism'
+      (\() -> 11)
+      (\case
+          11 -> Just ()
+          _ -> Nothing
+      )
+
+parseVerticalTab ::
+  CharParsing p =>
+  p ()
+parseVerticalTab =
+  satisfy' (== '\11') <?> "vertical tab character"
+
+class HasFormFeed a where
+  formFeed :: Lens' a ()
+
+instance HasFormFeed () where
+  formFeed =
+    id
+
+class AsFormFeed a where
+  _FormFeed :: Prism' a ()
+  _FormFeed' :: a
+  _FormFeed' = _FormFeed # ()
+
+instance AsFormFeed () where
+  _FormFeed =
+    id
+
+instance AsFormFeed Char where
+  _FormFeed =
+    prism'
+      (\() -> '\12')
+      (\case
+          '\12' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFormFeed Int where
+  _FormFeed =
+    prism'
+      (\() -> 12)
+      (\case
+          12 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFormFeed Integer where
+  _FormFeed =
+    prism'
+      (\() -> 12)
+      (\case
+          12 -> Just ()
+          _ -> Nothing
+      )
+
+parseFormFeed ::
+  CharParsing p =>
+  p ()
+parseFormFeed =
+  satisfy' (== '\12') <?> "form feed character"
+
+class HasCarriageReturn a where
+  carriageReturn :: Lens' a ()
+
+instance HasCarriageReturn () where
+  carriageReturn =
+    id
+
+class AsCarriageReturn a where
+  _CarriageReturn :: Prism' a ()
+  _CarriageReturn' :: a
+  _CarriageReturn' = _CarriageReturn # ()
+
+instance AsCarriageReturn () where
+  _CarriageReturn =
+    id
+
+instance AsCarriageReturn Char where
+  _CarriageReturn =
+    prism'
+      (\() -> '\13')
+      (\case
+          '\13' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsCarriageReturn Int where
+  _CarriageReturn =
+    prism'
+      (\() -> 13)
+      (\case
+          13 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsCarriageReturn Integer where
+  _CarriageReturn =
+    prism'
+      (\() -> 13)
+      (\case
+          13 -> Just ()
+          _ -> Nothing
+      )
+
+parseCarriageReturn ::
+  CharParsing p =>
+  p ()
+parseCarriageReturn =
+  satisfy' (== '\13') <?> "carriage return character"
+
+class HasWhitespace a where
+  whitespace :: Lens' a ()
+
+instance HasWhitespace () where
+  whitespace =
+    id
+
+class AsWhitespace a where
+  _Whitespace :: Prism' a ()
+  _Whitespace' :: a
+  _Whitespace' = _Whitespace # ()
+
+instance AsWhitespace () where
+  _Whitespace =
+    id
+
+instance AsWhitespace Char where
+  _Whitespace =
+    prism'
+      (\() -> '\32')
+      (\case
+          '\32' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsWhitespace Int where
+  _Whitespace =
+    prism'
+      (\() -> 32)
+      (\case
+          32 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsWhitespace Integer where
+  _Whitespace =
+    prism'
+      (\() -> 32)
+      (\case
+          32 -> Just ()
+          _ -> Nothing
+      )
+
+parseWhitespace ::
+  CharParsing p =>
+  p ()
+parseWhitespace =
+  satisfy' (== '\32') <?> "whitespace character"
+
+class HasNoBreakSpace a where
+  noBreakSpace :: Lens' a ()
+
+instance HasNoBreakSpace () where
+  noBreakSpace =
+    id
+
+class AsNoBreakSpace a where
+  _NoBreakSpace :: Prism' a ()
+  _NoBreakSpace' :: a
+  _NoBreakSpace' = _NoBreakSpace # ()
+
+instance AsNoBreakSpace () where
+  _NoBreakSpace =
+    id
+
+instance AsNoBreakSpace Char where
+  _NoBreakSpace =
+    prism'
+      (\() -> '\160')
+      (\case
+          '\160' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsNoBreakSpace Int where
+  _NoBreakSpace =
+    prism'
+      (\() -> 160)
+      (\case
+          160 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsNoBreakSpace Integer where
+  _NoBreakSpace =
+    prism'
+      (\() -> 160)
+      (\case
+          160 -> Just ()
+          _ -> Nothing
+      )
+
+parseNoBreakSpace ::
+  CharParsing p =>
+  p ()
+parseNoBreakSpace =
+  satisfy' (== '\160') <?> "no break space character"
+
+class HasOghamSpaceMark a where
+  oghamSpaceMark :: Lens' a ()
+
+instance HasOghamSpaceMark () where
+  oghamSpaceMark =
+    id
+
+class AsOghamSpaceMark a where
+  _OghamSpaceMark :: Prism' a ()
+  _OghamSpaceMark' :: a
+  _OghamSpaceMark' = _OghamSpaceMark # ()
+
+instance AsOghamSpaceMark () where
+  _OghamSpaceMark =
+    id
+
+instance AsOghamSpaceMark Char where
+  _OghamSpaceMark =
+    prism'
+      (\() -> '\5760')
+      (\case
+          '\5760' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsOghamSpaceMark Int where
+  _OghamSpaceMark =
+    prism'
+      (\() -> 5760)
+      (\case
+          5760 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsOghamSpaceMark Integer where
+  _OghamSpaceMark =
+    prism'
+      (\() -> 5760)
+      (\case
+          5760 -> Just ()
+          _ -> Nothing
+      )
+
+parseOghamSpaceMark ::
+  CharParsing p =>
+  p ()
+parseOghamSpaceMark =
+  satisfy' (== '\5760') <?> "ogham space mark character"
+
+class HasEnQuad a where
+  enQuad :: Lens' a ()
+
+instance HasEnQuad () where
+  enQuad =
+    id
+
+class AsEnQuad a where
+  _EnQuad :: Prism' a ()
+  _EnQuad' :: a
+  _EnQuad' = _EnQuad # ()
+
+instance AsEnQuad () where
+  _EnQuad =
+    id
+
+instance AsEnQuad Char where
+  _EnQuad =
+    prism'
+      (\() -> '\8192')
+      (\case
+          '\8192' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEnQuad Int where
+  _EnQuad =
+    prism'
+      (\() -> 8192)
+      (\case
+          8192 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEnQuad Integer where
+  _EnQuad =
+    prism'
+      (\() -> 8192)
+      (\case
+          8192 -> Just ()
+          _ -> Nothing
+      )
+
+parseEnQuad ::
+  CharParsing p =>
+  p ()
+parseEnQuad =
+  satisfy' (== '\8192') <?> "en quad character"
+
+class HasEmQuad a where
+  emQuad :: Lens' a ()
+
+instance HasEmQuad () where
+  emQuad =
+    id
+
+class AsEmQuad a where
+  _EmQuad :: Prism' a ()
+  _EmQuad' :: a
+  _EmQuad' = _EmQuad # ()
+
+instance AsEmQuad () where
+  _EmQuad =
+    id
+
+instance AsEmQuad Char where
+  _EmQuad =
+    prism'
+      (\() -> '\8193')
+      (\case
+          '\8193' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEmQuad Int where
+  _EmQuad =
+    prism'
+      (\() -> 8193)
+      (\case
+          8193 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEmQuad Integer where
+  _EmQuad =
+    prism'
+      (\() -> 8193)
+      (\case
+          8193 -> Just ()
+          _ -> Nothing
+      )
+
+parseEmQuad ::
+  CharParsing p =>
+  p ()
+parseEmQuad =
+  satisfy' (== '\8193') <?> "em quad character"
+
+class HasEnSpace a where
+  enSpace :: Lens' a ()
+
+instance HasEnSpace () where
+  enSpace =
+    id
+
+class AsEnSpace a where
+  _EnSpace :: Prism' a ()
+  _EnSpace' :: a
+  _EnSpace' = _EnSpace # ()
+
+instance AsEnSpace () where
+  _EnSpace =
+    id
+
+instance AsEnSpace Char where
+  _EnSpace =
+    prism'
+      (\() -> '\8194')
+      (\case
+          '\8194' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEnSpace Int where
+  _EnSpace =
+    prism'
+      (\() -> 8194)
+      (\case
+          8194 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEnSpace Integer where
+  _EnSpace =
+    prism'
+      (\() -> 8194)
+      (\case
+          8194 -> Just ()
+          _ -> Nothing
+      )
+
+parseEnSpace ::
+  CharParsing p =>
+  p ()
+parseEnSpace =
+  satisfy' (== '\8194') <?> "en space character"
+
+class HasEmSpace a where
+  emSpace :: Lens' a ()
+
+instance HasEmSpace () where
+  emSpace =
+    id
+
+class AsEmSpace a where
+  _EmSpace :: Prism' a ()
+  _EmSpace' :: a
+  _EmSpace' = _EmSpace # ()
+
+instance AsEmSpace () where
+  _EmSpace =
+    id
+
+instance AsEmSpace Char where
+  _EmSpace =
+    prism'
+      (\() -> '\8195')
+      (\case
+          '\8195' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEmSpace Int where
+  _EmSpace =
+    prism'
+      (\() -> 8195)
+      (\case
+          8195 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEmSpace Integer where
+  _EmSpace =
+    prism'
+      (\() -> 8195)
+      (\case
+          8195 -> Just ()
+          _ -> Nothing
+      )
+
+parseEmSpace ::
+  CharParsing p =>
+  p ()
+parseEmSpace =
+  satisfy' (== '\8195') <?> "em space character"
+
+class HasThreePerEmSpace a where
+  threePerEmSpace :: Lens' a ()
+
+instance HasThreePerEmSpace () where
+  threePerEmSpace =
+    id
+
+class AsThreePerEmSpace a where
+  _ThreePerEmSpace :: Prism' a ()
+  _ThreePerEmSpace' :: a
+  _ThreePerEmSpace' = _ThreePerEmSpace # ()
+
+instance AsThreePerEmSpace () where
+  _ThreePerEmSpace =
+    id
+
+instance AsThreePerEmSpace Char where
+  _ThreePerEmSpace =
+    prism'
+      (\() -> '\8196')
+      (\case
+          '\8196' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsThreePerEmSpace Int where
+  _ThreePerEmSpace =
+    prism'
+      (\() -> 8196)
+      (\case
+          8196 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsThreePerEmSpace Integer where
+  _ThreePerEmSpace =
+    prism'
+      (\() -> 8196)
+      (\case
+          8196 -> Just ()
+          _ -> Nothing
+      )
+
+parseThreePerEmSpace ::
+  CharParsing p =>
+  p ()
+parseThreePerEmSpace =
+  satisfy' (== '\8196') <?> "three per em space character"
+
+class HasFourPerEmSpace a where
+  fourPerEmSpace :: Lens' a ()
+
+instance HasFourPerEmSpace () where
+  fourPerEmSpace =
+    id
+
+class AsFourPerEmSpace a where
+  _FourPerEmSpace :: Prism' a ()
+  _FourPerEmSpace' :: a
+  _FourPerEmSpace' = _FourPerEmSpace # ()
+
+instance AsFourPerEmSpace () where
+  _FourPerEmSpace =
+    id
+
+instance AsFourPerEmSpace Char where
+  _FourPerEmSpace =
+    prism'
+      (\() -> '\8197')
+      (\case
+          '\8197' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFourPerEmSpace Int where
+  _FourPerEmSpace =
+    prism'
+      (\() -> 8197)
+      (\case
+          8197 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFourPerEmSpace Integer where
+  _FourPerEmSpace =
+    prism'
+      (\() -> 8197)
+      (\case
+          8197 -> Just ()
+          _ -> Nothing
+      )
+
+parseFourPerEmSpace ::
+  CharParsing p =>
+  p ()
+parseFourPerEmSpace =
+  satisfy' (== '\8197') <?> "four per em space character"
+
+class HasSixPerEmSpace a where
+  sixPerEmSpace :: Lens' a ()
+
+instance HasSixPerEmSpace () where
+  sixPerEmSpace =
+    id
+
+class AsSixPerEmSpace a where
+  _SixPerEmSpace :: Prism' a ()
+  _SixPerEmSpace' :: a
+  _SixPerEmSpace' = _SixPerEmSpace # ()
+
+instance AsSixPerEmSpace () where
+  _SixPerEmSpace =
+    id
+
+instance AsSixPerEmSpace Char where
+  _SixPerEmSpace =
+    prism'
+      (\() -> '\8198')
+      (\case
+          '\8198' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsSixPerEmSpace Int where
+  _SixPerEmSpace =
+    prism'
+      (\() -> 8198)
+      (\case
+          8198 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsSixPerEmSpace Integer where
+  _SixPerEmSpace =
+    prism'
+      (\() -> 8198)
+      (\case
+          8198 -> Just ()
+          _ -> Nothing
+      )
+
+parseSixPerEmSpace ::
+  CharParsing p =>
+  p ()
+parseSixPerEmSpace =
+  satisfy' (== '\8198') <?> "six per em space character"
+
+class HasFigureSpace a where
+  figureSpace :: Lens' a ()
+
+instance HasFigureSpace () where
+  figureSpace =
+    id
+
+class AsFigureSpace a where
+  _FigureSpace :: Prism' a ()
+  _FigureSpace' :: a
+  _FigureSpace' = _FigureSpace # ()
+
+instance AsFigureSpace () where
+  _FigureSpace =
+    id
+
+instance AsFigureSpace Char where
+  _FigureSpace =
+    prism'
+      (\() -> '\8199')
+      (\case
+          '\8199' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFigureSpace Int where
+  _FigureSpace =
+    prism'
+      (\() -> 8199)
+      (\case
+          8199 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFigureSpace Integer where
+  _FigureSpace =
+    prism'
+      (\() -> 8199)
+      (\case
+          8199 -> Just ()
+          _ -> Nothing
+      )
+
+parseFigureSpace ::
+  CharParsing p =>
+  p ()
+parseFigureSpace =
+  satisfy' (== '\8199') <?> "figure space character"
+
+class HasPunctuationSpace a where
+  punctuationSpace :: Lens' a ()
+
+instance HasPunctuationSpace () where
+  punctuationSpace =
+    id
+
+class AsPunctuationSpace a where
+  _PunctuationSpace :: Prism' a ()
+  _PunctuationSpace' :: a
+  _PunctuationSpace' = _PunctuationSpace # ()
+
+instance AsPunctuationSpace () where
+  _PunctuationSpace =
+    id
+
+instance AsPunctuationSpace Char where
+  _PunctuationSpace =
+    prism'
+      (\() -> '\8200')
+      (\case
+          '\8200' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsPunctuationSpace Int where
+  _PunctuationSpace =
+    prism'
+      (\() -> 8200)
+      (\case
+          8200 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsPunctuationSpace Integer where
+  _PunctuationSpace =
+    prism'
+      (\() -> 8200)
+      (\case
+          8200 -> Just ()
+          _ -> Nothing
+      )
+
+parsePunctuationSpace ::
+  CharParsing p =>
+  p ()
+parsePunctuationSpace =
+  satisfy' (== '\8200') <?> "punctuation space character"
+
+class HasThinSpace a where
+  thinSpace :: Lens' a ()
+
+instance HasThinSpace () where
+  thinSpace =
+    id
+
+class AsThinSpace a where
+  _ThinSpace :: Prism' a ()
+  _ThinSpace' :: a
+  _ThinSpace' = _ThinSpace # ()
+
+instance AsThinSpace () where
+  _ThinSpace =
+    id
+
+instance AsThinSpace Char where
+  _ThinSpace =
+    prism'
+      (\() -> '\8201')
+      (\case
+          '\8201' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsThinSpace Int where
+  _ThinSpace =
+    prism'
+      (\() -> 8201)
+      (\case
+          8201 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsThinSpace Integer where
+  _ThinSpace =
+    prism'
+      (\() -> 8201)
+      (\case
+          8201 -> Just ()
+          _ -> Nothing
+      )
+
+parseThinSpace ::
+  CharParsing p =>
+  p ()
+parseThinSpace =
+  satisfy' (== '\8201') <?> "thin space character"
+
+class HasHairSpace a where
+  hairSpace :: Lens' a ()
+
+instance HasHairSpace () where
+  hairSpace =
+    id
+
+class AsHairSpace a where
+  _HairSpace :: Prism' a ()
+  _HairSpace' :: a
+  _HairSpace' = _HairSpace # ()
+
+instance AsHairSpace () where
+  _HairSpace =
+    id
+
+instance AsHairSpace Char where
+  _HairSpace =
+    prism'
+      (\() -> '\8202')
+      (\case
+          '\8202' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsHairSpace Int where
+  _HairSpace =
+    prism'
+      (\() -> 8202)
+      (\case
+          8202 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsHairSpace Integer where
+  _HairSpace =
+    prism'
+      (\() -> 8202)
+      (\case
+          8202 -> Just ()
+          _ -> Nothing
+      )
+
+parseHairSpace ::
+  CharParsing p =>
+  p ()
+parseHairSpace =
+  satisfy' (== '\8202') <?> "hair space character"
+
+class HasNarrowNoBreakSpace a where
+  narrowNoBreakSpace :: Lens' a ()
+
+instance HasNarrowNoBreakSpace () where
+  narrowNoBreakSpace =
+    id
+
+class AsNarrowNoBreakSpace a where
+  _NarrowNoBreakSpace :: Prism' a ()
+  _NarrowNoBreakSpace' :: a
+  _NarrowNoBreakSpace' = _NarrowNoBreakSpace # ()
+
+instance AsNarrowNoBreakSpace () where
+  _NarrowNoBreakSpace =
+    id
+
+instance AsNarrowNoBreakSpace Char where
+  _NarrowNoBreakSpace =
+    prism'
+      (\() -> '\8239')
+      (\case
+          '\8239' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsNarrowNoBreakSpace Int where
+  _NarrowNoBreakSpace =
+    prism'
+      (\() -> 8239)
+      (\case
+          8239 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsNarrowNoBreakSpace Integer where
+  _NarrowNoBreakSpace =
+    prism'
+      (\() -> 8239)
+      (\case
+          8239 -> Just ()
+          _ -> Nothing
+      )
+
+parseNarrowNoBreakSpace ::
+  CharParsing p =>
+  p ()
+parseNarrowNoBreakSpace =
+  satisfy' (== '\8239') <?> "narrow no break space character"
+
+class HasMediumMathematicalSpace a where
+  mediumMathematicalSpace :: Lens' a ()
+
+instance HasMediumMathematicalSpace () where
+  mediumMathematicalSpace =
+    id
+
+class AsMediumMathematicalSpace a where
+  _MediumMathematicalSpace :: Prism' a ()
+  _MediumMathematicalSpace' :: a
+  _MediumMathematicalSpace' = _MediumMathematicalSpace # ()
+
+instance AsMediumMathematicalSpace () where
+  _MediumMathematicalSpace =
+    id
+
+instance AsMediumMathematicalSpace Char where
+  _MediumMathematicalSpace =
+    prism'
+      (\() -> '\8287')
+      (\case
+          '\8287' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsMediumMathematicalSpace Int where
+  _MediumMathematicalSpace =
+    prism'
+      (\() -> 8287)
+      (\case
+          8287 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsMediumMathematicalSpace Integer where
+  _MediumMathematicalSpace =
+    prism'
+      (\() -> 8287)
+      (\case
+          8287 -> Just ()
+          _ -> Nothing
+      )
+
+parseMediumMathematicalSpace ::
+  CharParsing p =>
+  p ()
+parseMediumMathematicalSpace =
+  satisfy' (== '\8287') <?> "medium mathematical space character"
+
+class HasIdeographicSpace a where
+  ideographicSpace :: Lens' a ()
+
+instance HasIdeographicSpace () where
+  ideographicSpace =
+    id
+
+class AsIdeographicSpace a where
+  _IdeographicSpace :: Prism' a ()
+  _IdeographicSpace' :: a
+  _IdeographicSpace' = _IdeographicSpace # ()
+
+instance AsIdeographicSpace () where
+  _IdeographicSpace =
+    id
+
+instance AsIdeographicSpace Char where
+  _IdeographicSpace =
+    prism'
+      (\() -> '\12288')
+      (\case
+          '\12288' -> Just ()
+          _ -> Nothing
+      )
+
+instance AsIdeographicSpace Int where
+  _IdeographicSpace =
+    prism'
+      (\() -> 12288)
+      (\case
+          12288 -> Just ()
+          _ -> Nothing
+      )
+
+instance AsIdeographicSpace Integer where
+  _IdeographicSpace =
+    prism'
+      (\() -> 12288)
+      (\case
+          12288 -> Just ()
+          _ -> Nothing
+      )
+
+parseIdeographicSpace ::
+  CharParsing p =>
+  p ()
+parseIdeographicSpace =
+  satisfy' (== '\12288') <?> "ideographic space character"
+
+data SpaceChar =
+  HorizontalTab
+  | LineFeed
+  | VerticalTab
+  | FormFeed
+  | CarriageReturn
+  | Whitespace
+  | NoBreakSpace
+  | OghamSpaceMark
+  | EnQuad
+  | EmQuad
+  | EnSpace
+  | EmSpace
+  | ThreePerEmSpace
+  | FourPerEmSpace
+  | SixPerEmSpace
+  | FigureSpace
+  | PunctuationSpace
+  | ThinSpace
+  | HairSpace
+  | NarrowNoBreakSpace
+  | MediumMathematicalSpace
+  | IdeographicSpace
+  deriving (Eq, Ord, Show, Generic)
+
+class HasSpaceChar a where
+  spaceChar :: Lens' a SpaceChar
+
+instance HasSpaceChar SpaceChar where
+  spaceChar = id
+
+class AsSpaceChar a where
+  _SpaceChar :: Prism' a SpaceChar
+
+instance AsSpaceChar SpaceChar where
+  _SpaceChar = id
+
+instance AsSpaceChar Char where
+  _SpaceChar =
+    prism'
+      (\case
+        HorizontalTab ->
+          '\9'
+        LineFeed ->
+          '\10'
+        VerticalTab ->
+          '\11'
+        FormFeed ->
+          '\12'
+        CarriageReturn ->
+          '\13'
+        Whitespace ->
+          '\32'
+        NoBreakSpace ->
+          '\160'
+        OghamSpaceMark ->
+          '\5760'
+        EnQuad ->
+          '\8192'
+        EmQuad ->
+          '\8193'
+        EnSpace ->
+          '\8194'
+        EmSpace ->
+          '\8195'
+        ThreePerEmSpace ->
+          '\8196'
+        FourPerEmSpace ->
+          '\8197'
+        SixPerEmSpace ->
+          '\8198'
+        FigureSpace ->
+          '\8199'
+        PunctuationSpace ->
+          '\8200'
+        ThinSpace ->
+          '\8201'
+        HairSpace ->
+          '\8202'
+        NarrowNoBreakSpace ->
+          '\8239'
+        MediumMathematicalSpace ->
+          '\8287'
+        IdeographicSpace ->
+          '\12288'
+      )
+      (\case
+        '\9' ->
+          Just HorizontalTab
+        '\10' ->
+          Just LineFeed
+        '\11' ->
+          Just VerticalTab
+        '\12' ->
+          Just FormFeed
+        '\13' ->
+          Just CarriageReturn
+        '\32' ->
+          Just Whitespace
+        '\160' ->
+          Just NoBreakSpace
+        '\5760' ->
+          Just OghamSpaceMark
+        '\8192' ->
+          Just EnQuad
+        '\8193' ->
+          Just EmQuad
+        '\8194' ->
+          Just EnSpace
+        '\8195' ->
+          Just EmSpace
+        '\8196' ->
+          Just ThreePerEmSpace
+        '\8197' ->
+          Just FourPerEmSpace
+        '\8198' ->
+          Just SixPerEmSpace
+        '\8199' ->
+          Just FigureSpace
+        '\8200' ->
+          Just PunctuationSpace
+        '\8201' ->
+          Just ThinSpace
+        '\8202' ->
+          Just HairSpace
+        '\8239' ->
+          Just NarrowNoBreakSpace
+        '\8287' ->
+          Just MediumMathematicalSpace
+        '\12288' ->
+          Just IdeographicSpace
+        _ ->
+          Nothing
+      )
+
+parseSpaceChar ::
+  CharParsing p =>
+  p SpaceChar
+parseSpaceChar =
+  asum [
+    HorizontalTab <$ parseHorizontalTab
+  , LineFeed <$ parseLineFeed
+  , VerticalTab <$ parseVerticalTab
+  , FormFeed <$ parseFormFeed
+  , CarriageReturn <$ parseCarriageReturn
+  , Whitespace <$ parseWhitespace
+  , NoBreakSpace <$ parseNoBreakSpace
+  , OghamSpaceMark <$ parseOghamSpaceMark
+  , EnQuad <$ parseEnQuad
+  , EmQuad <$ parseEmQuad
+  , EnSpace <$ parseEnSpace
+  , EmSpace <$ parseEmSpace
+  , ThreePerEmSpace <$ parseThreePerEmSpace
+  , FourPerEmSpace <$ parseFourPerEmSpace
+  , SixPerEmSpace <$ parseSixPerEmSpace
+  , FigureSpace <$ parseFigureSpace
+  , PunctuationSpace <$ parsePunctuationSpace
+  , ThinSpace <$ parseThinSpace
+  , HairSpace <$ parseHairSpace
+  , NarrowNoBreakSpace <$ parseNarrowNoBreakSpace
+  , MediumMathematicalSpace <$ parseMediumMathematicalSpace
+  , IdeographicSpace <$ parseIdeographicSpace
+  ]
+
+instance AsHorizontalTab SpaceChar where
+  _HorizontalTab =
+    prism'
+      (\() -> HorizontalTab)
+      (\case
+          HorizontalTab -> Just ()
+          _ -> Nothing
+      )
+
+instance AsLineFeed SpaceChar where
+  _LineFeed =
+    prism'
+      (\() -> LineFeed)
+      (\case
+          LineFeed -> Just ()
+          _ -> Nothing
+      )
+
+instance AsVerticalTab SpaceChar where
+  _VerticalTab =
+    prism'
+      (\() -> VerticalTab)
+      (\case
+          VerticalTab -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFormFeed SpaceChar where
+  _FormFeed =
+    prism'
+      (\() -> FormFeed)
+      (\case
+          FormFeed -> Just ()
+          _ -> Nothing
+      )
+
+instance AsCarriageReturn SpaceChar where
+  _CarriageReturn =
+    prism'
+      (\() -> CarriageReturn)
+      (\case
+          CarriageReturn -> Just ()
+          _ -> Nothing
+      )
+
+instance AsWhitespace SpaceChar where
+  _Whitespace =
+    prism'
+      (\() -> Whitespace)
+      (\case
+          Whitespace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsNoBreakSpace SpaceChar where
+  _NoBreakSpace =
+    prism'
+      (\() -> NoBreakSpace)
+      (\case
+          NoBreakSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsOghamSpaceMark SpaceChar where
+  _OghamSpaceMark =
+    prism'
+      (\() -> OghamSpaceMark)
+      (\case
+          OghamSpaceMark -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEnQuad SpaceChar where
+  _EnQuad =
+    prism'
+      (\() -> EnQuad)
+      (\case
+          EnQuad -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEmQuad SpaceChar where
+  _EmQuad =
+    prism'
+      (\() -> EmQuad)
+      (\case
+          EmQuad -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEnSpace SpaceChar where
+  _EnSpace =
+    prism'
+      (\() -> EnSpace)
+      (\case
+          EnSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsEmSpace SpaceChar where
+  _EmSpace =
+    prism'
+      (\() -> EmSpace)
+      (\case
+          EmSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsThreePerEmSpace SpaceChar where
+  _ThreePerEmSpace =
+    prism'
+      (\() -> ThreePerEmSpace)
+      (\case
+          ThreePerEmSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFourPerEmSpace SpaceChar where
+  _FourPerEmSpace =
+    prism'
+      (\() -> FourPerEmSpace)
+      (\case
+          FourPerEmSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsSixPerEmSpace SpaceChar where
+  _SixPerEmSpace =
+    prism'
+      (\() -> SixPerEmSpace)
+      (\case
+          SixPerEmSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFigureSpace SpaceChar where
+  _FigureSpace =
+    prism'
+      (\() -> FigureSpace)
+      (\case
+          FigureSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsPunctuationSpace SpaceChar where
+  _PunctuationSpace =
+    prism'
+      (\() -> PunctuationSpace)
+      (\case
+          PunctuationSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsThinSpace SpaceChar where
+  _ThinSpace =
+    prism'
+      (\() -> ThinSpace)
+      (\case
+          ThinSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsHairSpace SpaceChar where
+  _HairSpace =
+    prism'
+      (\() -> HairSpace)
+      (\case
+          HairSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsNarrowNoBreakSpace SpaceChar where
+  _NarrowNoBreakSpace =
+    prism'
+      (\() -> NarrowNoBreakSpace)
+      (\case
+          NarrowNoBreakSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsMediumMathematicalSpace SpaceChar where
+  _MediumMathematicalSpace =
+    prism'
+      (\() -> MediumMathematicalSpace)
+      (\case
+          MediumMathematicalSpace -> Just ()
+          _ -> Nothing
+      )
+
+instance AsIdeographicSpace SpaceChar where
+  _IdeographicSpace =
+    prism'
+      (\() -> IdeographicSpace)
+      (\case
+          IdeographicSpace -> Just ()
+          _ -> Nothing
+      )
+
+data IsoLatin1 =
+  HorizontalTab_
+  | LineFeed_
+  | FormFeed_
+  | CarriageReturn_
+  | Whitespace_
+  deriving (Eq, Ord, Show, Generic)
+
+class HasIsoLatin1 a where
+  isoLatin1 :: Lens' a IsoLatin1
+
+instance HasIsoLatin1 IsoLatin1 where
+  isoLatin1 = id
+
+class AsIsoLatin1 a where
+  _IsoLatin1 :: Prism' a IsoLatin1
+
+instance AsIsoLatin1 Char where
+  _IsoLatin1 =
+    prism'
+      (\case
+        HorizontalTab_ ->
+          '\9'
+        LineFeed_ ->
+          '\10'
+        FormFeed_ ->
+          '\12'
+        CarriageReturn_ ->
+          '\13'
+        Whitespace_ ->
+          '\32'
+      )
+      (\case
+        '\9' ->
+          Just HorizontalTab_
+        '\10' ->
+          Just LineFeed_
+        '\12' ->
+          Just FormFeed_
+        '\13' ->
+          Just CarriageReturn_
+        '\32' ->
+          Just Whitespace_
+        _ ->
+          Nothing
+      )
+
+instance AsIsoLatin1 IsoLatin1 where
+  _IsoLatin1 = id
+
+parseIsoLatin1 ::
+  CharParsing p =>
+  p IsoLatin1
+parseIsoLatin1 =
+  asum [
+    HorizontalTab_ <$ parseHorizontalTab
+  , LineFeed_ <$ parseLineFeed
+  , FormFeed_ <$ parseFormFeed
+  , CarriageReturn_ <$ parseCarriageReturn
+  , Whitespace_ <$ parseWhitespace
+  ]
+
+instance AsHorizontalTab IsoLatin1 where
+  _HorizontalTab =
+    prism'
+      (\() -> HorizontalTab_)
+      (\case
+          HorizontalTab_ -> Just ()
+          _ -> Nothing
+      )
+
+instance AsLineFeed IsoLatin1 where
+  _LineFeed =
+    prism'
+      (\() -> LineFeed_)
+      (\case
+          LineFeed_ -> Just ()
+          _ -> Nothing
+      )
+
+instance AsFormFeed IsoLatin1 where
+  _FormFeed =
+    prism'
+      (\() -> FormFeed_)
+      (\case
+          FormFeed_ -> Just ()
+          _ -> Nothing
+      )
+
+instance AsCarriageReturn IsoLatin1 where
+  _CarriageReturn =
+    prism'
+      (\() -> CarriageReturn_)
+      (\case
+          CarriageReturn_ -> Just ()
+          _ -> Nothing
+      )
+
+instance AsWhitespace IsoLatin1 where
+  _Whitespace =
+    prism'
+      (\() -> Whitespace_)
+      (\case
+          Whitespace_ -> Just ()
+          _ -> Nothing
+      )
+
+-- not exported
+
+satisfy' ::
+  CharParsing f =>
+  (Char -> Bool)
+  -> f ()
+satisfy' p =
+  () <$ satisfy p
