summaryrefslogtreecommitdiff
path: root/src/Language/GraphQL
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2023-06-23 17:31:19 +0200
committerEugen Wissner <belka@caraus.de>2023-06-23 17:31:19 +0200
commitf90feb488d718c57509375c9627f912b8826c914 (patch)
treec8b220b779eadf666ce5bbcd0eee56e78b64d7a4 /src/Language/GraphQL
parent64d7545bc696070f3df6cc90ee65dabd852ea2d3 (diff)
downloadgraphql-spice-f90feb488d718c57509375c9627f912b8826c914.tar.gz
Get Scientific instances
Diffstat (limited to 'src/Language/GraphQL')
-rw-r--r--src/Language/GraphQL/Class.hs118
1 files changed, 82 insertions, 36 deletions
diff --git a/src/Language/GraphQL/Class.hs b/src/Language/GraphQL/Class.hs
index 89b4337..cce1bae 100644
--- a/src/Language/GraphQL/Class.hs
+++ b/src/Language/GraphQL/Class.hs
@@ -19,6 +19,7 @@ import qualified Data.Text.Read as Text.Read
import Data.Vector (Vector)
import qualified Data.Vector as Vector
import qualified Language.GraphQL.Type as Type
+import Data.Scientific (Scientific, toRealFloat)
fromGraphQLToIntegral :: Integral a => Type.Value -> Maybe a
fromGraphQLToIntegral (Type.Int value) = Just $ fromIntegral value
@@ -30,121 +31,166 @@ fromGraphQLToIntegral _ = Nothing
-- | Instances of this typeclass can be converted to GraphQL internal
-- representation.
-class ToGraphQL a where
+class ToGraphQL a
+ where
toGraphQL :: a -> Type.Value
-instance ToGraphQL Text where
+instance ToGraphQL Text
+ where
toGraphQL = Type.String
-instance ToGraphQL Int where
+instance ToGraphQL Int
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Int8 where
+instance ToGraphQL Int8
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Int16 where
+instance ToGraphQL Int16
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Int32 where
+instance ToGraphQL Int32
+ where
toGraphQL = Type.Int
-instance ToGraphQL Int64 where
+instance ToGraphQL Int64
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word where
+instance ToGraphQL Word
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word8 where
+instance ToGraphQL Word8
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word16 where
+instance ToGraphQL Word16
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word32 where
+instance ToGraphQL Word32
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL Word64 where
+instance ToGraphQL Word64
+ where
toGraphQL = Type.Int . fromIntegral
-instance ToGraphQL a => ToGraphQL [a] where
+instance ToGraphQL a => ToGraphQL [a]
+ where
toGraphQL = Type.List . fmap toGraphQL
-instance ToGraphQL a => ToGraphQL (Vector a) where
+instance ToGraphQL a => ToGraphQL (Vector a)
+ where
toGraphQL = Type.List . toList . fmap toGraphQL
-instance ToGraphQL a => ToGraphQL (Maybe a) where
+instance ToGraphQL a => ToGraphQL (Maybe a)
+ where
toGraphQL (Just justValue) = toGraphQL justValue
toGraphQL Nothing = Type.Null
-instance ToGraphQL Bool where
+instance ToGraphQL Bool
+ where
toGraphQL = Type.Boolean
-instance ToGraphQL Float where
+instance ToGraphQL Float
+ where
toGraphQL = Type.Float . realToFrac
-instance ToGraphQL Double where
+instance ToGraphQL Double
+ where
toGraphQL = Type.Float
+instance ToGraphQL Scientific
+ where
+ toGraphQL = Type.Float . toRealFloat
+
-- | Instances of this typeclass can be used to convert GraphQL internal
-- representation to user-defined type.
-class FromGraphQL a where
+class FromGraphQL a
+ where
fromGraphQL :: Type.Value -> Maybe a
-instance FromGraphQL Text where
+instance FromGraphQL Text
+ where
fromGraphQL (Type.String value) = Just value
fromGraphQL _ = Nothing
-instance FromGraphQL Int where
+instance FromGraphQL Int
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int8 where
+instance FromGraphQL Int8
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int16 where
+instance FromGraphQL Int16
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int32 where
+instance FromGraphQL Int32
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Int64 where
+instance FromGraphQL Int64
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word where
+instance FromGraphQL Word
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word8 where
+instance FromGraphQL Word8
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word16 where
+instance FromGraphQL Word16
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word32 where
+instance FromGraphQL Word32
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL Word64 where
+instance FromGraphQL Word64
+ where
fromGraphQL = fromGraphQLToIntegral
-instance FromGraphQL a => FromGraphQL [a] where
+instance FromGraphQL a => FromGraphQL [a]
+ where
fromGraphQL (Type.List value) = traverse fromGraphQL value
fromGraphQL _ = Nothing
-instance FromGraphQL a => FromGraphQL (Vector a) where
+instance FromGraphQL a => FromGraphQL (Vector a)
+ where
fromGraphQL (Type.List value) = Vector.fromList
<$> traverse fromGraphQL value
fromGraphQL _ = Nothing
-instance FromGraphQL a => FromGraphQL (Maybe a) where
+instance FromGraphQL a => FromGraphQL (Maybe a)
+ where
fromGraphQL Type.Null = Just Nothing
fromGraphQL value = Just <$> fromGraphQL value
-instance FromGraphQL Bool where
+instance FromGraphQL Bool
+ where
fromGraphQL (Type.Boolean value) = Just value
fromGraphQL _ = Nothing
-instance FromGraphQL Float where
+instance FromGraphQL Float
+ where
fromGraphQL (Type.Float value) = Just $ realToFrac value
fromGraphQL _ = Nothing
-instance FromGraphQL Double where
+instance FromGraphQL Double
+ where
fromGraphQL (Type.Float value) = Just value
fromGraphQL _ = Nothing
+
+instance FromGraphQL Scientific
+ where
+ fromGraphQL (Type.Float value) = Just $ realToFrac value
+ fromGraphQL _ = Nothing