Browse Source

Included a better API for converting to/from Eben

Getty Ritter 7 years ago
parent
commit
8d8bac9ea5
1 changed files with 42 additions and 0 deletions
  1. 42 0
      Data/Eben.hs

+ 42 - 0
Data/Eben.hs

@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE ViewPatterns #-}
 {-# LANGUAGE ViewPatterns #-}
+{-# LANGUAGE FlexibleInstances #-}
 
 
 module Data.Eben where
 module Data.Eben where
 
 
@@ -58,6 +59,26 @@ decode = go
               (str, rs'') = BS.splitAt len (BS.tail rs')
               (str, rs'') = BS.splitAt len (BS.tail rs')
           in Just (BS.toStrict str, rs'')
           in Just (BS.toStrict str, rs'')
 
 
+class FromEben t where
+  fromEben :: Value -> Maybe t
+
+instance FromEben Float where
+  fromEben (Float f)   = Just f
+  fromEben (Integer i) = Just (fromIntegral i)
+  fromEben _           = Nothing
+
+instance FromEben Int where
+  fromEben (Integer i) = Just (fromIntegral i)
+  fromEben _           = Nothing
+
+instance FromEben a => FromEben [a] where
+  fromEben (List ls) = mapM fromEben ls
+  fromEben _         = Nothing
+
+instance (FromEben a, FromEben b) => FromEben (a, b) where
+  fromEben (List [x,y]) = (,) <$> fromEben x <*> fromEben y
+  fromEben _            = Nothing
+
 asDict :: Value -> Maybe (Map B.ByteString Value)
 asDict :: Value -> Maybe (Map B.ByteString Value)
 asDict (Dict ds) = Just ds
 asDict (Dict ds) = Just ds
 asDict _         = Nothing
 asDict _         = Nothing
@@ -86,6 +107,27 @@ toNum n (BS.uncons->Just(b, bs)) =
   toNum (n * 10 + toDigit b) bs
   toNum (n * 10 + toDigit b) bs
 toNum n _ = n
 toNum n _ = n
 
 
+class ToEben t where
+  toEben :: t -> Value
+
+instance ToEben a => ToEben [a] where
+  toEben = List . map toEben
+
+instance ToEben Float where
+  toEben = Float
+
+instance ToEben Int where
+  toEben = Integer . fromIntegral
+
+instance ToEben Integer where
+  toEben = Integer . fromIntegral
+
+instance (ToEben l, ToEben r) => ToEben (l, r) where
+  toEben (x, y) = List [ toEben x, toEben y ]
+
+dict :: [(B.ByteString, Value)] -> Value
+dict = Dict . M.fromList
+
 encode :: Value -> ByteString
 encode :: Value -> ByteString
 encode = BL.toLazyByteString . go
 encode = BL.toLazyByteString . go
   where go (List vs) =
   where go (List vs) =