diff options
Diffstat (limited to '')
-rw-r--r-- | src/jaegertracing/thrift/lib/hs/src/Thrift/Arbitraries.hs | 55 |
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. +-} |