summaryrefslogtreecommitdiffstats
path: root/src/jaegertracing/thrift/lib/hs/src/Thrift/Arbitraries.hs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/jaegertracing/thrift/lib/hs/src/Thrift/Arbitraries.hs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/jaegertracing/thrift/lib/hs/src/Thrift/Arbitraries.hs b/src/jaegertracing/thrift/lib/hs/src/Thrift/Arbitraries.hs
new file mode 100644
index 000000000..e9c0fc3ee
--- /dev/null
+++ b/src/jaegertracing/thrift/lib/hs/src/Thrift/Arbitraries.hs
@@ -0,0 +1,55 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Thrift.Arbitraries where
+
+import Data.Bits()
+
+import Test.QuickCheck.Arbitrary
+
+import Control.Applicative ((<$>))
+import Data.Map (Map)
+import qualified Data.Map as Map
+import qualified Data.Set as Set
+import qualified Data.Vector as Vector
+import qualified Data.Text.Lazy as Text
+import qualified Data.HashSet as HSet
+import qualified Data.HashMap.Strict as HMap
+import Data.Hashable (Hashable)
+
+import Data.ByteString.Lazy (ByteString)
+import qualified Data.ByteString.Lazy as BS
+
+-- String has an Arbitrary instance already
+-- Bool has an Arbitrary instance already
+-- A Thrift 'list' is a Vector.
+
+instance Arbitrary ByteString where
+ arbitrary = BS.pack . filter (/= 0) <$> arbitrary
+
+instance (Arbitrary k) => Arbitrary (Vector.Vector k) where
+ arbitrary = Vector.fromList <$> arbitrary
+
+instance Arbitrary Text.Text where
+ arbitrary = Text.pack . filter (/= '\0') <$> arbitrary
+
+instance (Eq k, Hashable k, Arbitrary k) => Arbitrary (HSet.HashSet k) where
+ arbitrary = HSet.fromList <$> arbitrary
+
+instance (Eq k, Hashable k, Arbitrary k, Arbitrary v) =>
+ Arbitrary (HMap.HashMap k v) where
+ arbitrary = HMap.fromList <$> arbitrary
+
+{-
+ To handle Thrift 'enum' we would ideally use something like:
+
+instance (Enum a, Bounded a) => Arbitrary a
+ where arbitrary = elements (enumFromTo minBound maxBound)
+
+Unfortunately this doesn't play nicely with the type system.
+Instead we'll generate an arbitrary instance along with the code.
+-}
+
+{-
+ There might be some way to introspect on the Haskell structure of a
+ Thrift 'struct' or 'exception' but generating the code directly is simpler.
+-}