packages feed

aterm-utils 0.1.0.0 → 0.2.0.0

raw patch · 3 files changed

+191/−10 lines, 3 filesdep +mtlPVP ok

version bump matches the API change (PVP)

Dependencies added: mtl

API changes (from Hackage documentation)

+ ATerm.Generics: atermToIntegral :: Integral a => ATerm -> Maybe a
+ ATerm.Generics: atermToList :: FromATerm a => ATerm -> Maybe [a]
+ ATerm.Generics: atermToRead :: Read a => ATerm -> Maybe a
+ ATerm.Generics: atermToString :: ATerm -> Maybe String
+ ATerm.Generics: class FromATerm a where fromATerm a = to <$> gFromATerm a fromATermList = atermToList
+ ATerm.Generics: class GFromATerm f
+ ATerm.Generics: class GFromATerms f
+ ATerm.Generics: class GToATerm f
+ ATerm.Generics: class GToATerms f
+ ATerm.Generics: class ToATerm a where toATerm x = gToATerm (from x) toATermList = listToATerm
+ ATerm.Generics: fromATerm :: FromATerm a => ATerm -> Maybe a
+ ATerm.Generics: fromATermList :: FromATerm a => ATerm -> Maybe [a]
+ ATerm.Generics: gFromATerm :: GFromATerm f => ATerm -> Maybe (f a)
+ ATerm.Generics: gFromATerms :: GFromATerms f => StateT [ATerm] Maybe (f a)
+ ATerm.Generics: gFromATerms' :: GFromATerms f => [ATerm] -> Maybe (f a)
+ ATerm.Generics: gToATerm :: GToATerm f => f a -> ATerm
+ ATerm.Generics: gToATerms :: GToATerms f => f a -> [ATerm] -> [ATerm]
+ ATerm.Generics: instance (Constructor c, GFromATerms a) => GFromATerm (C1 c a)
+ ATerm.Generics: instance (Constructor c, GToATerms a) => GToATerm (C1 c a)
+ ATerm.Generics: instance (FromATerm a, FromATerm b) => FromATerm (Either a b)
+ ATerm.Generics: instance (FromATerm a, FromATerm b) => FromATerm (a, b)
+ ATerm.Generics: instance (FromATerm a, FromATerm b, FromATerm c) => FromATerm (a, b, c)
+ ATerm.Generics: instance (GFromATerm f, GFromATerm g) => GFromATerm (f :+: g)
+ ATerm.Generics: instance (GFromATerms f, GFromATerms g) => GFromATerms (f :*: g)
+ ATerm.Generics: instance (GToATerm f, GToATerm g) => GToATerm (f :+: g)
+ ATerm.Generics: instance (GToATerms f, GToATerms g) => GToATerms (f :*: g)
+ ATerm.Generics: instance (ToATerm a, ToATerm b) => ToATerm (Either a b)
+ ATerm.Generics: instance (ToATerm a, ToATerm b) => ToATerm (a, b)
+ ATerm.Generics: instance FromATerm ()
+ ATerm.Generics: instance FromATerm Bool
+ ATerm.Generics: instance FromATerm Char
+ ATerm.Generics: instance FromATerm Double
+ ATerm.Generics: instance FromATerm Float
+ ATerm.Generics: instance FromATerm Int
+ ATerm.Generics: instance FromATerm Integer
+ ATerm.Generics: instance FromATerm a => FromATerm (Maybe a)
+ ATerm.Generics: instance FromATerm a => FromATerm [a]
+ ATerm.Generics: instance FromATerm a => GFromATerms (Rec0 a)
+ ATerm.Generics: instance GFromATerm a => GFromATerm (D1 c a)
+ ATerm.Generics: instance GFromATerms U1
+ ATerm.Generics: instance GFromATerms f => GFromATerms (S1 i f)
+ ATerm.Generics: instance GToATerm a => GToATerm (D1 c a)
+ ATerm.Generics: instance GToATerms U1
+ ATerm.Generics: instance GToATerms f => GToATerms (S1 i f)
+ ATerm.Generics: instance ToATerm ()
+ ATerm.Generics: instance ToATerm Bool
+ ATerm.Generics: instance ToATerm Char
+ ATerm.Generics: instance ToATerm Double
+ ATerm.Generics: instance ToATerm Float
+ ATerm.Generics: instance ToATerm Int
+ ATerm.Generics: instance ToATerm Integer
+ ATerm.Generics: instance ToATerm a => GToATerms (Rec0 a)
+ ATerm.Generics: instance ToATerm a => ToATerm (Maybe a)
+ ATerm.Generics: instance ToATerm a => ToATerm [a]
+ ATerm.Generics: integralToATerm :: Integral a => a -> ATerm
+ ATerm.Generics: listToATerm :: ToATerm a => [a] -> ATerm
+ ATerm.Generics: next :: FromATerm a => StateT [ATerm] Maybe a
+ ATerm.Generics: showToATerm :: Show a => a -> ATerm
+ ATerm.Generics: stringToATerm :: String -> ATerm
+ ATerm.Generics: toATerm :: ToATerm a => a -> ATerm
+ ATerm.Generics: toATermList :: ToATerm a => [a] -> ATerm

