{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
module Language.Sexp.Types
( Atom (..)
, Prefix (..)
, Fix (..)
, SexpF (..)
, Compose (..)
, Position (..)
, dummyPos
, LocatedBy (..)
, location
, extract
, stripLocation
, addLocation
) where
import Control.DeepSeq
import Data.Bifunctor
import Data.Fix (Fix (..))
import Data.Functor.Classes
import Data.Functor.Compose
import Data.Functor.Foldable (cata)
import Data.Scientific (Scientific)
import Data.Text (Text)
import GHC.Generics
import Prettyprinter (Pretty (..), colon)
data Position =
Position FilePath {-# UNPACK #-} !Int {-# UNPACK #-} !Int
deriving (Eq Position
Position -> Position -> Bool
Position -> Position -> Ordering
Position -> Position -> Position
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Position -> Position -> Position
$cmin :: Position -> Position -> Position
max :: Position -> Position -> Position
$cmax :: Position -> Position -> Position
>= :: Position -> Position -> Bool
$c>= :: Position -> Position -> Bool
> :: Position -> Position -> Bool
$c> :: Position -> Position -> Bool
<= :: Position -> Position -> Bool
$c<= :: Position -> Position -> Bool
< :: Position -> Position -> Bool
$c< :: Position -> Position -> Bool
compare :: Position -> Position -> Ordering
$ccompare :: Position -> Position -> Ordering
Ord, Position -> Position -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Position -> Position -> Bool
$c/= :: Position -> Position -> Bool
== :: Position -> Position -> Bool
$c== :: Position -> Position -> Bool
Eq, forall x. Rep Position x -> Position
forall x. Position -> Rep Position x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Position x -> Position
$cfrom :: forall x. Position -> Rep Position x
Generic)
dummyPos :: Position
dummyPos :: Position
dummyPos = FilePath -> Int -> Int -> Position
Position FilePath
"<no location information>" Int
1 Int
0
instance Pretty Position where
pretty :: forall ann. Position -> Doc ann
pretty (Position FilePath
fn Int
line Int
col) =
forall a ann. Pretty a => a -> Doc ann
pretty FilePath
fn forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty Int
line forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann
colon forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty Int
col
instance Show Position where
show :: Position -> FilePath
show (Position FilePath
fn Int
line Int
col) =
FilePath
fn forall a. [a] -> [a] -> [a]
++ FilePath
":" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> FilePath
show Int
line forall a. [a] -> [a] -> [a]
++ FilePath
":" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> FilePath
show Int
col
data LocatedBy a e = !a :< e
deriving (Int -> LocatedBy a e -> ShowS
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
forall a e. (Show a, Show e) => Int -> LocatedBy a e -> ShowS
forall a e. (Show a, Show e) => [LocatedBy a e] -> ShowS
forall a e. (Show a, Show e) => LocatedBy a e -> FilePath
showList :: [LocatedBy a e] -> ShowS
$cshowList :: forall a e. (Show a, Show e) => [LocatedBy a e] -> ShowS
show :: LocatedBy a e -> FilePath
$cshow :: forall a e. (Show a, Show e) => LocatedBy a e -> FilePath
showsPrec :: Int -> LocatedBy a e -> ShowS
$cshowsPrec :: forall a e. (Show a, Show e) => Int -> LocatedBy a e -> ShowS
Show, LocatedBy a e -> LocatedBy a e -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a e. (Eq a, Eq e) => LocatedBy a e -> LocatedBy a e -> Bool
/= :: LocatedBy a e -> LocatedBy a e -> Bool
$c/= :: forall a e. (Eq a, Eq e) => LocatedBy a e -> LocatedBy a e -> Bool
== :: LocatedBy a e -> LocatedBy a e -> Bool
$c== :: forall a e. (Eq a, Eq e) => LocatedBy a e -> LocatedBy a e -> Bool
Eq, LocatedBy a e -> LocatedBy a e -> Bool
LocatedBy a e -> LocatedBy a e -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a} {e}. (Ord a, Ord e) => Eq (LocatedBy a e)
forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Bool
forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Ordering
forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> LocatedBy a e
min :: LocatedBy a e -> LocatedBy a e -> LocatedBy a e
$cmin :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> LocatedBy a e
max :: LocatedBy a e -> LocatedBy a e -> LocatedBy a e
$cmax :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> LocatedBy a e
>= :: LocatedBy a e -> LocatedBy a e -> Bool
$c>= :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Bool
> :: LocatedBy a e -> LocatedBy a e -> Bool
$c> :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Bool
<= :: LocatedBy a e -> LocatedBy a e -> Bool
$c<= :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Bool
< :: LocatedBy a e -> LocatedBy a e -> Bool
$c< :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Bool
compare :: LocatedBy a e -> LocatedBy a e -> Ordering
$ccompare :: forall a e.
(Ord a, Ord e) =>
LocatedBy a e -> LocatedBy a e -> Ordering
Ord, forall a b. a -> LocatedBy a b -> LocatedBy a a
forall a b. (a -> b) -> LocatedBy a a -> LocatedBy a b
forall a a b. a -> LocatedBy a b -> LocatedBy a a
forall a a b. (a -> b) -> LocatedBy a a -> LocatedBy a 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 -> LocatedBy a b -> LocatedBy a a
$c<$ :: forall a a b. a -> LocatedBy a b -> LocatedBy a a
fmap :: forall a b. (a -> b) -> LocatedBy a a -> LocatedBy a b
$cfmap :: forall a a b. (a -> b) -> LocatedBy a a -> LocatedBy a b
Functor, forall a. LocatedBy a a -> Bool
forall a a. Eq a => a -> LocatedBy a a -> Bool
forall a a. Num a => LocatedBy a a -> a
forall a a. Ord a => LocatedBy a a -> a
forall a m. Monoid m => LocatedBy a m -> m
forall m a. Monoid m => (a -> m) -> LocatedBy a a -> m
forall a a. LocatedBy a a -> Bool
forall a a. LocatedBy a a -> Int
forall a a. LocatedBy a a -> [a]
forall a b. (a -> b -> b) -> b -> LocatedBy a a -> b
forall a a. (a -> a -> a) -> LocatedBy a a -> a
forall a m a. Monoid m => (a -> m) -> LocatedBy a a -> m
forall a b a. (b -> a -> b) -> b -> LocatedBy a a -> b
forall a a b. (a -> b -> b) -> b -> LocatedBy a 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 => LocatedBy a a -> a
$cproduct :: forall a a. Num a => LocatedBy a a -> a
sum :: forall a. Num a => LocatedBy a a -> a
$csum :: forall a a. Num a => LocatedBy a a -> a
minimum :: forall a. Ord a => LocatedBy a a -> a
$cminimum :: forall a a. Ord a => LocatedBy a a -> a
maximum :: forall a. Ord a => LocatedBy a a -> a
$cmaximum :: forall a a. Ord a => LocatedBy a a -> a
elem :: forall a. Eq a => a -> LocatedBy a a -> Bool
$celem :: forall a a. Eq a => a -> LocatedBy a a -> Bool
length :: forall a. LocatedBy a a -> Int
$clength :: forall a a. LocatedBy a a -> Int
null :: forall a. LocatedBy a a -> Bool
$cnull :: forall a a. LocatedBy a a -> Bool
toList :: forall a. LocatedBy a a -> [a]
$ctoList :: forall a a. LocatedBy a a -> [a]
foldl1 :: forall a. (a -> a -> a) -> LocatedBy a a -> a
$cfoldl1 :: forall a a. (a -> a -> a) -> LocatedBy a a -> a
foldr1 :: forall a. (a -> a -> a) -> LocatedBy a a -> a
$cfoldr1 :: forall a a. (a -> a -> a) -> LocatedBy a a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> LocatedBy a a -> b
$cfoldl' :: forall a b a. (b -> a -> b) -> b -> LocatedBy a a -> b
foldl :: forall b a. (b -> a -> b) -> b -> LocatedBy a a -> b
$cfoldl :: forall a b a. (b -> a -> b) -> b -> LocatedBy a a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> LocatedBy a a -> b
$cfoldr' :: forall a a b. (a -> b -> b) -> b -> LocatedBy a a -> b
foldr :: forall a b. (a -> b -> b) -> b -> LocatedBy a a -> b
$cfoldr :: forall a a b. (a -> b -> b) -> b -> LocatedBy a a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> LocatedBy a a -> m
$cfoldMap' :: forall a m a. Monoid m => (a -> m) -> LocatedBy a a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> LocatedBy a a -> m
$cfoldMap :: forall a m a. Monoid m => (a -> m) -> LocatedBy a a -> m
fold :: forall m. Monoid m => LocatedBy a m -> m
$cfold :: forall a m. Monoid m => LocatedBy a m -> m
Foldable, forall a. Functor (LocatedBy a)
forall a. Foldable (LocatedBy a)
forall a (m :: * -> *) a.
Monad m =>
LocatedBy a (m a) -> m (LocatedBy a a)
forall a (f :: * -> *) a.
Applicative f =>
LocatedBy a (f a) -> f (LocatedBy a a)
forall a (m :: * -> *) a b.
Monad m =>
(a -> m b) -> LocatedBy a a -> m (LocatedBy a b)
forall a (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> LocatedBy a a -> f (LocatedBy a 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) -> LocatedBy a a -> f (LocatedBy a b)
sequence :: forall (m :: * -> *) a.
Monad m =>
LocatedBy a (m a) -> m (LocatedBy a a)
$csequence :: forall a (m :: * -> *) a.
Monad m =>
LocatedBy a (m a) -> m (LocatedBy a a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> LocatedBy a a -> m (LocatedBy a b)
$cmapM :: forall a (m :: * -> *) a b.
Monad m =>
(a -> m b) -> LocatedBy a a -> m (LocatedBy a b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
LocatedBy a (f a) -> f (LocatedBy a a)
$csequenceA :: forall a (f :: * -> *) a.
Applicative f =>
LocatedBy a (f a) -> f (LocatedBy a a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> LocatedBy a a -> f (LocatedBy a b)
$ctraverse :: forall a (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> LocatedBy a a -> f (LocatedBy a b)
Traversable, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a e x. Rep (LocatedBy a e) x -> LocatedBy a e
forall a e x. LocatedBy a e -> Rep (LocatedBy a e) x
$cto :: forall a e x. Rep (LocatedBy a e) x -> LocatedBy a e
$cfrom :: forall a e x. LocatedBy a e -> Rep (LocatedBy a e) x
Generic)
instance Bifunctor LocatedBy where
bimap :: forall a b c d.
(a -> b) -> (c -> d) -> LocatedBy a c -> LocatedBy b d
bimap a -> b
f c -> d
g (a
a :< c
e) = a -> b
f a
a forall a e. a -> e -> LocatedBy a e
:< c -> d
g c
e
instance (Eq p) => Eq1 (LocatedBy p) where
liftEq :: forall a b.
(a -> b -> Bool) -> LocatedBy p a -> LocatedBy p b -> Bool
liftEq a -> b -> Bool
eq (p
p :< a
a) (p
q :< b
b) = p
p forall a. Eq a => a -> a -> Bool
== p
q Bool -> Bool -> Bool
&& a
a a -> b -> Bool
`eq` b
b
instance (NFData p, NFData e) => NFData (LocatedBy p e)
instance NFData p => NFData1 (LocatedBy p) where
liftRnf :: forall a. (a -> ()) -> LocatedBy p a -> ()
liftRnf a -> ()
f (p
p :< a
a) = forall a. NFData a => a -> ()
rnf p
p seq :: forall a b. a -> b -> b
`seq` a -> ()
f a
a
location :: LocatedBy a e -> a
location :: forall a e. LocatedBy a e -> a
location (a
a :< e
_) = a
a
extract :: LocatedBy a e -> e
(a
_ :< e
e) = e
e
stripLocation :: (Functor f) => Fix (Compose (LocatedBy p) f) -> Fix f
stripLocation :: forall (f :: * -> *) p.
Functor f =>
Fix (Compose (LocatedBy p) f) -> Fix f
stripLocation = forall t a. Recursive t => (Base t a -> a) -> t -> a
cata (forall (f :: * -> *). f (Fix f) -> Fix f
Fix forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a e. LocatedBy a e -> e
extract forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose)
addLocation :: (Functor f) => p -> Fix f -> Fix (Compose (LocatedBy p) f)
addLocation :: forall (f :: * -> *) p.
Functor f =>
p -> Fix f -> Fix (Compose (LocatedBy p) f)
addLocation p
p = forall t a. Recursive t => (Base t a -> a) -> t -> a
cata (forall (f :: * -> *). f (Fix f) -> Fix f
Fix forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} {k1} (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose forall b c a. (b -> c) -> (a -> b) -> a -> c
. (p
p forall a e. a -> e -> LocatedBy a e
:<))
data Atom
= AtomNumber {-# UNPACK #-} !Scientific
| AtomString {-# UNPACK #-} !Text
| AtomSymbol {-# UNPACK #-} !Text
deriving (Int -> Atom -> ShowS
[Atom] -> ShowS
Atom -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Atom] -> ShowS
$cshowList :: [Atom] -> ShowS
show :: Atom -> FilePath
$cshow :: Atom -> FilePath
showsPrec :: Int -> Atom -> ShowS
$cshowsPrec :: Int -> Atom -> ShowS
Show, Atom -> Atom -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Atom -> Atom -> Bool
$c/= :: Atom -> Atom -> Bool
== :: Atom -> Atom -> Bool
$c== :: Atom -> Atom -> Bool
Eq, Eq Atom
Atom -> Atom -> Bool
Atom -> Atom -> Ordering
Atom -> Atom -> Atom
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Atom -> Atom -> Atom
$cmin :: Atom -> Atom -> Atom
max :: Atom -> Atom -> Atom
$cmax :: Atom -> Atom -> Atom
>= :: Atom -> Atom -> Bool
$c>= :: Atom -> Atom -> Bool
> :: Atom -> Atom -> Bool
$c> :: Atom -> Atom -> Bool
<= :: Atom -> Atom -> Bool
$c<= :: Atom -> Atom -> Bool
< :: Atom -> Atom -> Bool
$c< :: Atom -> Atom -> Bool
compare :: Atom -> Atom -> Ordering
$ccompare :: Atom -> Atom -> Ordering
Ord, forall x. Rep Atom x -> Atom
forall x. Atom -> Rep Atom x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Atom x -> Atom
$cfrom :: forall x. Atom -> Rep Atom x
Generic)
data Prefix
= Quote
| Backtick
| Comma
| CommaAt
| Hash
deriving (Int -> Prefix -> ShowS
[Prefix] -> ShowS
Prefix -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Prefix] -> ShowS
$cshowList :: [Prefix] -> ShowS
show :: Prefix -> FilePath
$cshow :: Prefix -> FilePath
showsPrec :: Int -> Prefix -> ShowS
$cshowsPrec :: Int -> Prefix -> ShowS
Show, Prefix -> Prefix -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Prefix -> Prefix -> Bool
$c/= :: Prefix -> Prefix -> Bool
== :: Prefix -> Prefix -> Bool
$c== :: Prefix -> Prefix -> Bool
Eq, Eq Prefix
Prefix -> Prefix -> Bool
Prefix -> Prefix -> Ordering
Prefix -> Prefix -> Prefix
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Prefix -> Prefix -> Prefix
$cmin :: Prefix -> Prefix -> Prefix
max :: Prefix -> Prefix -> Prefix
$cmax :: Prefix -> Prefix -> Prefix
>= :: Prefix -> Prefix -> Bool
$c>= :: Prefix -> Prefix -> Bool
> :: Prefix -> Prefix -> Bool
$c> :: Prefix -> Prefix -> Bool
<= :: Prefix -> Prefix -> Bool
$c<= :: Prefix -> Prefix -> Bool
< :: Prefix -> Prefix -> Bool
$c< :: Prefix -> Prefix -> Bool
compare :: Prefix -> Prefix -> Ordering
$ccompare :: Prefix -> Prefix -> Ordering
Ord, forall x. Rep Prefix x -> Prefix
forall x. Prefix -> Rep Prefix x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Prefix x -> Prefix
$cfrom :: forall x. Prefix -> Rep Prefix x
Generic)
instance NFData Prefix
data SexpF e
= AtomF !Atom
| ParenListF [e]
| BracketListF [e]
| BraceListF [e]
| ModifiedF !Prefix e
deriving (forall a b. a -> SexpF b -> SexpF a
forall a b. (a -> b) -> SexpF a -> SexpF 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 -> SexpF b -> SexpF a
$c<$ :: forall a b. a -> SexpF b -> SexpF a
fmap :: forall a b. (a -> b) -> SexpF a -> SexpF b
$cfmap :: forall a b. (a -> b) -> SexpF a -> SexpF b
Functor, forall a. Eq a => a -> SexpF a -> Bool
forall a. Num a => SexpF a -> a
forall a. Ord a => SexpF a -> a
forall m. Monoid m => SexpF m -> m
forall a. SexpF a -> Bool
forall a. SexpF a -> Int
forall a. SexpF a -> [a]
forall a. (a -> a -> a) -> SexpF a -> a
forall m a. Monoid m => (a -> m) -> SexpF a -> m
forall b a. (b -> a -> b) -> b -> SexpF a -> b
forall a b. (a -> b -> b) -> b -> SexpF 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 => SexpF a -> a
$cproduct :: forall a. Num a => SexpF a -> a
sum :: forall a. Num a => SexpF a -> a
$csum :: forall a. Num a => SexpF a -> a
minimum :: forall a. Ord a => SexpF a -> a
$cminimum :: forall a. Ord a => SexpF a -> a
maximum :: forall a. Ord a => SexpF a -> a
$cmaximum :: forall a. Ord a => SexpF a -> a
elem :: forall a. Eq a => a -> SexpF a -> Bool
$celem :: forall a. Eq a => a -> SexpF a -> Bool
length :: forall a. SexpF a -> Int
$clength :: forall a. SexpF a -> Int
null :: forall a. SexpF a -> Bool
$cnull :: forall a. SexpF a -> Bool
toList :: forall a. SexpF a -> [a]
$ctoList :: forall a. SexpF a -> [a]
foldl1 :: forall a. (a -> a -> a) -> SexpF a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> SexpF a -> a
foldr1 :: forall a. (a -> a -> a) -> SexpF a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> SexpF a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> SexpF a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> SexpF a -> b
foldl :: forall b a. (b -> a -> b) -> b -> SexpF a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> SexpF a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> SexpF a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> SexpF a -> b
foldr :: forall a b. (a -> b -> b) -> b -> SexpF a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> SexpF a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> SexpF a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> SexpF a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> SexpF a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> SexpF a -> m
fold :: forall m. Monoid m => SexpF m -> m
$cfold :: forall m. Monoid m => SexpF m -> m
Foldable, Functor SexpF
Foldable SexpF
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 (m :: * -> *) a. Monad m => SexpF (m a) -> m (SexpF a)
forall (f :: * -> *) a. Applicative f => SexpF (f a) -> f (SexpF a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SexpF a -> m (SexpF b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SexpF a -> f (SexpF b)
sequence :: forall (m :: * -> *) a. Monad m => SexpF (m a) -> m (SexpF a)
$csequence :: forall (m :: * -> *) a. Monad m => SexpF (m a) -> m (SexpF a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SexpF a -> m (SexpF b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SexpF a -> m (SexpF b)
sequenceA :: forall (f :: * -> *) a. Applicative f => SexpF (f a) -> f (SexpF a)
$csequenceA :: forall (f :: * -> *) a. Applicative f => SexpF (f a) -> f (SexpF a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SexpF a -> f (SexpF b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SexpF a -> f (SexpF b)
Traversable, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall e x. Rep (SexpF e) x -> SexpF e
forall e x. SexpF e -> Rep (SexpF e) x
$cto :: forall e x. Rep (SexpF e) x -> SexpF e
$cfrom :: forall e x. SexpF e -> Rep (SexpF e) x
Generic)
instance Eq a => Eq (SexpF a) where
== :: SexpF a -> SexpF a -> Bool
(==) = forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq forall a. Eq a => a -> a -> Bool
(==)
instance Eq1 SexpF where
liftEq :: forall a b. (a -> b -> Bool) -> SexpF a -> SexpF b -> Bool
liftEq a -> b -> Bool
eq = SexpF a -> SexpF b -> Bool
go
where
go :: SexpF a -> SexpF b -> Bool
go (AtomF Atom
a) (AtomF Atom
b) = Atom
a forall a. Eq a => a -> a -> Bool
== Atom
b
go (ParenListF [a]
as) (ParenListF [b]
bs) = forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq a -> b -> Bool
eq [a]
as [b]
bs
go (BracketListF [a]
as) (BracketListF [b]
bs) = forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq a -> b -> Bool
eq [a]
as [b]
bs
go (BraceListF [a]
as) (BraceListF [b]
bs) = forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq a -> b -> Bool
eq [a]
as [b]
bs
go (ModifiedF Prefix
q a
a) (ModifiedF Prefix
p b
b) = Prefix
q forall a. Eq a => a -> a -> Bool
== Prefix
p Bool -> Bool -> Bool
&& a
a a -> b -> Bool
`eq` b
b
go SexpF a
_ SexpF b
_ = Bool
False
instance NFData Atom
instance NFData Position
instance NFData e => NFData (SexpF e)
instance NFData1 SexpF where
liftRnf :: forall a. (a -> ()) -> SexpF a -> ()
liftRnf a -> ()
f = \case
AtomF Atom
a -> forall a. NFData a => a -> ()
rnf Atom
a
ParenListF [a]
as -> forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
f [a]
as
BracketListF [a]
as -> forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
f [a]
as
BraceListF [a]
as -> forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> ()
liftRnf a -> ()
f [a]
as
ModifiedF Prefix
q a
a -> forall a. NFData a => a -> ()
rnf Prefix
q seq :: forall a b. a -> b -> b
`seq` a -> ()
f a
a