]> gitweb.michael.orlitzky.com - dead/harbl.git/blobdiff - src/IPv4Pattern.hs
Restrict Pretty module exports/imports.
[dead/harbl.git] / src / IPv4Pattern.hs
index 55403205aa3996914b1b4d9314f68636434ad1c6..dd95b13be37d4563e064428c0b52ea109d6c49b6 100644 (file)
@@ -1,5 +1,3 @@
-{-# LANGUAGE FlexibleInstances #-}
-
 -- | An IPv4 address pattern has four fields separated by ".".  Each
 --   field is either a decimal number, or a sequence inside "[]" that
 --   contains one or more ";"-separated decimal numbers or
 module IPv4Pattern
 where
 
+
 import Test.Tasty ( TestTree, testGroup )
 import Test.Tasty.HUnit ( (@?=), testCase )
-import Text.Parsec
+import Text.Parsec (
+  (<|>),
+  char,
+  digit,
+  many1,
+  parse,
+  string,
+  try,
+  unexpected )
 import Text.Parsec.String ( Parser )
 import Text.Read ( readMaybe )
 
-
-class Pretty a where
-  -- | Obtain a pretty 'String' representation of the given thingy.
-  prettyshow :: a -> String
-
-  -- | Pretty-print the given thingy.
-  pp :: a -> IO ()
-  pp = putStrLn . prettyshow
-
-
--- | Define a 'Pretty' instance for the result of 'parse'. This lets
---   us pretty-print the result of a parse attempt without worrying
---   about whether or not it failed. If the parse failed, you get the
---   same output that you usually would. Otherwise we pretty-print the
---   parsed value.
---
-instance Pretty a => Pretty (Either ParseError a) where
-  prettyshow (Left err) = show err
-  prettyshow (Right v)  = prettyshow v
+import Pretty ( Pretty(..) )
 
 
 -- * Octets
@@ -64,7 +53,7 @@ newtype IPv4Octet = IPv4Octet Int
 
 
 instance Pretty IPv4Octet where
-  prettyshow (IPv4Octet x) = show x
+  pretty_show (IPv4Octet x) = show x
 
 
 -- | Parse an IPv4 octet, which should contain a string of digits.
@@ -73,6 +62,8 @@ instance Pretty IPv4Octet where
 --
 --   ==== _Examples_
 --
+--   >>> import Text.Parsec ( parseTest )
+--
 --   Standard octets are parsed correctly:
 --
 --   >>> parseTest v4octet "0"
@@ -108,7 +99,7 @@ v4octet = do
     -- to convert that to an Int! It will overflow rather than fail
     -- if the input is too big/small, so it should really always
     -- succeed.
-    Nothing -> unexpected "readMaybe failed on a sequence of digits!"
+    Nothing -> unexpected "v4octet: readMaybe failed on a sequence of digits!"
 
     -- If we got an Int, make sure it's actually a representation of
     -- an octet.
@@ -135,9 +126,9 @@ data IPv4SequenceMember =
 
 
 instance Pretty IPv4SequenceMember where
-  prettyshow (IPv4SequenceMemberOctet octet) = prettyshow octet
-  prettyshow (IPv4SequenceMemberOctetRange octet1 octet2) =
-    (prettyshow octet1) ++ ".." ++ (prettyshow octet2)
+  pretty_show (IPv4SequenceMemberOctet octet) = pretty_show octet
+  pretty_show (IPv4SequenceMemberOctetRange octet1 octet2) =
+    (pretty_show octet1) ++ ".." ++ (pretty_show octet2)
 
 
 -- | Parse an IPv4 \"sequence member\". A sequence member is either an
@@ -145,6 +136,8 @@ instance Pretty IPv4SequenceMember where
 --
 --   ==== _Examples_
 --
+--   >>> import Text.Parsec ( parseTest )
+--
 --   >>> parseTest v4seq_member "127"
 --   IPv4SequenceMemberOctet (IPv4Octet 127)
 --
@@ -179,9 +172,9 @@ data IPv4Sequence =
 
 
 instance Pretty IPv4Sequence where
-  prettyshow (IPv4SequenceSingleMember member) = prettyshow member
-  prettyshow (IPv4SequenceOptions member subsequence) =
-    (prettyshow member) ++ ";" ++ (prettyshow subsequence)
+  pretty_show (IPv4SequenceSingleMember member) = pretty_show member
+  pretty_show (IPv4SequenceOptions member subsequence) =
+    (pretty_show member) ++ ";" ++ (pretty_show subsequence)
 
 
 -- | Parse an IPv4 \"sequence\". A sequence is whatever is allowed
@@ -194,17 +187,18 @@ instance Pretty IPv4Sequence where
 --
 --   ==== _Examples_
 --
+--   >>> import Text.Parsec ( parseTest )
 --   >>> parseTest v4sequence "1"
 --   IPv4SequenceSingleMember (IPv4SequenceMemberOctet (IPv4Octet 1))
 --
---   >>> pp $ parse v4sequence "" "1..2"
+--   >>> pretty_print $ parse v4sequence "" "1..2"
 --   1..2
 --
---   >>> pp $ parse v4sequence "" "1..2;8"
+--   >>> pretty_print $ parse v4sequence "" "1..2;8"
 --   1..2;8
 --
 v4sequence :: Parser IPv4Sequence
-v4sequence = try both <|> just_one -- Maybe sepBy is appropriate here?
+v4sequence = try both <|> just_one
   where
     both = do
       sm <- v4seq_member
@@ -223,8 +217,8 @@ data IPv4Field = IPv4FieldOctet IPv4Octet | IPv4FieldSequence IPv4Sequence
 
 
 instance Pretty IPv4Field where
-  prettyshow (IPv4FieldOctet octet) = prettyshow octet
-  prettyshow (IPv4FieldSequence seq) = "[" ++ (prettyshow seq) ++ "]"
+  pretty_show (IPv4FieldOctet octet) = pretty_show octet
+  pretty_show (IPv4FieldSequence s) = "[" ++ (pretty_show s) ++ "]"
 
 
 -- | Parse an IPv4 \"field\", which is either a boring old octet, or a
@@ -232,10 +226,11 @@ instance Pretty IPv4Field where
 --
 --   ==== _Examples_
 --
+--   >>> import Text.Parsec ( parseTest )
 --   >>> parseTest v4field "127"
 --   IPv4FieldOctet (IPv4Octet 127)
 --
---   >>> pp $ parse v4field "" "[127]"
+--   >>> pretty_print $ parse v4field "" "[127]"
 --   [127]
 --
 v4field :: Parser IPv4Field
@@ -259,13 +254,13 @@ data IPv4Pattern =
 
 
 instance Pretty IPv4Pattern where
-  prettyshow (IPv4Pattern f1 f2 f3 f4) =
-    (prettyshow f1) ++ "."
-                    ++ (prettyshow f2)
+  pretty_show (IPv4Pattern f1 f2 f3 f4) =
+    (pretty_show f1) ++ "."
+                    ++ (pretty_show f2)
                     ++ "."
-                    ++ (prettyshow f3)
+                    ++ (pretty_show f3)
                     ++ "."
-                    ++ (prettyshow f4)
+                    ++ (pretty_show f4)
 
 
 -- | Parse an ipv4 address pattern. This consists of four fields,
@@ -276,17 +271,18 @@ instance Pretty IPv4Pattern where
 --
 --   ==== _Examples_
 --
---   >>> pp $ parse v4pattern "" "127.0.0.1"
+--   >>> pretty_print $ parse v4pattern "" "127.0.0.1"
 --   127.0.0.1
 --
---   >>> pp $ parse v4pattern "" "127.0.[1..3].1"
+--   >>> pretty_print $ parse v4pattern "" "127.0.[1..3].1"
 --   127.0.[1..3].1
 --
---   >>> pp $ parse v4pattern "" "127.0.[1..3;8].1"
+--   >>> pretty_print $ parse v4pattern "" "127.0.[1..3;8].1"
 --   127.0.[1..3;8].1
 --
 --   In the module intro, it is mentioned that this is invalid:
 --
+--   >>> import Text.Parsec ( parseTest )
 --   >>> parseTest v4pattern "1.2.[3.4]"
 --   parse error at (line 1, column 7):
 --   unexpected "."
@@ -295,7 +291,7 @@ instance Pretty IPv4Pattern where
 --   This one is /also/ invalid; however, we'll parse the valid part off
 --   the front of it:
 --
---   >>> pp $ parse v4pattern "" "1.2.3.3[6..9]"
+--   >>> pretty_print $ parse v4pattern "" "1.2.3.3[6..9]"
 --   1.2.3.3
 --
 v4pattern :: Parser IPv4Pattern