{-# language DeriveFoldable #-} {-# language DeriveFunctor #-} {-# language DeriveTraversable #-} {-# language OverloadedStrings #-} module Language.Elm.Pattern where import Data.Text (Text) import qualified Language.Elm.Name as Name data Pattern v = Var v | Wildcard | Con Name.Qualified [Pattern v] | List [Pattern v] | String !Text | Int !Integer | Float !Double deriving (Pattern v -> Pattern v -> Bool (Pattern v -> Pattern v -> Bool) -> (Pattern v -> Pattern v -> Bool) -> Eq (Pattern v) forall v. Eq v => Pattern v -> Pattern v -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Pattern v -> Pattern v -> Bool $c/= :: forall v. Eq v => Pattern v -> Pattern v -> Bool == :: Pattern v -> Pattern v -> Bool $c== :: forall v. Eq v => Pattern v -> Pattern v -> Bool Eq, Eq (Pattern v) Eq (Pattern v) -> (Pattern v -> Pattern v -> Ordering) -> (Pattern v -> Pattern v -> Bool) -> (Pattern v -> Pattern v -> Bool) -> (Pattern v -> Pattern v -> Bool) -> (Pattern v -> Pattern v -> Bool) -> (Pattern v -> Pattern v -> Pattern v) -> (Pattern v -> Pattern v -> Pattern v) -> Ord (Pattern v) Pattern v -> Pattern v -> Bool Pattern v -> Pattern v -> Ordering Pattern v -> Pattern v -> Pattern v 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 v. Ord v => Eq (Pattern v) forall v. Ord v => Pattern v -> Pattern v -> Bool forall v. Ord v => Pattern v -> Pattern v -> Ordering forall v. Ord v => Pattern v -> Pattern v -> Pattern v min :: Pattern v -> Pattern v -> Pattern v $cmin :: forall v. Ord v => Pattern v -> Pattern v -> Pattern v max :: Pattern v -> Pattern v -> Pattern v $cmax :: forall v. Ord v => Pattern v -> Pattern v -> Pattern v >= :: Pattern v -> Pattern v -> Bool $c>= :: forall v. Ord v => Pattern v -> Pattern v -> Bool > :: Pattern v -> Pattern v -> Bool $c> :: forall v. Ord v => Pattern v -> Pattern v -> Bool <= :: Pattern v -> Pattern v -> Bool $c<= :: forall v. Ord v => Pattern v -> Pattern v -> Bool < :: Pattern v -> Pattern v -> Bool $c< :: forall v. Ord v => Pattern v -> Pattern v -> Bool compare :: Pattern v -> Pattern v -> Ordering $ccompare :: forall v. Ord v => Pattern v -> Pattern v -> Ordering $cp1Ord :: forall v. Ord v => Eq (Pattern v) Ord, Int -> Pattern v -> ShowS [Pattern v] -> ShowS Pattern v -> String (Int -> Pattern v -> ShowS) -> (Pattern v -> String) -> ([Pattern v] -> ShowS) -> Show (Pattern v) forall v. Show v => Int -> Pattern v -> ShowS forall v. Show v => [Pattern v] -> ShowS forall v. Show v => Pattern v -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Pattern v] -> ShowS $cshowList :: forall v. Show v => [Pattern v] -> ShowS show :: Pattern v -> String $cshow :: forall v. Show v => Pattern v -> String showsPrec :: Int -> Pattern v -> ShowS $cshowsPrec :: forall v. Show v => Int -> Pattern v -> ShowS Show, a -> Pattern b -> Pattern a (a -> b) -> Pattern a -> Pattern b (forall a b. (a -> b) -> Pattern a -> Pattern b) -> (forall a b. a -> Pattern b -> Pattern a) -> Functor Pattern forall a b. a -> Pattern b -> Pattern a forall a b. (a -> b) -> Pattern a -> Pattern b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> Pattern b -> Pattern a $c<$ :: forall a b. a -> Pattern b -> Pattern a fmap :: (a -> b) -> Pattern a -> Pattern b $cfmap :: forall a b. (a -> b) -> Pattern a -> Pattern b Functor, Pattern a -> Bool (a -> m) -> Pattern a -> m (a -> b -> b) -> b -> Pattern a -> b (forall m. Monoid m => Pattern m -> m) -> (forall m a. Monoid m => (a -> m) -> Pattern a -> m) -> (forall m a. Monoid m => (a -> m) -> Pattern a -> m) -> (forall a b. (a -> b -> b) -> b -> Pattern a -> b) -> (forall a b. (a -> b -> b) -> b -> Pattern a -> b) -> (forall b a. (b -> a -> b) -> b -> Pattern a -> b) -> (forall b a. (b -> a -> b) -> b -> Pattern a -> b) -> (forall a. (a -> a -> a) -> Pattern a -> a) -> (forall a. (a -> a -> a) -> Pattern a -> a) -> (forall a. Pattern a -> [a]) -> (forall a. Pattern a -> Bool) -> (forall a. Pattern a -> Int) -> (forall a. Eq a => a -> Pattern a -> Bool) -> (forall a. Ord a => Pattern a -> a) -> (forall a. Ord a => Pattern a -> a) -> (forall a. Num a => Pattern a -> a) -> (forall a. Num a => Pattern a -> a) -> Foldable Pattern forall a. Eq a => a -> Pattern a -> Bool forall a. Num a => Pattern a -> a forall a. Ord a => Pattern a -> a forall m. Monoid m => Pattern m -> m forall a. Pattern a -> Bool forall a. Pattern a -> Int forall a. Pattern a -> [a] forall a. (a -> a -> a) -> Pattern a -> a forall m a. Monoid m => (a -> m) -> Pattern a -> m forall b a. (b -> a -> b) -> b -> Pattern a -> b forall a b. (a -> b -> b) -> b -> Pattern 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 :: Pattern a -> a $cproduct :: forall a. Num a => Pattern a -> a sum :: Pattern a -> a $csum :: forall a. Num a => Pattern a -> a minimum :: Pattern a -> a $cminimum :: forall a. Ord a => Pattern a -> a maximum :: Pattern a -> a $cmaximum :: forall a. Ord a => Pattern a -> a elem :: a -> Pattern a -> Bool $celem :: forall a. Eq a => a -> Pattern a -> Bool length :: Pattern a -> Int $clength :: forall a. Pattern a -> Int null :: Pattern a -> Bool $cnull :: forall a. Pattern a -> Bool toList :: Pattern a -> [a] $ctoList :: forall a. Pattern a -> [a] foldl1 :: (a -> a -> a) -> Pattern a -> a $cfoldl1 :: forall a. (a -> a -> a) -> Pattern a -> a foldr1 :: (a -> a -> a) -> Pattern a -> a $cfoldr1 :: forall a. (a -> a -> a) -> Pattern a -> a foldl' :: (b -> a -> b) -> b -> Pattern a -> b $cfoldl' :: forall b a. (b -> a -> b) -> b -> Pattern a -> b foldl :: (b -> a -> b) -> b -> Pattern a -> b $cfoldl :: forall b a. (b -> a -> b) -> b -> Pattern a -> b foldr' :: (a -> b -> b) -> b -> Pattern a -> b $cfoldr' :: forall a b. (a -> b -> b) -> b -> Pattern a -> b foldr :: (a -> b -> b) -> b -> Pattern a -> b $cfoldr :: forall a b. (a -> b -> b) -> b -> Pattern a -> b foldMap' :: (a -> m) -> Pattern a -> m $cfoldMap' :: forall m a. Monoid m => (a -> m) -> Pattern a -> m foldMap :: (a -> m) -> Pattern a -> m $cfoldMap :: forall m a. Monoid m => (a -> m) -> Pattern a -> m fold :: Pattern m -> m $cfold :: forall m. Monoid m => Pattern m -> m Foldable, Functor Pattern Foldable Pattern Functor Pattern -> Foldable Pattern -> (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Pattern a -> f (Pattern b)) -> (forall (f :: * -> *) a. Applicative f => Pattern (f a) -> f (Pattern a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> Pattern a -> m (Pattern b)) -> (forall (m :: * -> *) a. Monad m => Pattern (m a) -> m (Pattern a)) -> Traversable Pattern (a -> f b) -> Pattern a -> f (Pattern 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 (m :: * -> *) a. Monad m => Pattern (m a) -> m (Pattern a) forall (f :: * -> *) a. Applicative f => Pattern (f a) -> f (Pattern a) forall (m :: * -> *) a b. Monad m => (a -> m b) -> Pattern a -> m (Pattern b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Pattern a -> f (Pattern b) sequence :: Pattern (m a) -> m (Pattern a) $csequence :: forall (m :: * -> *) a. Monad m => Pattern (m a) -> m (Pattern a) mapM :: (a -> m b) -> Pattern a -> m (Pattern b) $cmapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> Pattern a -> m (Pattern b) sequenceA :: Pattern (f a) -> f (Pattern a) $csequenceA :: forall (f :: * -> *) a. Applicative f => Pattern (f a) -> f (Pattern a) traverse :: (a -> f b) -> Pattern a -> f (Pattern b) $ctraverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Pattern a -> f (Pattern b) $cp2Traversable :: Foldable Pattern $cp1Traversable :: Functor Pattern Traversable) foldMapGlobals :: Monoid m => (Name.Qualified -> m) -> Pattern v -> m foldMapGlobals :: (Qualified -> m) -> Pattern v -> m foldMapGlobals Qualified -> m f Pattern v pat = case Pattern v pat of Var v _ -> m forall a. Monoid a => a mempty Pattern v Wildcard -> m forall a. Monoid a => a mempty Con Qualified c [Pattern v] pats -> Qualified -> m f Qualified c m -> m -> m forall a. Semigroup a => a -> a -> a <> (Pattern v -> m) -> [Pattern v] -> m forall (t :: * -> *) m a. (Foldable t, Monoid m) => (a -> m) -> t a -> m foldMap ((Qualified -> m) -> Pattern v -> m forall m v. Monoid m => (Qualified -> m) -> Pattern v -> m foldMapGlobals Qualified -> m f) [Pattern v] pats List [Pattern v] pats -> (Pattern v -> m) -> [Pattern v] -> m forall (t :: * -> *) m a. (Foldable t, Monoid m) => (a -> m) -> t a -> m foldMap ((Qualified -> m) -> Pattern v -> m forall m v. Monoid m => (Qualified -> m) -> Pattern v -> m foldMapGlobals Qualified -> m f) [Pattern v] pats String Text _ -> m forall a. Monoid a => a mempty Int Integer _ -> m forall a. Monoid a => a mempty Float Double _ -> m forall a. Monoid a => a mempty tuple :: Pattern v -> Pattern v -> Pattern v tuple :: Pattern v -> Pattern v -> Pattern v tuple Pattern v p1 Pattern v p2 = Qualified -> [Pattern v] -> Pattern v forall v. Qualified -> [Pattern v] -> Pattern v Con Qualified "Basics.," [Pattern v p1, Pattern v p2]