{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable, DeriveDataTypeable #-}
module Data.SExpresso.SExpr
(
SExpr(..),
Sexp,
pattern A,
pattern L,
pattern Sexp,
pattern (:::),
pattern Nil,
isAtom,
sAtom,
isList,
sList
)
where
import Data.Bifunctor.TH
import Data.Data
import Data.Functor.Foldable.TH
data SExpr b a = SList b [SExpr b a]
| SAtom a
deriving (SExpr b a -> SExpr b a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall b a. (Eq b, Eq a) => SExpr b a -> SExpr b a -> Bool
/= :: SExpr b a -> SExpr b a -> Bool
$c/= :: forall b a. (Eq b, Eq a) => SExpr b a -> SExpr b a -> Bool
== :: SExpr b a -> SExpr b a -> Bool
$c== :: forall b a. (Eq b, Eq a) => SExpr b a -> SExpr b a -> Bool
Eq, Int -> SExpr b a -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall b a. (Show b, Show a) => Int -> SExpr b a -> ShowS
forall b a. (Show b, Show a) => [SExpr b a] -> ShowS
forall b a. (Show b, Show a) => SExpr b a -> String
showList :: [SExpr b a] -> ShowS
$cshowList :: forall b a. (Show b, Show a) => [SExpr b a] -> ShowS
show :: SExpr b a -> String
$cshow :: forall b a. (Show b, Show a) => SExpr b a -> String
showsPrec :: Int -> SExpr b a -> ShowS
$cshowsPrec :: forall b a. (Show b, Show a) => Int -> SExpr b a -> ShowS
Show, forall a b. a -> SExpr b b -> SExpr b a
forall a b. (a -> b) -> SExpr b a -> SExpr b b
forall b a b. a -> SExpr b b -> SExpr b a
forall b a b. (a -> b) -> SExpr b a -> SExpr b b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> SExpr b b -> SExpr b a
$c<$ :: forall b a b. a -> SExpr b b -> SExpr b a
fmap :: forall a b. (a -> b) -> SExpr b a -> SExpr b b
$cfmap :: forall b a b. (a -> b) -> SExpr b a -> SExpr b b
Functor, forall b. Functor (SExpr b)
forall {b}. Foldable (SExpr b)
forall b (m :: * -> *) a. Monad m => SExpr b (m a) -> m (SExpr b a)
forall b (f :: * -> *) a.
Applicative f =>
SExpr b (f a) -> f (SExpr b a)
forall b (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SExpr b a -> m (SExpr b b)
forall b (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SExpr b a -> f (SExpr b b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SExpr b a -> f (SExpr b b)
sequence :: forall (m :: * -> *) a. Monad m => SExpr b (m a) -> m (SExpr b a)
$csequence :: forall b (m :: * -> *) a. Monad m => SExpr b (m a) -> m (SExpr b a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SExpr b a -> m (SExpr b b)
$cmapM :: forall b (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SExpr b a -> m (SExpr b b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
SExpr b (f a) -> f (SExpr b a)
$csequenceA :: forall b (f :: * -> *) a.
Applicative f =>
SExpr b (f a) -> f (SExpr b a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SExpr b a -> f (SExpr b b)
$ctraverse :: forall b (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SExpr b a -> f (SExpr b b)
Traversable, forall a. SExpr b a -> Bool
forall b a. Eq a => a -> SExpr b a -> Bool
forall b a. Num a => SExpr b a -> a
forall b a. Ord a => SExpr b a -> a
forall m a. Monoid m => (a -> m) -> SExpr b a -> m
forall b m. Monoid m => SExpr b m -> m
forall b a. SExpr b a -> Bool
forall b a. SExpr b a -> Int
forall b a. SExpr b a -> [a]
forall a b. (a -> b -> b) -> b -> SExpr b a -> b
forall b a. (a -> a -> a) -> SExpr b a -> a
forall b m a. Monoid m => (a -> m) -> SExpr b a -> m
forall b b a. (b -> a -> b) -> b -> SExpr b a -> b
forall b a b. (a -> b -> b) -> b -> SExpr b a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => SExpr b a -> a
$cproduct :: forall b a. Num a => SExpr b a -> a
sum :: forall a. Num a => SExpr b a -> a
$csum :: forall b a. Num a => SExpr b a -> a
minimum :: forall a. Ord a => SExpr b a -> a
$cminimum :: forall b a. Ord a => SExpr b a -> a
maximum :: forall a. Ord a => SExpr b a -> a
$cmaximum :: forall b a. Ord a => SExpr b a -> a
elem :: forall a. Eq a => a -> SExpr b a -> Bool
$celem :: forall b a. Eq a => a -> SExpr b a -> Bool
length :: forall a. SExpr b a -> Int
$clength :: forall b a. SExpr b a -> Int
null :: forall a. SExpr b a -> Bool
$cnull :: forall b a. SExpr b a -> Bool
toList :: forall a. SExpr b a -> [a]
$ctoList :: forall b a. SExpr b a -> [a]
foldl1 :: forall a. (a -> a -> a) -> SExpr b a -> a
$cfoldl1 :: forall b a. (a -> a -> a) -> SExpr b a -> a
foldr1 :: forall a. (a -> a -> a) -> SExpr b a -> a
$cfoldr1 :: forall b a. (a -> a -> a) -> SExpr b a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> SExpr b a -> b
$cfoldl' :: forall b b a. (b -> a -> b) -> b -> SExpr b a -> b
foldl :: forall b a. (b -> a -> b) -> b -> SExpr b a -> b
$cfoldl :: forall b b a. (b -> a -> b) -> b -> SExpr b a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> SExpr b a -> b
$cfoldr' :: forall b a b. (a -> b -> b) -> b -> SExpr b a -> b
foldr :: forall a b. (a -> b -> b) -> b -> SExpr b a -> b
$cfoldr :: forall b a b. (a -> b -> b) -> b -> SExpr b a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> SExpr b a -> m
$cfoldMap' :: forall b m a. Monoid m => (a -> m) -> SExpr b a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> SExpr b a -> m
$cfoldMap :: forall b m a. Monoid m => (a -> m) -> SExpr b a -> m
fold :: forall m. Monoid m => SExpr b m -> m
$cfold :: forall b m. Monoid m => SExpr b m -> m
Foldable, SExpr b a -> DataType
SExpr b a -> Constr
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall {b} {a}. (Data b, Data a) => Typeable (SExpr b a)
forall b a. (Data b, Data a) => SExpr b a -> DataType
forall b a. (Data b, Data a) => SExpr b a -> Constr
forall b a.
(Data b, Data a) =>
(forall b. Data b => b -> b) -> SExpr b a -> SExpr b a
forall b a u.
(Data b, Data a) =>
Int -> (forall d. Data d => d -> u) -> SExpr b a -> u
forall b a u.
(Data b, Data a) =>
(forall d. Data d => d -> u) -> SExpr b a -> [u]
forall b a r r'.
(Data b, Data a) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> SExpr b a -> r
forall b a r r'.
(Data b, Data a) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> SExpr b a -> r
forall b a (m :: * -> *).
(Data b, Data a, Monad m) =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
forall b a (m :: * -> *).
(Data b, Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
forall b a (c :: * -> *).
(Data b, Data a) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SExpr b a)
forall b a (c :: * -> *).
(Data b, Data a) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SExpr b a -> c (SExpr b a)
forall b a (t :: * -> *) (c :: * -> *).
(Data b, Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (SExpr b a))
forall b a (t :: * -> * -> *) (c :: * -> *).
(Data b, Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (SExpr b a))
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SExpr b a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SExpr b a -> c (SExpr b a)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (SExpr b a))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
$cgmapMo :: forall b a (m :: * -> *).
(Data b, Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
$cgmapMp :: forall b a (m :: * -> *).
(Data b, Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
$cgmapM :: forall b a (m :: * -> *).
(Data b, Data a, Monad m) =>
(forall d. Data d => d -> m d) -> SExpr b a -> m (SExpr b a)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> SExpr b a -> u
$cgmapQi :: forall b a u.
(Data b, Data a) =>
Int -> (forall d. Data d => d -> u) -> SExpr b a -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> SExpr b a -> [u]
$cgmapQ :: forall b a u.
(Data b, Data a) =>
(forall d. Data d => d -> u) -> SExpr b a -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> SExpr b a -> r
$cgmapQr :: forall b a r r'.
(Data b, Data a) =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> SExpr b a -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> SExpr b a -> r
$cgmapQl :: forall b a r r'.
(Data b, Data a) =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> SExpr b a -> r
gmapT :: (forall b. Data b => b -> b) -> SExpr b a -> SExpr b a
$cgmapT :: forall b a.
(Data b, Data a) =>
(forall b. Data b => b -> b) -> SExpr b a -> SExpr b a
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (SExpr b a))
$cdataCast2 :: forall b a (t :: * -> * -> *) (c :: * -> *).
(Data b, Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (SExpr b a))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (SExpr b a))
$cdataCast1 :: forall b a (t :: * -> *) (c :: * -> *).
(Data b, Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (SExpr b a))
dataTypeOf :: SExpr b a -> DataType
$cdataTypeOf :: forall b a. (Data b, Data a) => SExpr b a -> DataType
toConstr :: SExpr b a -> Constr
$ctoConstr :: forall b a. (Data b, Data a) => SExpr b a -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SExpr b a)
$cgunfold :: forall b a (c :: * -> *).
(Data b, Data a) =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SExpr b a)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SExpr b a -> c (SExpr b a)
$cgfoldl :: forall b a (c :: * -> *).
(Data b, Data a) =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SExpr b a -> c (SExpr b a)
Data)
$(deriveBifunctor ''SExpr)
$(deriveBifoldable ''SExpr)
$(deriveBitraversable ''SExpr)
$(makeBaseFunctor ''SExpr)
type Sexp a = SExpr () a
pattern Sexp :: [Sexp a] -> Sexp a
pattern $bSexp :: forall a. [Sexp a] -> Sexp a
$mSexp :: forall {r} {a}. Sexp a -> ([Sexp a] -> r) -> ((# #) -> r) -> r
Sexp xs = SList () xs
pattern L :: [SExpr b a] -> SExpr b a
pattern $mL :: forall {r} {b} {a}.
SExpr b a -> ([SExpr b a] -> r) -> ((# #) -> r) -> r
L xs <- SList _ xs
pattern A :: a -> SExpr b a
pattern $bA :: forall a b. a -> SExpr b a
$mA :: forall {r} {a} {b}. SExpr b a -> (a -> r) -> ((# #) -> r) -> r
A x = SAtom x
uncons :: SExpr b a -> Maybe (SExpr b a, SExpr b a)
uncons :: forall b a. SExpr b a -> Maybe (SExpr b a, SExpr b a)
uncons (SAtom a
_) = forall a. Maybe a
Nothing
uncons (SList b
_ []) = forall a. Maybe a
Nothing
uncons (SList b
b (SExpr b a
x:[SExpr b a]
xs)) = forall a. a -> Maybe a
Just (SExpr b a
x, forall b a. b -> [SExpr b a] -> SExpr b a
SList b
b [SExpr b a]
xs)
infixr 5 :::
pattern (:::) :: SExpr b a -> SExpr b a -> SExpr b a
pattern x $m::: :: forall {r} {b} {a}.
SExpr b a -> (SExpr b a -> SExpr b a -> r) -> ((# #) -> r) -> r
::: xs <- (uncons -> Just (x, xs))
pattern Nil :: SExpr b a
pattern $mNil :: forall {r} {b} {a}. SExpr b a -> ((# #) -> r) -> ((# #) -> r) -> r
Nil <- SList _ []
isAtom :: SExpr b a -> Bool
isAtom :: forall b a. SExpr b a -> Bool
isAtom (A a
_) = Bool
True
isAtom SExpr b a
_ = Bool
False
sAtom :: SExpr b a -> Maybe a
sAtom :: forall b a. SExpr b a -> Maybe a
sAtom (A a
x) = forall a. a -> Maybe a
Just a
x
sAtom SExpr b a
_ = forall a. Maybe a
Nothing
isList :: SExpr b a -> Bool
isList :: forall b a. SExpr b a -> Bool
isList (L [SExpr b a]
_) = Bool
True
isList SExpr b a
_ = Bool
False
sList :: SExpr b a -> Maybe [SExpr b a]
sList :: forall b a. SExpr b a -> Maybe [SExpr b a]
sList (L [SExpr b a]
l) = forall a. a -> Maybe a
Just [SExpr b a]
l
sList SExpr b a
_ = forall a. Maybe a
Nothing