Files

aterm-utils.cabal view
@@ -1,5 +1,5 @@ name:                aterm-utils-version:             0.1.0.0+version:             0.2.0.0 synopsis:            Utility functions for working with aterms as generated by Minitermite -- description:          license:             BSD3@@ -29,12 +29,14 @@  library -  exposed-modules:   ATerm.Utilities+  exposed-modules:   ATerm.Generics                    , ATerm.Matching                    , ATerm.Pretty+                   , ATerm.Utilities    Build-depends:       base < 5                      , aterm+                     , mtl                      , transformers                      , wl-pprint 
+ src/ATerm/Generics.hs view
@@ -0,0 +1,181 @@+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE PatternGuards #-}+module ATerm.Generics where++import ATerm.Unshared hiding (fromATerm)+import GHC.Generics+import Control.Applicative+import Control.Monad.State++------------------------------------------------------------------------+-- Generic data type serialization+------------------------------------------------------------------------++class GToATerm f where+  gToATerm :: f a -> ATerm++instance GToATerm a => GToATerm (D1 c a) where+  gToATerm (M1 x) = gToATerm x++instance (GToATerm f, GToATerm g) => GToATerm (f :+: g) where+  gToATerm (L1 x) = gToATerm x+  gToATerm (R1 x) = gToATerm x++instance (Constructor c, GToATerms a) => GToATerm (C1 c a) where+  gToATerm m1 = AAppl (conName m1) (gToATerms (unM1 m1) []) []+++------------------------------------------------------------------------+-- Generic constructor serialization+------------------------------------------------------------------------++class                                  GToATerms f         where gToATerms          :: f a -> [ATerm] -> [ATerm]+instance GToATerms f                => GToATerms (S1 i f)  where gToATerms (M1 x)    = gToATerms x+instance (GToATerms f, GToATerms g) => GToATerms (f :*: g) where gToATerms (f :*: g) = gToATerms f . gToATerms g+instance ToATerm a                  => GToATerms (Rec0 a)  where gToATerms (K1 x)    = (toATerm x:)+instance                               GToATerms U1        where gToATerms U1        = id++------------------------------------------------------------------------+-- Serialization+------------------------------------------------------------------------++class ToATerm a where+  toATerm :: a -> ATerm+  default toATerm :: (Generic a, GToATerm (Rep a)) => a -> ATerm+  toATerm x = gToATerm (from x)++  toATermList :: [a] -> ATerm+  default toATermList :: Generic a => [a] -> ATerm+  toATermList = listToATerm++-- Automatically derived instances+instance                           ToATerm Bool+instance                           ToATerm Float+instance                           ToATerm Double+instance                           ToATerm ()+instance ToATerm a              => ToATerm (Maybe a)+instance (ToATerm a, ToATerm b) => ToATerm (a,b)+instance (ToATerm a, ToATerm b) => ToATerm (Either a b)++instance                           ToATerm Char    where toATerm     = showToATerm+                                                         toATermList = stringToATerm+instance                           ToATerm Int     where toATerm     = integralToATerm+instance                           ToATerm Integer where toATerm     = integralToATerm+                                                         toATermList = listToATerm+instance ToATerm a              => ToATerm [a]     where toATerm     = toATermList++-- Base type implementations+integralToATerm :: Integral a => a -> ATerm+integralToATerm x = AInt (toInteger x) []++showToATerm :: Show a => a -> ATerm+showToATerm x = AAppl (show x) [] []++listToATerm :: ToATerm a => [a] -> ATerm+listToATerm xs = AList (map toATerm xs) []++stringToATerm :: String -> ATerm+stringToATerm s = AAppl (show s) [] []++------------------------------------------------------------------------+-- Deserialization+------------------------------------------------------------------------++class FromATerm a where+  fromATerm :: ATerm -> Maybe a++  default fromATerm :: (Generic a, GFromATerm (Rep a)) => ATerm -> Maybe a+  fromATerm a = to <$> gFromATerm a++  fromATermList :: ATerm -> Maybe [a]++  default fromATermList :: ATerm -> Maybe [a]+  fromATermList = atermToList++-- Automatically derived instances+instance FromATerm                                  ()+instance FromATerm                                  Bool+instance FromATerm                                  Float+instance FromATerm                                  Double+instance (FromATerm a, FromATerm b)              => FromATerm (a,b)+instance (FromATerm a, FromATerm b, FromATerm c) => FromATerm (a, b, c)+instance (FromATerm a, FromATerm b)              => FromATerm (Either a b)+instance FromATerm a                             => FromATerm (Maybe a)++instance                FromATerm Int     where fromATerm     = atermToIntegral+instance                FromATerm Integer where fromATerm     = atermToIntegral+instance                FromATerm Char    where fromATerm     = atermToRead+                                                fromATermList = atermToString+instance FromATerm a => FromATerm [a]     where fromATerm     = fromATermList++-- Base type implementations+atermToIntegral :: Integral a => ATerm -> Maybe a+atermToIntegral (AInt x _) = Just (fromIntegral x)+atermToIntegral _          = Nothing++atermToRead :: Read a => ATerm -> Maybe a+atermToRead (AAppl x [] _) | [(z,"")] <- reads x = Just z+atermToRead _                                    = Nothing++atermToString :: ATerm -> Maybe String+atermToString (AAppl ('"':x) [] _) | null x        = Nothing+                                   | last x == '"' = Just (init x)+atermToString _                                    = Nothing++atermToList :: FromATerm a => ATerm -> Maybe [a]+atermToList (AList as _) = mapM fromATerm as+atermToList _            = Nothing+++------------------------------------------------------------------------+-- Generic data type deserialization+------------------------------------------------------------------------++class GFromATerm f where+  gFromATerm :: ATerm -> Maybe (f a)++instance GFromATerm a => GFromATerm (D1 c a) where+  gFromATerm a = M1 <$> gFromATerm a++instance (GFromATerm f, GFromATerm g) => GFromATerm (f :+: g) where+  gFromATerm a = L1 <$> gFromATerm a -- try to deserialize as the left side+             <|> R1 <$> gFromATerm a -- fail over to deserializing on the right++instance (Constructor c, GFromATerms a) => GFromATerm (C1 c a) where+  gFromATerm (AAppl str xs _) =+    -- Lambda used to get a monomorphic binding+    -- conName does not evaluate its argument+    (\result@(~(Just x)) -> if conName x == str then result else Nothing)+    (M1 <$> gFromATerms' xs)++  gFromATerm _ = Nothing++------------------------------------------------------------------------+-- Generic constructor deserialization+------------------------------------------------------------------------++-- | Convert all the 'ATerm' elements into the requested structure+gFromATerms' :: GFromATerms f => [ATerm] -> Maybe (f a)+gFromATerms' = evalStateT $ do+  res <- gFromATerms+  []  <- get -- check that all aterms are consumed+  return res++-- | Convert the next 'ATerm' to the next needed field type+next :: FromATerm a => StateT [ATerm] Maybe a+next = do+  x:xs <- get -- pattern failure happens in Maybe+  put xs+  lift (fromATerm x)++class                                      GFromATerms f         where gFromATerms :: StateT [ATerm] Maybe (f a)+instance GFromATerms f                  => GFromATerms (S1 i f)  where gFromATerms = M1    <$> gFromATerms+instance (GFromATerms f, GFromATerms g) => GFromATerms (f :*: g) where gFromATerms = (:*:) <$> gFromATerms <*> gFromATerms+instance FromATerm a                    => GFromATerms (Rec0 a)  where gFromATerms = K1    <$> next+instance                                   GFromATerms U1        where gFromATerms = pure U1++-- example:   fromATerm (toATerm ('a', True)) :: Maybe (Char, Bool)
src/ATerm/Matching.hs view
@@ -59,7 +59,7 @@ exactlyL :: MonadPlus m => [ATermTable -> m a] -> ATermTable -> m [a] exactlyL ms t = case getATerm t of   ShAList ls _ -> do-    _ <- guard (length ms == length ls)+    guard (length ms == length ls)     sequence (zipWith (\m i -> m (getATermByIndex1 i t)) ms ls)   _ -> mzero @@ -67,18 +67,16 @@ exactlyA :: MonadPlus m => String -> [ATermTable -> m a] -> ATermTable -> m [a] exactlyA s ms t = case getATerm t of   ShAAppl s' ls _ -> do-    _ <- exactly s s'-    _ <- guard (length ms == length ls)+    exactly s s'+    guard (length ms == length ls)     sequence (zipWith (\m i -> U.app m t i) ms ls)   _ -> mzero  -- | Looks for an Appl with name 's' and any children exactlyNamed :: MonadPlus m => String -> ATermTable -> m () exactlyNamed s t = case getATerm t of-  ShAAppl s' _ _ -> do-    _ <- exactly s s'-    return ()-  _ -> mzero+  ShAAppl s' _ _ -> exactly s s'+  _              -> mzero  --------------------------------------------------------------------- -- ** Partial matchers, ie., they just specify part of the structure@@ -114,7 +112,7 @@ containsA :: String -> [ATermTable -> a] -> ATermTable -> [a] containsA s ams t = case getATerm t of   ShAAppl s' ls _ -> do-    _ <- exactly s s'+    exactly s s'     containsChildren ams ls t   _               -> mzero