-----------------------------------------------------------------------------
-- |
-- Copyright : (c) Joost Visser 2004
-- License : LGPL
--
-- Maintainer : joost.visser@di.uminho.pt
-- Stability : experimental
-- Portability : portable
--
-- This module is part of the ATerm library for Haskell. It provides the class
-- ATermConvertible of types that are convertible to and from ATerms. Additionally,
-- it provides default instances of this class for some predefined Prelude
-- types.
--
-----------------------------------------------------------------------------
module Data.ATerm.Conversion where
import Data.ATerm.AbstractSyntax
import Data.ATerm.ReadWrite
import Data.Ratio
import Data.Char
-----------------------------------------------------------------------------
-- * Conversion to and from ATerms
class ATermConvertible t where
-- | Convert to an ATerm.
toATerm :: t -> ATerm
-- | Convert from an ATerm.
fromATerm :: ATerm -> t
-- | Auxiliary function for reporting errors.
fromATermError :: String -> ATerm -> a
fromATermError t u
= error ("Cannot convert ATerm to "++t++": "++(err u))
where err u = case u of
AAppl s _ -> '!':s
AList _ -> "!AList"
otherwise -> "!AInt"
-----------------------------------------------------------------------------
-- * Conversion of ATerms to and from Strings
-- | Convert to a textual ATerm representation without sharing (TXT format).
toATermString :: ATermConvertible t => t -> String
toATermString t = writeATerm (toATerm t)
-- | Convert to a textual ATerm representation with full sharing (TAF format).
toSharedATermString :: ATermConvertible t => t -> String
toSharedATermString t = writeSharedATerm (toATerm t)
-- | Convert from a textual ATerm representation.
fromATermString :: ATermConvertible t => String -> t
fromATermString s = fromATerm (readATerm s)
-----------------------------------------------------------------------------
-- * Instances for basic types
-- Lists
instance ATermConvertible a => ATermConvertible [a] where
toATerm as = AList (map toATerm as)
fromATerm (AList as) = map fromATerm as
fromATerm t = fromATermError "Prelude.[]" t
-- Maybe
instance ATermConvertible a => ATermConvertible (Maybe a) where
toATerm Nothing = AAppl "None" []
toATerm (Just a) = AAppl "Just" [toATerm a]
fromATerm (AAppl "None" []) = Nothing
fromATerm (AAppl "Some" [a]) = Just (fromATerm a)
fromATerm t = fromATermError "Prelude.Maybe" t
-- 2-Tuples
instance (ATermConvertible a, ATermConvertible b)
=> ATermConvertible (a,b) where
toATerm (a,b) = AAppl "Tuple2" [toATerm a, toATerm b]
fromATerm (AAppl "Tuple2" [a,b]) = (fromATerm a,fromATerm b)
fromATerm t = fromATermError "Prelude.(,)" t
-- Either
instance (ATermConvertible a, ATermConvertible b)
=> ATermConvertible (Either a b) where
toATerm (Left a) = AAppl "Left" [toATerm a]
toATerm (Right b) = AAppl "Right" [toATerm b]
fromATerm (AAppl "Left" [a]) = Left (fromATerm a)
fromATerm (AAppl "Right" [b]) = Right (fromATerm b)
fromATerm t = fromATermError "Prelude.Either" t
-- String
instance ATermConvertible String where
toATerm s = AAppl (show s) []
fromATerm (AAppl s []) = read s
fromATerm t = fromATermError "Prelude.String" t
-- Integral
instance Integral n => ATermConvertible n where
toATerm i = AInt (toInteger i)
fromATerm (AInt i) = fromInteger i
fromATerm t = fromATermError "Prelude.Integral" t
-- Bool
instance ATermConvertible Bool where
toATerm True = AAppl "True" []
toATerm False = AAppl "False" []
fromATerm (AAppl "True" []) = True
fromATerm (AAppl "False" []) = False
fromATerm t = fromATermError "Prelude.Bool" t
-- Bool
instance ATermConvertible () where
toATerm () = AAppl "()" []
fromATerm (AAppl "()" []) = ()
fromATerm t = fromATermError "Prelude.()" t
-- Char
instance ATermConvertible Char where
toATerm c = AInt (toInteger . ord $ c)
fromATerm (AInt c) = chr . fromInteger $ c
fromATerm t = fromATermError "Prelude.Char" t
-- Ratio
instance (Integral a, ATermConvertible a)
=> ATermConvertible (Ratio a) where
toATerm xy = AAppl "Ratio" [toATerm (numerator xy),
toATerm (denominator xy)]
fromATerm (AAppl "Ratio" [x,y])
= (fromATerm x)%(fromATerm y)
fromATerm t = fromATermError "Ratio.Ratio" t
------------------------------------------------------------------------------