--- /dev/null
+-- | OK, I lied about "Network.DNS.RBL.Domain.Digit" and
+-- "Network.DNS.RBL.Domain.Letter" being the simplest modules you'd
+-- ever see. Because this is. It contains the 'Hyphen' type and a
+-- Parsec parser to parse one. We don't export its constructor because
+-- then you could do something dumb like stick a letter inside one.
+--
+module Network.DNS.RBL.Domain.Hyphen (
+ Hyphen,
+ hyphen )
+where
+
+import Text.Parsec ( char )
+import Text.Parsec.String ( Parser )
+
+import Network.DNS.RBL.Pretty ( Pretty(..) )
+
+
+
+-- | A wrapper around a single hyphen character.
+--
+-- ==== _Examples_
+--
+-- >>> Hyphen '-'
+-- Hyphen '-'
+--
+-- >>> let h1 = Hyphen '-'
+-- >>> let h2 = Hyphen '-'
+-- >>> h1 == h2
+-- True
+--
+newtype Hyphen = Hyphen Char
+
+
+-- | Equality is defined semantically (all hyphens are equal).
+--
+-- ==== _Examples_
+--
+-- >>> let h1 = Hyphen '-'
+-- >>> let h2 = Hyphen '-'
+-- >>> h1 == h2
+-- True
+--
+-- If you do something stupid, that's your fault:
+--
+-- >>> let h1 = Hyphen '-'
+-- >>> let h2 = Hyphen 'x'
+-- >>> h1 == h2
+-- True
+--
+instance Eq Hyphen where _ == _ = True
+
+
+-- | 'Show' is defined semantically; all hyphens display as \'-\'.
+-- The implementation is based on what GHC derives, discovered via
+-- @ghci -ddump-deriv@.
+--
+-- ==== _Examples_
+--
+-- >>> let h = Hyphen '-'
+-- >>> h
+-- Hyphen '-'
+--
+-- If you do something stupid, that's your fault:
+--
+-- >>> let h = Hyphen 'x'
+-- >>> h
+-- Hyphen '-'
+--
+instance Show Hyphen where
+ showsPrec d _ =
+ showParen (d > application_precedence) (showString "Hyphen '-'")
+ where
+ application_precedence = 10
+
+
+-- | 'Pretty' is defined semantically; all hyphens display as \'-\'.
+--
+-- ==== _Examples_
+--
+-- >>> let h = Hyphen '-'
+-- >>> pretty_print h
+-- -
+--
+-- If you do something stupid, that's your fault:
+--
+-- >>> let h = Hyphen 'x'
+-- >>> pretty_print h
+-- -
+--
+instance Pretty Hyphen where pretty_show _ = "-"
+
+
+-- | Parse a single hyphen and wrap it in our 'Hyphen' type.
+--
+-- ==== _Examples_
+--
+-- >>> import Text.Parsec ( parseTest )
+--
+-- Hyphens are parsed:
+--
+-- >>> parseTest hyphen "-"
+-- Hyphen '-'
+--
+-- But not letters or digits:
+--
+-- >>> parseTest hyphen "1"
+-- parse error at (line 1, column 1):
+-- unexpected "1"
+-- expecting "-"
+--
+-- >>> parseTest hyphen "x"
+-- parse error at (line 1, column 1):
+-- unexpected "x"
+-- expecting "-"
+--
+hyphen :: Parser Hyphen
+hyphen = fmap Hyphen (char '-')