module Data.Sexpr (
Sexpr(..)
, SexprToHexpr(..)
, sexprToHexpr
) where
import Data.Hierarchy
import Data.Hexpr
data Sexpr p a = Atom p a | Sexpr p [Sexpr p a]
instance Hierarchy Sexpr p where
getPos (Atom p _) = p
getPos (Sexpr p _) = p
individual = Atom
conjoin p (Sexpr _ as) (Sexpr _ bs) = Sexpr p (as++bs)
conjoin p a (Sexpr _ bs) = Sexpr p (a:bs)
conjoin p (Sexpr _ as) b = Sexpr p (as++[b])
conjoin p a b = Sexpr p [a, b]
adjoinsl p x xs = Sexpr p (x:xs)
adjoins = Sexpr
instance Openable (Sexpr p) where
openAp (f, _) (Atom p x) = Atom p (f x)
openAp (_, f) (Sexpr p xs) = Sexpr p (f xs)
class SexprToHexpr a where
xformNull :: p -> Hexpr p a
xformNull = error "Empty sexprs are disallowed"
xformSingleton :: Sexpr p a -> Hexpr p a
xformDeepAtom :: a -> a
xformDeepAtom = id
sexprToHexpr :: (SexprToHexpr a) => Sexpr p a -> Hexpr p a
sexprToHexpr (Atom p x) = Leaf p (xformDeepAtom x)
sexprToHexpr (Sexpr p []) = xformNull p
sexprToHexpr (Sexpr p [x]) = xformSingleton x
sexprToHexpr (Sexpr p xs) = Branch p (map sexprToHexpr xs)