{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
module TcGenFunctor (
FFoldType(..), functorLikeTraverse,
deepSubtypesContaining, foldDataConArgs,
gen_Functor_binds, gen_Foldable_binds, gen_Traversable_binds
) where
import GhcPrelude
import Bag
import DataCon
import FastString
import HsSyn
import Panic
import PrelNames
import RdrName
import SrcLoc
import State
import TcGenDeriv
import TcType
import TyCon
import TyCoRep
import Type
import Util
import Var
import VarSet
import MkId (coerceId)
import TysWiredIn (true_RDR, false_RDR)
import Data.Maybe (catMaybes, isJust)
gen_Functor_binds :: SrcSpan -> TyCon -> (LHsBinds GhcPs, BagDerivStuff)
gen_Functor_binds :: SrcSpan -> TyCon -> (LHsBinds GhcPs, BagDerivStuff)
gen_Functor_binds loc :: SrcSpan
loc tycon :: TyCon
tycon
| Role
Phantom <- [Role] -> Role
forall a. [a] -> a
last (TyCon -> [Role]
tyConRoles TyCon
tycon)
= (LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag LHsBind GhcPs
fmap_bind, BagDerivStuff
forall a. Bag a
emptyBag)
where
fmap_name :: GenLocated SrcSpan RdrName
fmap_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
fmap_RDR
fmap_bind :: LHsBind GhcPs
fmap_bind = GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind GenLocated SrcSpan RdrName
fmap_name [LMatch GhcPs (LHsExpr GhcPs)]
fmap_eqns
fmap_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
fmap_eqns = [HsMatchContext (NameOrRdrName (IdP GhcPs))
-> [LPat GhcPs] -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkSimpleMatch HsMatchContext RdrName
HsMatchContext (NameOrRdrName (IdP GhcPs))
fmap_match_ctxt
[LPat GhcPs
nlWildPat]
LHsExpr GhcPs
coerce_Expr]
fmap_match_ctxt :: HsMatchContext RdrName
fmap_match_ctxt = GenLocated SrcSpan RdrName -> HsMatchContext RdrName
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs GenLocated SrcSpan RdrName
fmap_name
gen_Functor_binds loc :: SrcSpan
loc tycon :: TyCon
tycon
= ([LHsBind GhcPs] -> LHsBinds GhcPs
forall a. [a] -> Bag a
listToBag [LHsBind GhcPs
fmap_bind, LHsBind GhcPs
replace_bind], BagDerivStuff
forall a. Bag a
emptyBag)
where
data_cons :: [DataCon]
data_cons = TyCon -> [DataCon]
tyConDataCons TyCon
tycon
fmap_name :: GenLocated SrcSpan RdrName
fmap_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
fmap_RDR
fmap_bind :: LHsBind GhcPs
fmap_bind = Arity
-> (LHsExpr GhcPs -> LHsExpr GhcPs)
-> GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)]
-> LHsBind GhcPs
mkRdrFunBindEC 2 LHsExpr GhcPs -> LHsExpr GhcPs
forall a. a -> a
id GenLocated SrcSpan RdrName
fmap_name [LMatch GhcPs (LHsExpr GhcPs)]
fmap_eqns
fmap_match_ctxt :: HsMatchContext RdrName
fmap_match_ctxt = GenLocated SrcSpan RdrName -> HsMatchContext RdrName
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs GenLocated SrcSpan RdrName
fmap_name
fmap_eqn :: DataCon -> LMatch GhcPs (LHsExpr GhcPs)
fmap_eqn con :: DataCon
con = (State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs)
forall a b c. (a -> b -> c) -> b -> a -> c
flip State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs)
forall s a. State s a -> s -> a
evalState [RdrName]
bs_RDRs (State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs))
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$
HsMatchContext RdrName
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con HsMatchContext RdrName
fmap_match_ctxt [LPat GhcPs
f_Pat] DataCon
con ([LHsExpr GhcPs] -> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> State [RdrName] [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< State [RdrName] [LHsExpr GhcPs]
parts
where
parts :: State [RdrName] [LHsExpr GhcPs]
parts = [State [RdrName] (LHsExpr GhcPs)]
-> State [RdrName] [LHsExpr GhcPs]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([State [RdrName] (LHsExpr GhcPs)]
-> State [RdrName] [LHsExpr GhcPs])
-> [State [RdrName] (LHsExpr GhcPs)]
-> State [RdrName] [LHsExpr GhcPs]
forall a b. (a -> b) -> a -> b
$ FFoldType (State [RdrName] (LHsExpr GhcPs))
-> DataCon -> [State [RdrName] (LHsExpr GhcPs)]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs FFoldType (State [RdrName] (LHsExpr GhcPs))
ft_fmap DataCon
con
fmap_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
fmap_eqns = (DataCon -> LMatch GhcPs (LHsExpr GhcPs))
-> [DataCon] -> [LMatch GhcPs (LHsExpr GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> LMatch GhcPs (LHsExpr GhcPs)
fmap_eqn [DataCon]
data_cons
ft_fmap :: FFoldType (State [RdrName] (LHsExpr GhcPs))
ft_fmap :: FFoldType (State [RdrName] (LHsExpr GhcPs))
ft_fmap = FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: State [RdrName] (LHsExpr GhcPs)
ft_triv = (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \x :: LHsExpr GhcPs
x -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return LHsExpr GhcPs
x
, ft_var :: State [RdrName] (LHsExpr GhcPs)
ft_var = LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return LHsExpr GhcPs
f_Expr
, ft_fun :: State [RdrName] (LHsExpr GhcPs)
-> State [RdrName] (LHsExpr GhcPs)
-> State [RdrName] (LHsExpr GhcPs)
ft_fun = \g :: State [RdrName] (LHsExpr GhcPs)
g h :: State [RdrName] (LHsExpr GhcPs)
h -> do
LHsExpr GhcPs
gg <- State [RdrName] (LHsExpr GhcPs)
g
LHsExpr GhcPs
hh <- State [RdrName] (LHsExpr GhcPs)
h
(LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam2 ((LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \x :: LHsExpr GhcPs
x b :: LHsExpr GhcPs
b -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$
LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
hh (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
x (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
gg LHsExpr GhcPs
b))
, ft_tup :: TyCon
-> [State [RdrName] (LHsExpr GhcPs)]
-> State [RdrName] (LHsExpr GhcPs)
ft_tup = \t :: TyCon
t gs :: [State [RdrName] (LHsExpr GhcPs)]
gs -> do
[LHsExpr GhcPs]
gg <- [State [RdrName] (LHsExpr GhcPs)]
-> State [RdrName] [LHsExpr GhcPs]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [State [RdrName] (LHsExpr GhcPs)]
gs
(LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ ([LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon
-> [LHsExpr GhcPs]
-> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a.
Monad m =>
([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase (HsMatchContext RdrName
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con HsMatchContext RdrName
forall id. HsMatchContext id
CaseAlt) TyCon
t [LHsExpr GhcPs]
gg
, ft_ty_app :: Type
-> State [RdrName] (LHsExpr GhcPs)
-> State [RdrName] (LHsExpr GhcPs)
ft_ty_app = \_ g :: State [RdrName] (LHsExpr GhcPs)
g -> LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
fmap_Expr (LHsExpr GhcPs -> LHsExpr GhcPs)
-> State [RdrName] (LHsExpr GhcPs)
-> State [RdrName] (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> State [RdrName] (LHsExpr GhcPs)
g
, ft_forall :: TcTyVar
-> State [RdrName] (LHsExpr GhcPs)
-> State [RdrName] (LHsExpr GhcPs)
ft_forall = \_ g :: State [RdrName] (LHsExpr GhcPs)
g -> State [RdrName] (LHsExpr GhcPs)
g
, ft_bad_app :: State [RdrName] (LHsExpr GhcPs)
ft_bad_app = String -> State [RdrName] (LHsExpr GhcPs)
forall a. String -> a
panic "in other argument in ft_fmap"
, ft_co_var :: State [RdrName] (LHsExpr GhcPs)
ft_co_var = String -> State [RdrName] (LHsExpr GhcPs)
forall a. String -> a
panic "contravariant in ft_fmap" }
replace_name :: GenLocated SrcSpan RdrName
replace_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
replace_RDR
replace_bind :: LHsBind GhcPs
replace_bind = Arity
-> (LHsExpr GhcPs -> LHsExpr GhcPs)
-> GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)]
-> LHsBind GhcPs
mkRdrFunBindEC 2 LHsExpr GhcPs -> LHsExpr GhcPs
forall a. a -> a
id GenLocated SrcSpan RdrName
replace_name [LMatch GhcPs (LHsExpr GhcPs)]
replace_eqns
replace_match_ctxt :: HsMatchContext RdrName
replace_match_ctxt = GenLocated SrcSpan RdrName -> HsMatchContext RdrName
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs GenLocated SrcSpan RdrName
replace_name
replace_eqn :: DataCon -> LMatch GhcPs (LHsExpr GhcPs)
replace_eqn con :: DataCon
con = (State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs)
forall a b c. (a -> b -> c) -> b -> a -> c
flip State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs)
forall s a. State s a -> s -> a
evalState [RdrName]
bs_RDRs (State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs))
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$
HsMatchContext RdrName
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con HsMatchContext RdrName
replace_match_ctxt [LPat GhcPs
z_Pat] DataCon
con ([LHsExpr GhcPs] -> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> State [RdrName] [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< State [RdrName] [LHsExpr GhcPs]
parts
where
parts :: State [RdrName] [LHsExpr GhcPs]
parts = (State [RdrName] Replacer -> State [RdrName] (LHsExpr GhcPs))
-> [State [RdrName] Replacer] -> State [RdrName] [LHsExpr GhcPs]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Replacer -> LHsExpr GhcPs)
-> State [RdrName] Replacer -> State [RdrName] (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Replacer -> LHsExpr GhcPs
replace) ([State [RdrName] Replacer] -> State [RdrName] [LHsExpr GhcPs])
-> [State [RdrName] Replacer] -> State [RdrName] [LHsExpr GhcPs]
forall a b. (a -> b) -> a -> b
$ FFoldType (State [RdrName] Replacer)
-> DataCon -> [State [RdrName] Replacer]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs FFoldType (State [RdrName] Replacer)
ft_replace DataCon
con
replace_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
replace_eqns = (DataCon -> LMatch GhcPs (LHsExpr GhcPs))
-> [DataCon] -> [LMatch GhcPs (LHsExpr GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> LMatch GhcPs (LHsExpr GhcPs)
replace_eqn [DataCon]
data_cons
ft_replace :: FFoldType (State [RdrName] Replacer)
ft_replace :: FFoldType (State [RdrName] Replacer)
ft_replace = FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: State [RdrName] Replacer
ft_triv = (LHsExpr GhcPs -> Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LHsExpr GhcPs -> Replacer
Nested (State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall a b. (a -> b) -> a -> b
$ (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \x :: LHsExpr GhcPs
x -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return LHsExpr GhcPs
x
, ft_var :: State [RdrName] Replacer
ft_var = (LHsExpr GhcPs -> Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LHsExpr GhcPs -> Replacer
Immediate (State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall a b. (a -> b) -> a -> b
$ (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \_ -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return LHsExpr GhcPs
z_Expr
, ft_fun :: State [RdrName] Replacer
-> State [RdrName] Replacer -> State [RdrName] Replacer
ft_fun = \g :: State [RdrName] Replacer
g h :: State [RdrName] Replacer
h -> do
LHsExpr GhcPs
gg <- Replacer -> LHsExpr GhcPs
replace (Replacer -> LHsExpr GhcPs)
-> State [RdrName] Replacer -> State [RdrName] (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> State [RdrName] Replacer
g
LHsExpr GhcPs
hh <- Replacer -> LHsExpr GhcPs
replace (Replacer -> LHsExpr GhcPs)
-> State [RdrName] Replacer -> State [RdrName] (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> State [RdrName] Replacer
h
(LHsExpr GhcPs -> Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LHsExpr GhcPs -> Replacer
Nested (State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall a b. (a -> b) -> a -> b
$ (LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam2 ((LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \x :: LHsExpr GhcPs
x b :: LHsExpr GhcPs
b -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$
LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
hh (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
x (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
gg LHsExpr GhcPs
b))
, ft_tup :: TyCon -> [State [RdrName] Replacer] -> State [RdrName] Replacer
ft_tup = \t :: TyCon
t gs :: [State [RdrName] Replacer]
gs -> do
[LHsExpr GhcPs]
gg <- (State [RdrName] Replacer -> State [RdrName] (LHsExpr GhcPs))
-> [State [RdrName] Replacer] -> State [RdrName] [LHsExpr GhcPs]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Replacer -> LHsExpr GhcPs)
-> State [RdrName] Replacer -> State [RdrName] (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Replacer -> LHsExpr GhcPs
replace) [State [RdrName] Replacer]
gs
(LHsExpr GhcPs -> Replacer)
-> State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LHsExpr GhcPs -> Replacer
Nested (State [RdrName] (LHsExpr GhcPs) -> State [RdrName] Replacer)
-> ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] Replacer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] Replacer)
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] Replacer
forall a b. (a -> b) -> a -> b
$
([LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon
-> [LHsExpr GhcPs]
-> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a.
Monad m =>
([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase (HsMatchContext RdrName
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con HsMatchContext RdrName
forall id. HsMatchContext id
CaseAlt) TyCon
t [LHsExpr GhcPs]
gg
, ft_ty_app :: Type -> State [RdrName] Replacer -> State [RdrName] Replacer
ft_ty_app = \_ gm :: State [RdrName] Replacer
gm -> do
Replacer
g <- State [RdrName] Replacer
gm
case Replacer
g of
Nested g' :: LHsExpr GhcPs
g' -> Replacer -> State [RdrName] Replacer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Replacer -> State [RdrName] Replacer)
-> (LHsExpr GhcPs -> Replacer)
-> LHsExpr GhcPs
-> State [RdrName] Replacer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsExpr GhcPs -> Replacer
Nested (LHsExpr GhcPs -> State [RdrName] Replacer)
-> LHsExpr GhcPs -> State [RdrName] Replacer
forall a b. (a -> b) -> a -> b
$
LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
fmap_Expr (LHsExpr GhcPs -> LHsExpr GhcPs) -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs
g'
Immediate _ -> Replacer -> State [RdrName] Replacer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Replacer -> State [RdrName] Replacer)
-> (LHsExpr GhcPs -> Replacer)
-> LHsExpr GhcPs
-> State [RdrName] Replacer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsExpr GhcPs -> Replacer
Nested (LHsExpr GhcPs -> State [RdrName] Replacer)
-> LHsExpr GhcPs -> State [RdrName] Replacer
forall a b. (a -> b) -> a -> b
$
LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
replace_Expr LHsExpr GhcPs
z_Expr
, ft_forall :: TcTyVar -> State [RdrName] Replacer -> State [RdrName] Replacer
ft_forall = \_ g :: State [RdrName] Replacer
g -> State [RdrName] Replacer
g
, ft_bad_app :: State [RdrName] Replacer
ft_bad_app = String -> State [RdrName] Replacer
forall a. String -> a
panic "in other argument in ft_replace"
, ft_co_var :: State [RdrName] Replacer
ft_co_var = String -> State [RdrName] Replacer
forall a. String -> a
panic "contravariant in ft_replace" }
match_for_con :: HsMatchContext RdrName
-> [LPat GhcPs] -> DataCon -> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con :: HsMatchContext RdrName
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con ctxt :: HsMatchContext RdrName
ctxt = HsMatchContext RdrName
-> (RdrName -> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *).
Monad m =>
HsMatchContext RdrName
-> (RdrName -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch HsMatchContext RdrName
ctxt ((RdrName -> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> (RdrName -> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$
\con_name :: RdrName
con_name xs :: [LHsExpr GhcPs]
xs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
con_name [LHsExpr GhcPs]
xs
data Replacer = Immediate {Replacer -> LHsExpr GhcPs
replace :: LHsExpr GhcPs}
| Nested {replace :: LHsExpr GhcPs}
data FFoldType a
= FT { FFoldType a -> a
ft_triv :: a
, FFoldType a -> a
ft_var :: a
, FFoldType a -> a
ft_co_var :: a
, FFoldType a -> a -> a -> a
ft_fun :: a -> a -> a
, FFoldType a -> TyCon -> [a] -> a
ft_tup :: TyCon -> [a] -> a
, FFoldType a -> Type -> a -> a
ft_ty_app :: Type -> a -> a
, FFoldType a -> a
ft_bad_app :: a
, FFoldType a -> TcTyVar -> a -> a
ft_forall :: TcTyVar -> a -> a
}
functorLikeTraverse :: forall a.
TyVar
-> FFoldType a
-> Type
-> a
functorLikeTraverse :: TcTyVar -> FFoldType a -> Type -> a
functorLikeTraverse var :: TcTyVar
var (FT { ft_triv :: forall a. FFoldType a -> a
ft_triv = a
caseTrivial, ft_var :: forall a. FFoldType a -> a
ft_var = a
caseVar
, ft_co_var :: forall a. FFoldType a -> a
ft_co_var = a
caseCoVar, ft_fun :: forall a. FFoldType a -> a -> a -> a
ft_fun = a -> a -> a
caseFun
, ft_tup :: forall a. FFoldType a -> TyCon -> [a] -> a
ft_tup = TyCon -> [a] -> a
caseTuple, ft_ty_app :: forall a. FFoldType a -> Type -> a -> a
ft_ty_app = Type -> a -> a
caseTyApp
, ft_bad_app :: forall a. FFoldType a -> a
ft_bad_app = a
caseWrongArg, ft_forall :: forall a. FFoldType a -> TcTyVar -> a -> a
ft_forall = TcTyVar -> a -> a
caseForAll })
ty :: Type
ty
= (a, Bool) -> a
forall a b. (a, b) -> a
fst (Bool -> Type -> (a, Bool)
go Bool
False Type
ty)
where
go :: Bool
-> Type
-> (a, Bool)
go :: Bool -> Type -> (a, Bool)
go co :: Bool
co ty :: Type
ty | Just ty' :: Type
ty' <- Type -> Maybe Type
tcView Type
ty = Bool -> Type -> (a, Bool)
go Bool
co Type
ty'
go co :: Bool
co (TyVarTy v :: TcTyVar
v) | TcTyVar
v TcTyVar -> TcTyVar -> Bool
forall a. Eq a => a -> a -> Bool
== TcTyVar
var = (if Bool
co then a
caseCoVar else a
caseVar,Bool
True)
go co :: Bool
co (FunTy x :: Type
x y :: Type
y) | Type -> Bool
isPredTy Type
x = Bool -> Type -> (a, Bool)
go Bool
co Type
y
| Bool
xc Bool -> Bool -> Bool
|| Bool
yc = (a -> a -> a
caseFun a
xr a
yr,Bool
True)
where (xr :: a
xr,xc :: Bool
xc) = Bool -> Type -> (a, Bool)
go (Bool -> Bool
not Bool
co) Type
x
(yr :: a
yr,yc :: Bool
yc) = Bool -> Type -> (a, Bool)
go Bool
co Type
y
go co :: Bool
co (AppTy x :: Type
x y :: Type
y) | Bool
xc = (a
caseWrongArg, Bool
True)
| Bool
yc = (Type -> a -> a
caseTyApp Type
x a
yr, Bool
True)
where (_, xc :: Bool
xc) = Bool -> Type -> (a, Bool)
go Bool
co Type
x
(yr :: a
yr,yc :: Bool
yc) = Bool -> Type -> (a, Bool)
go Bool
co Type
y
go co :: Bool
co ty :: Type
ty@(TyConApp con :: TyCon
con args :: [Type]
args)
| Bool -> Bool
not ([Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
xcs) = (a
caseTrivial, Bool
False)
| TyCon -> Bool
isTupleTyCon TyCon
con = (TyCon -> [a] -> a
caseTuple TyCon
con [a]
xrs, Bool
True)
| [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or ([Bool] -> [Bool]
forall a. [a] -> [a]
init [Bool]
xcs) = (a
caseWrongArg, Bool
True)
| Just (fun_ty :: Type
fun_ty, _) <- Type -> Maybe (Type, Type)
splitAppTy_maybe Type
ty
= (Type -> a -> a
caseTyApp Type
fun_ty ([a] -> a
forall a. [a] -> a
last [a]
xrs), Bool
True)
| Bool
otherwise = (a
caseWrongArg, Bool
True)
where
(xrs :: [a]
xrs,xcs :: [Bool]
xcs) = [(a, Bool)] -> ([a], [Bool])
forall a b. [(a, b)] -> ([a], [b])
unzip ((Type -> (a, Bool)) -> [Type] -> [(a, Bool)]
forall a b. (a -> b) -> [a] -> [b]
map (Bool -> Type -> (a, Bool)
go Bool
co) ([Type] -> [Type]
dropRuntimeRepArgs [Type]
args))
go co :: Bool
co (ForAllTy (Bndr v :: TcTyVar
v vis :: ArgFlag
vis) x :: Type
x)
| ArgFlag -> Bool
isVisibleArgFlag ArgFlag
vis = String -> (a, Bool)
forall a. String -> a
panic "unexpected visible binder"
| TcTyVar
v TcTyVar -> TcTyVar -> Bool
forall a. Eq a => a -> a -> Bool
/= TcTyVar
var Bool -> Bool -> Bool
&& Bool
xc = (TcTyVar -> a -> a
caseForAll TcTyVar
v a
xr,Bool
True)
where (xr :: a
xr,xc :: Bool
xc) = Bool -> Type -> (a, Bool)
go Bool
co Type
x
go _ _ = (a
caseTrivial,Bool
False)
deepSubtypesContaining :: TyVar -> Type -> [TcType]
deepSubtypesContaining :: TcTyVar -> Type -> [Type]
deepSubtypesContaining tv :: TcTyVar
tv
= TcTyVar -> FFoldType [Type] -> Type -> [Type]
forall a. TcTyVar -> FFoldType a -> Type -> a
functorLikeTraverse TcTyVar
tv
(FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: [Type]
ft_triv = []
, ft_var :: [Type]
ft_var = []
, ft_fun :: [Type] -> [Type] -> [Type]
ft_fun = [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
(++)
, ft_tup :: TyCon -> [[Type]] -> [Type]
ft_tup = \_ xs :: [[Type]]
xs -> [[Type]] -> [Type]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Type]]
xs
, ft_ty_app :: Type -> [Type] -> [Type]
ft_ty_app = (:)
, ft_bad_app :: [Type]
ft_bad_app = String -> [Type]
forall a. String -> a
panic "in other argument in deepSubtypesContaining"
, ft_co_var :: [Type]
ft_co_var = String -> [Type]
forall a. String -> a
panic "contravariant in deepSubtypesContaining"
, ft_forall :: TcTyVar -> [Type] -> [Type]
ft_forall = \v :: TcTyVar
v xs :: [Type]
xs -> (Type -> Bool) -> [Type] -> [Type]
forall a. (a -> Bool) -> [a] -> [a]
filterOut ((TcTyVar
v TcTyVar -> VarSet -> Bool
`elemVarSet`) (VarSet -> Bool) -> (Type -> VarSet) -> Type -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> VarSet
tyCoVarsOfType) [Type]
xs })
foldDataConArgs :: FFoldType a -> DataCon -> [a]
foldDataConArgs :: FFoldType a -> DataCon -> [a]
foldDataConArgs ft :: FFoldType a
ft con :: DataCon
con
= (Type -> a) -> [Type] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map Type -> a
foldArg (DataCon -> [Type]
dataConOrigArgTys DataCon
con)
where
foldArg :: Type -> a
foldArg
= case Type -> Maybe TcTyVar
getTyVar_maybe ([Type] -> Type
forall a. [a] -> a
last (Type -> [Type]
tyConAppArgs (DataCon -> Type
dataConOrigResTy DataCon
con))) of
Just tv :: TcTyVar
tv -> TcTyVar -> FFoldType a -> Type -> a
forall a. TcTyVar -> FFoldType a -> Type -> a
functorLikeTraverse TcTyVar
tv FFoldType a
ft
Nothing -> a -> Type -> a
forall a b. a -> b -> a
const (FFoldType a -> a
forall a. FFoldType a -> a
ft_triv FFoldType a
ft)
mkSimpleLam :: (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam :: (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam lam :: LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
lam =
State [RdrName] [RdrName]
forall s. State s s
get State [RdrName] [RdrName]
-> ([RdrName] -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
n :: RdrName
n:names :: [RdrName]
names -> do
[RdrName] -> State [RdrName] ()
forall s. s -> State s ()
put [RdrName]
names
LHsExpr GhcPs
body <- LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
lam (IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
n)
LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LPat GhcPs] -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (p :: Pass).
(XMG (GhcPass p) (LHsExpr (GhcPass p)) ~ NoExt) =>
[LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
mkHsLam [IdP GhcPs -> LPat GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
nlVarPat RdrName
IdP GhcPs
n] LHsExpr GhcPs
body)
_ -> String -> State [RdrName] (LHsExpr GhcPs)
forall a. String -> a
panic "mkSimpleLam"
mkSimpleLam2 :: (LHsExpr GhcPs -> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam2 :: (LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam2 lam :: LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
lam =
State [RdrName] [RdrName]
forall s. State s s
get State [RdrName] [RdrName]
-> ([RdrName] -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
n1 :: RdrName
n1:n2 :: RdrName
n2:names :: [RdrName]
names -> do
[RdrName] -> State [RdrName] ()
forall s. s -> State s ()
put [RdrName]
names
LHsExpr GhcPs
body <- LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
lam (IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
n1) (IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
n2)
LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LPat GhcPs] -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (p :: Pass).
(XMG (GhcPass p) (LHsExpr (GhcPass p)) ~ NoExt) =>
[LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
mkHsLam [IdP GhcPs -> LPat GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
nlVarPat RdrName
IdP GhcPs
n1,IdP GhcPs -> LPat GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
nlVarPat RdrName
IdP GhcPs
n2] LHsExpr GhcPs
body)
_ -> String -> State [RdrName] (LHsExpr GhcPs)
forall a. String -> a
panic "mkSimpleLam2"
mkSimpleConMatch :: Monad m => HsMatchContext RdrName
-> (RdrName -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch :: HsMatchContext RdrName
-> (RdrName -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [LHsExpr GhcPs]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch ctxt :: HsMatchContext RdrName
ctxt fold :: RdrName -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs)
fold extra_pats :: [LPat GhcPs]
extra_pats con :: DataCon
con insides :: [LHsExpr GhcPs]
insides = do
let con_name :: RdrName
con_name = DataCon -> RdrName
forall thing. NamedThing thing => thing -> RdrName
getRdrName DataCon
con
let vars_needed :: [RdrName]
vars_needed = [LHsExpr GhcPs] -> [RdrName] -> [RdrName]
forall b a. [b] -> [a] -> [a]
takeList [LHsExpr GhcPs]
insides [RdrName]
as_RDRs
let bare_pat :: LPat GhcPs
bare_pat = RdrName -> [RdrName] -> LPat GhcPs
nlConVarPat RdrName
con_name [RdrName]
vars_needed
let pat :: LPat GhcPs
pat = if [RdrName] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [RdrName]
vars_needed
then LPat GhcPs
bare_pat
else LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat LPat GhcPs
bare_pat
LHsExpr GhcPs
rhs <- RdrName -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs)
fold RdrName
con_name
((LHsExpr GhcPs -> RdrName -> LHsExpr GhcPs)
-> [LHsExpr GhcPs] -> [RdrName] -> [LHsExpr GhcPs]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\i :: LHsExpr GhcPs
i v :: RdrName
v -> LHsExpr GhcPs
i LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
v) [LHsExpr GhcPs]
insides [RdrName]
vars_needed)
LMatch GhcPs (LHsExpr GhcPs) -> m (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LMatch GhcPs (LHsExpr GhcPs) -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> LMatch GhcPs (LHsExpr GhcPs) -> m (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ HsMatchContext (NameOrRdrName (IdP GhcPs))
-> [LPat GhcPs]
-> LHsExpr GhcPs
-> Located (HsLocalBinds GhcPs)
-> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> LHsExpr (GhcPass p)
-> Located (HsLocalBinds (GhcPass p))
-> LMatch (GhcPass p) (LHsExpr (GhcPass p))
mkMatch HsMatchContext RdrName
HsMatchContext (NameOrRdrName (IdP GhcPs))
ctxt ([LPat GhcPs]
extra_pats [LPat GhcPs] -> [LPat GhcPs] -> [LPat GhcPs]
forall a. [a] -> [a] -> [a]
++ [LPat GhcPs
pat]) LHsExpr GhcPs
rhs
(SrcSpanLess (Located (HsLocalBinds GhcPs))
-> Located (HsLocalBinds GhcPs)
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (Located (HsLocalBinds GhcPs))
forall (a :: Pass) (b :: Pass).
HsLocalBindsLR (GhcPass a) (GhcPass b)
emptyLocalBinds)
mkSimpleConMatch2 :: Monad m
=> HsMatchContext RdrName
-> (LHsExpr GhcPs -> [LHsExpr GhcPs]
-> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch2 :: HsMatchContext RdrName
-> (LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch2 ctxt :: HsMatchContext RdrName
ctxt fold :: LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs)
fold extra_pats :: [LPat GhcPs]
extra_pats con :: DataCon
con insides :: [Maybe (LHsExpr GhcPs)]
insides = do
let con_name :: RdrName
con_name = DataCon -> RdrName
forall thing. NamedThing thing => thing -> RdrName
getRdrName DataCon
con
vars_needed :: [RdrName]
vars_needed = [Maybe (LHsExpr GhcPs)] -> [RdrName] -> [RdrName]
forall b a. [b] -> [a] -> [a]
takeList [Maybe (LHsExpr GhcPs)]
insides [RdrName]
as_RDRs
pat :: LPat GhcPs
pat = RdrName -> [RdrName] -> LPat GhcPs
nlConVarPat RdrName
con_name [RdrName]
vars_needed
exps :: [LHsExpr GhcPs]
exps = [Maybe (LHsExpr GhcPs)] -> [LHsExpr GhcPs]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe (LHsExpr GhcPs)] -> [LHsExpr GhcPs])
-> [Maybe (LHsExpr GhcPs)] -> [LHsExpr GhcPs]
forall a b. (a -> b) -> a -> b
$ (Maybe (LHsExpr GhcPs) -> RdrName -> Maybe (LHsExpr GhcPs))
-> [Maybe (LHsExpr GhcPs)] -> [RdrName] -> [Maybe (LHsExpr GhcPs)]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\i :: Maybe (LHsExpr GhcPs)
i v :: RdrName
v -> (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
`nlHsApp` IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
v) (LHsExpr GhcPs -> LHsExpr GhcPs)
-> Maybe (LHsExpr GhcPs) -> Maybe (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (LHsExpr GhcPs)
i)
[Maybe (LHsExpr GhcPs)]
insides [RdrName]
vars_needed
argTysTyVarInfo :: [Bool]
argTysTyVarInfo = (Maybe (LHsExpr GhcPs) -> Bool)
-> [Maybe (LHsExpr GhcPs)] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map Maybe (LHsExpr GhcPs) -> Bool
forall a. Maybe a -> Bool
isJust [Maybe (LHsExpr GhcPs)]
insides
(asWithTyVar :: [LHsExpr GhcPs]
asWithTyVar, asWithoutTyVar :: [LHsExpr GhcPs]
asWithoutTyVar) = [Bool] -> [LHsExpr GhcPs] -> ([LHsExpr GhcPs], [LHsExpr GhcPs])
forall a. [Bool] -> [a] -> ([a], [a])
partitionByList [Bool]
argTysTyVarInfo [LHsExpr GhcPs]
as_Vars
con_expr :: LHsExpr GhcPs
con_expr
| [LHsExpr GhcPs] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LHsExpr GhcPs]
asWithTyVar = IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
con_name [LHsExpr GhcPs]
asWithoutTyVar
| Bool
otherwise =
let bs :: [RdrName]
bs = [Bool] -> [RdrName] -> [RdrName]
forall a. [Bool] -> [a] -> [a]
filterByList [Bool]
argTysTyVarInfo [RdrName]
bs_RDRs
vars :: [LHsExpr GhcPs]
vars = [Bool] -> [LHsExpr GhcPs] -> [LHsExpr GhcPs] -> [LHsExpr GhcPs]
forall a. [Bool] -> [a] -> [a] -> [a]
filterByLists [Bool]
argTysTyVarInfo [LHsExpr GhcPs]
bs_Vars [LHsExpr GhcPs]
as_Vars
in [LPat GhcPs] -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (p :: Pass).
(XMG (GhcPass p) (LHsExpr (GhcPass p)) ~ NoExt) =>
[LPat (GhcPass p)] -> LHsExpr (GhcPass p) -> LHsExpr (GhcPass p)
mkHsLam ((RdrName -> LPat GhcPs) -> [RdrName] -> [LPat GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map RdrName -> LPat GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
nlVarPat [RdrName]
bs) (IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
con_name [LHsExpr GhcPs]
vars)
LHsExpr GhcPs
rhs <- LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs)
fold LHsExpr GhcPs
con_expr [LHsExpr GhcPs]
exps
LMatch GhcPs (LHsExpr GhcPs) -> m (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LMatch GhcPs (LHsExpr GhcPs) -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> LMatch GhcPs (LHsExpr GhcPs) -> m (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ HsMatchContext (NameOrRdrName (IdP GhcPs))
-> [LPat GhcPs]
-> LHsExpr GhcPs
-> Located (HsLocalBinds GhcPs)
-> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> LHsExpr (GhcPass p)
-> Located (HsLocalBinds (GhcPass p))
-> LMatch (GhcPass p) (LHsExpr (GhcPass p))
mkMatch HsMatchContext RdrName
HsMatchContext (NameOrRdrName (IdP GhcPs))
ctxt ([LPat GhcPs]
extra_pats [LPat GhcPs] -> [LPat GhcPs] -> [LPat GhcPs]
forall a. [a] -> [a] -> [a]
++ [LPat GhcPs
pat]) LHsExpr GhcPs
rhs
(SrcSpanLess (Located (HsLocalBinds GhcPs))
-> Located (HsLocalBinds GhcPs)
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (Located (HsLocalBinds GhcPs))
forall (a :: Pass) (b :: Pass).
HsLocalBindsLR (GhcPass a) (GhcPass b)
emptyLocalBinds)
mkSimpleTupleCase :: Monad m => ([LPat GhcPs] -> DataCon -> [a]
-> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase :: ([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase match_for_con :: [LPat GhcPs] -> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs))
match_for_con tc :: TyCon
tc insides :: [a]
insides x :: LHsExpr GhcPs
x
= do { let data_con :: DataCon
data_con = TyCon -> DataCon
tyConSingleDataCon TyCon
tc
; LMatch GhcPs (LHsExpr GhcPs)
match <- [LPat GhcPs] -> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs))
match_for_con [] DataCon
data_con [a]
insides
; LHsExpr GhcPs -> m (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> m (LHsExpr GhcPs))
-> LHsExpr GhcPs -> m (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsExpr GhcPs
nlHsCase LHsExpr GhcPs
x [LMatch GhcPs (LHsExpr GhcPs)
match] }
gen_Foldable_binds :: SrcSpan -> TyCon -> (LHsBinds GhcPs, BagDerivStuff)
gen_Foldable_binds :: SrcSpan -> TyCon -> (LHsBinds GhcPs, BagDerivStuff)
gen_Foldable_binds loc :: SrcSpan
loc tycon :: TyCon
tycon
| Role
Phantom <- [Role] -> Role
forall a. [a] -> a
last (TyCon -> [Role]
tyConRoles TyCon
tycon)
= (LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag LHsBind GhcPs
foldMap_bind, BagDerivStuff
forall a. Bag a
emptyBag)
where
foldMap_name :: GenLocated SrcSpan RdrName
foldMap_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
foldMap_RDR
foldMap_bind :: LHsBind GhcPs
foldMap_bind = GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind GenLocated SrcSpan RdrName
foldMap_name [LMatch GhcPs (LHsExpr GhcPs)]
foldMap_eqns
foldMap_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
foldMap_eqns = [HsMatchContext (NameOrRdrName (IdP GhcPs))
-> [LPat GhcPs] -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkSimpleMatch HsMatchContext RdrName
HsMatchContext (NameOrRdrName (IdP GhcPs))
foldMap_match_ctxt
[LPat GhcPs
nlWildPat, LPat GhcPs
nlWildPat]
LHsExpr GhcPs
mempty_Expr]
foldMap_match_ctxt :: HsMatchContext RdrName
foldMap_match_ctxt = GenLocated SrcSpan RdrName -> HsMatchContext RdrName
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs GenLocated SrcSpan RdrName
foldMap_name
gen_Foldable_binds loc :: SrcSpan
loc tycon :: TyCon
tycon
| [DataCon] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [DataCon]
data_cons
= (LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag LHsBind GhcPs
foldMap_bind, BagDerivStuff
forall a. Bag a
emptyBag)
| Bool
otherwise
= ([LHsBind GhcPs] -> LHsBinds GhcPs
forall a. [a] -> Bag a
listToBag [LHsBind GhcPs
foldr_bind, LHsBind GhcPs
foldMap_bind, LHsBind GhcPs
null_bind], BagDerivStuff
forall a. Bag a
emptyBag)
where
data_cons :: [DataCon]
data_cons = TyCon -> [DataCon]
tyConDataCons TyCon
tycon
foldr_bind :: LHsBind GhcPs
foldr_bind = GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind (SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
foldable_foldr_RDR) [LMatch GhcPs (LHsExpr GhcPs)]
eqns
eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
eqns = (DataCon -> LMatch GhcPs (LHsExpr GhcPs))
-> [DataCon] -> [LMatch GhcPs (LHsExpr GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> LMatch GhcPs (LHsExpr GhcPs)
foldr_eqn [DataCon]
data_cons
foldr_eqn :: DataCon -> LMatch GhcPs (LHsExpr GhcPs)
foldr_eqn con :: DataCon
con
= State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs)
forall s a. State s a -> s -> a
evalState (LHsExpr GhcPs
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldr LHsExpr GhcPs
z_Expr [LPat GhcPs
f_Pat,LPat GhcPs
z_Pat] DataCon
con ([Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< State [RdrName] [Maybe (LHsExpr GhcPs)]
parts) [RdrName]
bs_RDRs
where
parts :: State [RdrName] [Maybe (LHsExpr GhcPs)]
parts = [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)])
-> [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall a b. (a -> b) -> a -> b
$ FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
-> DataCon -> [State [RdrName] (Maybe (LHsExpr GhcPs))]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_foldr DataCon
con
foldMap_name :: GenLocated SrcSpan RdrName
foldMap_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
foldMap_RDR
foldMap_bind :: LHsBind GhcPs
foldMap_bind = Arity
-> (LHsExpr GhcPs -> LHsExpr GhcPs)
-> GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)]
-> LHsBind GhcPs
mkRdrFunBindEC 2 (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall a b. a -> b -> a
const LHsExpr GhcPs
mempty_Expr)
GenLocated SrcSpan RdrName
foldMap_name [LMatch GhcPs (LHsExpr GhcPs)]
foldMap_eqns
foldMap_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
foldMap_eqns = (DataCon -> LMatch GhcPs (LHsExpr GhcPs))
-> [DataCon] -> [LMatch GhcPs (LHsExpr GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> LMatch GhcPs (LHsExpr GhcPs)
foldMap_eqn [DataCon]
data_cons
foldMap_eqn :: DataCon -> LMatch GhcPs (LHsExpr GhcPs)
foldMap_eqn con :: DataCon
con
= State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs)
forall s a. State s a -> s -> a
evalState ([LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldMap [LPat GhcPs
f_Pat] DataCon
con ([Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< State [RdrName] [Maybe (LHsExpr GhcPs)]
parts) [RdrName]
bs_RDRs
where
parts :: State [RdrName] [Maybe (LHsExpr GhcPs)]
parts = [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)])
-> [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall a b. (a -> b) -> a -> b
$ FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
-> DataCon -> [State [RdrName] (Maybe (LHsExpr GhcPs))]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_foldMap DataCon
con
convert :: [NullM a] -> Maybe [Maybe a]
convert :: [NullM a] -> Maybe [Maybe a]
convert = (NullM a -> Maybe (Maybe a)) -> [NullM a] -> Maybe [Maybe a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse NullM a -> Maybe (Maybe a)
forall a. NullM a -> Maybe (Maybe a)
go where
go :: NullM a -> Maybe (Maybe a)
go IsNull = Maybe a -> Maybe (Maybe a)
forall a. a -> Maybe a
Just Maybe a
forall a. Maybe a
Nothing
go NotNull = Maybe (Maybe a)
forall a. Maybe a
Nothing
go (NullM a :: a
a) = Maybe a -> Maybe (Maybe a)
forall a. a -> Maybe a
Just (a -> Maybe a
forall a. a -> Maybe a
Just a
a)
null_name :: GenLocated SrcSpan RdrName
null_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
null_RDR
null_match_ctxt :: HsMatchContext RdrName
null_match_ctxt = GenLocated SrcSpan RdrName -> HsMatchContext RdrName
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs GenLocated SrcSpan RdrName
null_name
null_bind :: LHsBind GhcPs
null_bind = GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind GenLocated SrcSpan RdrName
null_name [LMatch GhcPs (LHsExpr GhcPs)]
null_eqns
null_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
null_eqns = (DataCon -> LMatch GhcPs (LHsExpr GhcPs))
-> [DataCon] -> [LMatch GhcPs (LHsExpr GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> LMatch GhcPs (LHsExpr GhcPs)
null_eqn [DataCon]
data_cons
null_eqn :: DataCon -> LMatch GhcPs (LHsExpr GhcPs)
null_eqn con :: DataCon
con
= (State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs)
forall a b c. (a -> b -> c) -> b -> a -> c
flip State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs)
forall s a. State s a -> s -> a
evalState [RdrName]
bs_RDRs (State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs))
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> LMatch GhcPs (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ do
[NullM (LHsExpr GhcPs)]
parts <- [State [RdrName] (NullM (LHsExpr GhcPs))]
-> State [RdrName] [NullM (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([State [RdrName] (NullM (LHsExpr GhcPs))]
-> State [RdrName] [NullM (LHsExpr GhcPs)])
-> [State [RdrName] (NullM (LHsExpr GhcPs))]
-> State [RdrName] [NullM (LHsExpr GhcPs)]
forall a b. (a -> b) -> a -> b
$ FFoldType (State [RdrName] (NullM (LHsExpr GhcPs)))
-> DataCon -> [State [RdrName] (NullM (LHsExpr GhcPs))]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs FFoldType (State [RdrName] (NullM (LHsExpr GhcPs)))
ft_null DataCon
con
case [NullM (LHsExpr GhcPs)] -> Maybe [Maybe (LHsExpr GhcPs)]
forall a. [NullM a] -> Maybe [Maybe a]
convert [NullM (LHsExpr GhcPs)]
parts of
Nothing -> LMatch GhcPs (LHsExpr GhcPs)
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LMatch GhcPs (LHsExpr GhcPs)
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> LMatch GhcPs (LHsExpr GhcPs)
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$
HsMatchContext (NameOrRdrName (IdP GhcPs))
-> [LPat GhcPs]
-> LHsExpr GhcPs
-> Located (HsLocalBinds GhcPs)
-> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> LHsExpr (GhcPass p)
-> Located (HsLocalBinds (GhcPass p))
-> LMatch (GhcPass p) (LHsExpr (GhcPass p))
mkMatch HsMatchContext RdrName
HsMatchContext (NameOrRdrName (IdP GhcPs))
null_match_ctxt [LPat GhcPs -> LPat GhcPs
forall (name :: Pass). LPat (GhcPass name) -> LPat (GhcPass name)
nlParPat (DataCon -> LPat GhcPs
nlWildConPat DataCon
con)]
LHsExpr GhcPs
false_Expr (SrcSpanLess (Located (HsLocalBinds GhcPs))
-> Located (HsLocalBinds GhcPs)
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (Located (HsLocalBinds GhcPs))
forall (a :: Pass) (b :: Pass).
HsLocalBindsLR (GhcPass a) (GhcPass b)
emptyLocalBinds)
Just cp :: [Maybe (LHsExpr GhcPs)]
cp -> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_null [] DataCon
con [Maybe (LHsExpr GhcPs)]
cp
ft_foldr :: FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_foldr :: FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_foldr
= FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_triv = Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (LHsExpr GhcPs)
forall a. Maybe a
Nothing
, ft_var :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_var = Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs)))
-> Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ LHsExpr GhcPs -> Maybe (LHsExpr GhcPs)
forall a. a -> Maybe a
Just LHsExpr GhcPs
f_Expr
, ft_tup :: TyCon
-> [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_tup = \t :: TyCon
t g :: [State [RdrName] (Maybe (LHsExpr GhcPs))]
g -> do
[Maybe (LHsExpr GhcPs)]
gg <- [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [State [RdrName] (Maybe (LHsExpr GhcPs))]
g
LHsExpr GhcPs
lam <- (LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam2 ((LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \x :: LHsExpr GhcPs
x z :: LHsExpr GhcPs
z ->
([LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon
-> [Maybe (LHsExpr GhcPs)]
-> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a.
Monad m =>
([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase (LHsExpr GhcPs
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldr LHsExpr GhcPs
z) TyCon
t [Maybe (LHsExpr GhcPs)]
gg LHsExpr GhcPs
x
Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> Maybe (LHsExpr GhcPs)
forall a. a -> Maybe a
Just LHsExpr GhcPs
lam)
, ft_ty_app :: Type
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_ty_app = \_ g :: State [RdrName] (Maybe (LHsExpr GhcPs))
g -> do
Maybe (LHsExpr GhcPs)
gg <- State [RdrName] (Maybe (LHsExpr GhcPs))
g
(LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\gg' :: LHsExpr GhcPs
gg' -> (LHsExpr GhcPs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam2 ((LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ \x :: LHsExpr GhcPs
x z :: LHsExpr GhcPs
z -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$
IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
foldable_foldr_RDR [LHsExpr GhcPs
gg',LHsExpr GhcPs
z,LHsExpr GhcPs
x]) Maybe (LHsExpr GhcPs)
gg
, ft_forall :: TcTyVar
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_forall = \_ g :: State [RdrName] (Maybe (LHsExpr GhcPs))
g -> State [RdrName] (Maybe (LHsExpr GhcPs))
g
, ft_co_var :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_co_var = String -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "contravariant in ft_foldr"
, ft_fun :: State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_fun = String
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "function in ft_foldr"
, ft_bad_app :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_bad_app = String -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "in other argument in ft_foldr" }
match_foldr :: LHsExpr GhcPs
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldr :: LHsExpr GhcPs
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldr z :: LHsExpr GhcPs
z = HsMatchContext RdrName
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *).
Monad m =>
HsMatchContext RdrName
-> (LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch2 HsMatchContext RdrName
forall id. HsMatchContext id
LambdaExpr ((LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ \_ xs :: [LHsExpr GhcPs]
xs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LHsExpr GhcPs] -> LHsExpr GhcPs
mkFoldr [LHsExpr GhcPs]
xs)
where
mkFoldr :: [LHsExpr GhcPs] -> LHsExpr GhcPs
mkFoldr :: [LHsExpr GhcPs] -> LHsExpr GhcPs
mkFoldr = (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs)
-> LHsExpr GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
z
ft_foldMap :: FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_foldMap :: FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_foldMap
= FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_triv = Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (LHsExpr GhcPs)
forall a. Maybe a
Nothing
, ft_var :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_var = Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> Maybe (LHsExpr GhcPs)
forall a. a -> Maybe a
Just LHsExpr GhcPs
f_Expr)
, ft_tup :: TyCon
-> [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_tup = \t :: TyCon
t g :: [State [RdrName] (Maybe (LHsExpr GhcPs))]
g -> do
[Maybe (LHsExpr GhcPs)]
gg <- [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [State [RdrName] (Maybe (LHsExpr GhcPs))]
g
LHsExpr GhcPs
lam <- (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ ([LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon
-> [Maybe (LHsExpr GhcPs)]
-> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a.
Monad m =>
([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldMap TyCon
t [Maybe (LHsExpr GhcPs)]
gg
Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> Maybe (LHsExpr GhcPs)
forall a. a -> Maybe a
Just LHsExpr GhcPs
lam)
, ft_ty_app :: Type
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_ty_app = \_ g :: State [RdrName] (Maybe (LHsExpr GhcPs))
g -> (LHsExpr GhcPs -> LHsExpr GhcPs)
-> Maybe (LHsExpr GhcPs) -> Maybe (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
foldMap_Expr) (Maybe (LHsExpr GhcPs) -> Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> State [RdrName] (Maybe (LHsExpr GhcPs))
g
, ft_forall :: TcTyVar
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_forall = \_ g :: State [RdrName] (Maybe (LHsExpr GhcPs))
g -> State [RdrName] (Maybe (LHsExpr GhcPs))
g
, ft_co_var :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_co_var = String -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "contravariant in ft_foldMap"
, ft_fun :: State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_fun = String
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "function in ft_foldMap"
, ft_bad_app :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_bad_app = String -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "in other argument in ft_foldMap" }
match_foldMap :: [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldMap :: [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_foldMap = HsMatchContext RdrName
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *).
Monad m =>
HsMatchContext RdrName
-> (LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch2 HsMatchContext RdrName
forall id. HsMatchContext id
CaseAlt ((LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ \_ xs :: [LHsExpr GhcPs]
xs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LHsExpr GhcPs] -> LHsExpr GhcPs
mkFoldMap [LHsExpr GhcPs]
xs)
where
mkFoldMap :: [LHsExpr GhcPs] -> LHsExpr GhcPs
mkFoldMap :: [LHsExpr GhcPs] -> LHsExpr GhcPs
mkFoldMap [] = LHsExpr GhcPs
mempty_Expr
mkFoldMap xs :: [LHsExpr GhcPs]
xs = (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs)
-> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (\x :: LHsExpr GhcPs
x y :: LHsExpr GhcPs
y -> IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
mappend_RDR [LHsExpr GhcPs
x,LHsExpr GhcPs
y]) [LHsExpr GhcPs]
xs
ft_null :: FFoldType (State [RdrName] (NullM (LHsExpr GhcPs)))
ft_null :: FFoldType (State [RdrName] (NullM (LHsExpr GhcPs)))
ft_null
= FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: State [RdrName] (NullM (LHsExpr GhcPs))
ft_triv = NullM (LHsExpr GhcPs) -> State [RdrName] (NullM (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return NullM (LHsExpr GhcPs)
forall a. NullM a
IsNull
, ft_var :: State [RdrName] (NullM (LHsExpr GhcPs))
ft_var = NullM (LHsExpr GhcPs) -> State [RdrName] (NullM (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return NullM (LHsExpr GhcPs)
forall a. NullM a
NotNull
, ft_tup :: TyCon
-> [State [RdrName] (NullM (LHsExpr GhcPs))]
-> State [RdrName] (NullM (LHsExpr GhcPs))
ft_tup = \t :: TyCon
t g :: [State [RdrName] (NullM (LHsExpr GhcPs))]
g -> do
[NullM (LHsExpr GhcPs)]
gg <- [State [RdrName] (NullM (LHsExpr GhcPs))]
-> State [RdrName] [NullM (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [State [RdrName] (NullM (LHsExpr GhcPs))]
g
case [NullM (LHsExpr GhcPs)] -> Maybe [Maybe (LHsExpr GhcPs)]
forall a. [NullM a] -> Maybe [Maybe a]
convert [NullM (LHsExpr GhcPs)]
gg of
Nothing -> NullM (LHsExpr GhcPs) -> State [RdrName] (NullM (LHsExpr GhcPs))
forall (f :: * -> *) a. Applicative f => a -> f a
pure NullM (LHsExpr GhcPs)
forall a. NullM a
NotNull
Just ggg :: [Maybe (LHsExpr GhcPs)]
ggg ->
LHsExpr GhcPs -> NullM (LHsExpr GhcPs)
forall a. a -> NullM a
NullM (LHsExpr GhcPs -> NullM (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
-> State [RdrName] (NullM (LHsExpr GhcPs))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ ([LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon
-> [Maybe (LHsExpr GhcPs)]
-> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a.
Monad m =>
([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_null TyCon
t [Maybe (LHsExpr GhcPs)]
ggg)
, ft_ty_app :: Type
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
ft_ty_app = \_ g :: State [RdrName] (NullM (LHsExpr GhcPs))
g -> ((NullM (LHsExpr GhcPs) -> NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs)))
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> (NullM (LHsExpr GhcPs) -> NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (NullM (LHsExpr GhcPs) -> NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap State [RdrName] (NullM (LHsExpr GhcPs))
g ((NullM (LHsExpr GhcPs) -> NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs)))
-> (NullM (LHsExpr GhcPs) -> NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ \nestedResult :: NullM (LHsExpr GhcPs)
nestedResult ->
case NullM (LHsExpr GhcPs)
nestedResult of
NotNull -> LHsExpr GhcPs -> NullM (LHsExpr GhcPs)
forall a. a -> NullM a
NullM LHsExpr GhcPs
null_Expr
IsNull -> NullM (LHsExpr GhcPs)
forall a. NullM a
IsNull
NullM nestedTest :: LHsExpr GhcPs
nestedTest -> LHsExpr GhcPs -> NullM (LHsExpr GhcPs)
forall a. a -> NullM a
NullM (LHsExpr GhcPs -> NullM (LHsExpr GhcPs))
-> LHsExpr GhcPs -> NullM (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$
LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
all_Expr LHsExpr GhcPs
nestedTest
, ft_forall :: TcTyVar
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
ft_forall = \_ g :: State [RdrName] (NullM (LHsExpr GhcPs))
g -> State [RdrName] (NullM (LHsExpr GhcPs))
g
, ft_co_var :: State [RdrName] (NullM (LHsExpr GhcPs))
ft_co_var = String -> State [RdrName] (NullM (LHsExpr GhcPs))
forall a. String -> a
panic "contravariant in ft_null"
, ft_fun :: State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
ft_fun = String
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
-> State [RdrName] (NullM (LHsExpr GhcPs))
forall a. String -> a
panic "function in ft_null"
, ft_bad_app :: State [RdrName] (NullM (LHsExpr GhcPs))
ft_bad_app = String -> State [RdrName] (NullM (LHsExpr GhcPs))
forall a. String -> a
panic "in other argument in ft_null" }
match_null :: [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_null :: [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_null = HsMatchContext RdrName
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *).
Monad m =>
HsMatchContext RdrName
-> (LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch2 HsMatchContext RdrName
forall id. HsMatchContext id
CaseAlt ((LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$ \_ xs :: [LHsExpr GhcPs]
xs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LHsExpr GhcPs] -> LHsExpr GhcPs
mkNull [LHsExpr GhcPs]
xs)
where
mkNull :: [LHsExpr GhcPs] -> LHsExpr GhcPs
mkNull :: [LHsExpr GhcPs] -> LHsExpr GhcPs
mkNull [] = LHsExpr GhcPs
true_Expr
mkNull xs :: [LHsExpr GhcPs]
xs = (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs)
-> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (\x :: LHsExpr GhcPs
x y :: LHsExpr GhcPs
y -> IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
and_RDR [LHsExpr GhcPs
x,LHsExpr GhcPs
y]) [LHsExpr GhcPs]
xs
data NullM a =
IsNull
| NotNull
| NullM a
gen_Traversable_binds :: SrcSpan -> TyCon -> (LHsBinds GhcPs, BagDerivStuff)
gen_Traversable_binds :: SrcSpan -> TyCon -> (LHsBinds GhcPs, BagDerivStuff)
gen_Traversable_binds loc :: SrcSpan
loc tycon :: TyCon
tycon
| Role
Phantom <- [Role] -> Role
forall a. [a] -> a
last (TyCon -> [Role]
tyConRoles TyCon
tycon)
= (LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag LHsBind GhcPs
traverse_bind, BagDerivStuff
forall a. Bag a
emptyBag)
where
traverse_name :: GenLocated SrcSpan RdrName
traverse_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
traverse_RDR
traverse_bind :: LHsBind GhcPs
traverse_bind = GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)] -> LHsBind GhcPs
mkRdrFunBind GenLocated SrcSpan RdrName
traverse_name [LMatch GhcPs (LHsExpr GhcPs)]
traverse_eqns
traverse_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
traverse_eqns =
[HsMatchContext (NameOrRdrName (IdP GhcPs))
-> [LPat GhcPs] -> LHsExpr GhcPs -> LMatch GhcPs (LHsExpr GhcPs)
forall (p :: Pass) (body :: * -> *).
HsMatchContext (NameOrRdrName (IdP (GhcPass p)))
-> [LPat (GhcPass p)]
-> Located (body (GhcPass p))
-> LMatch (GhcPass p) (Located (body (GhcPass p)))
mkSimpleMatch HsMatchContext RdrName
HsMatchContext (NameOrRdrName (IdP GhcPs))
traverse_match_ctxt
[LPat GhcPs
nlWildPat, LPat GhcPs
z_Pat]
(IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
pure_RDR [LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
coerce_Expr LHsExpr GhcPs
z_Expr])]
traverse_match_ctxt :: HsMatchContext RdrName
traverse_match_ctxt = GenLocated SrcSpan RdrName -> HsMatchContext RdrName
forall id. Located id -> HsMatchContext id
mkPrefixFunRhs GenLocated SrcSpan RdrName
traverse_name
gen_Traversable_binds loc :: SrcSpan
loc tycon :: TyCon
tycon
= (LHsBind GhcPs -> LHsBinds GhcPs
forall a. a -> Bag a
unitBag LHsBind GhcPs
traverse_bind, BagDerivStuff
forall a. Bag a
emptyBag)
where
data_cons :: [DataCon]
data_cons = TyCon -> [DataCon]
tyConDataCons TyCon
tycon
traverse_name :: GenLocated SrcSpan RdrName
traverse_name = SrcSpan -> RdrName -> GenLocated SrcSpan RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpan
loc RdrName
traverse_RDR
traverse_bind :: LHsBind GhcPs
traverse_bind = Arity
-> (LHsExpr GhcPs -> LHsExpr GhcPs)
-> GenLocated SrcSpan RdrName
-> [LMatch GhcPs (LHsExpr GhcPs)]
-> LHsBind GhcPs
mkRdrFunBindEC 2 (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
pure_Expr)
GenLocated SrcSpan RdrName
traverse_name [LMatch GhcPs (LHsExpr GhcPs)]
traverse_eqns
traverse_eqns :: [LMatch GhcPs (LHsExpr GhcPs)]
traverse_eqns = (DataCon -> LMatch GhcPs (LHsExpr GhcPs))
-> [DataCon] -> [LMatch GhcPs (LHsExpr GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map DataCon -> LMatch GhcPs (LHsExpr GhcPs)
traverse_eqn [DataCon]
data_cons
traverse_eqn :: DataCon -> LMatch GhcPs (LHsExpr GhcPs)
traverse_eqn con :: DataCon
con
= State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
-> [RdrName] -> LMatch GhcPs (LHsExpr GhcPs)
forall s a. State s a -> s -> a
evalState ([LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con [LPat GhcPs
f_Pat] DataCon
con ([Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< State [RdrName] [Maybe (LHsExpr GhcPs)]
parts) [RdrName]
bs_RDRs
where
parts :: State [RdrName] [Maybe (LHsExpr GhcPs)]
parts = [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)])
-> [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall a b. (a -> b) -> a -> b
$ FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
-> DataCon -> [State [RdrName] (Maybe (LHsExpr GhcPs))]
forall a. FFoldType a -> DataCon -> [a]
foldDataConArgs FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_trav DataCon
con
ft_trav :: FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_trav :: FFoldType (State [RdrName] (Maybe (LHsExpr GhcPs)))
ft_trav
= FT :: forall a.
a
-> a
-> a
-> (a -> a -> a)
-> (TyCon -> [a] -> a)
-> (Type -> a -> a)
-> a
-> (TcTyVar -> a -> a)
-> FFoldType a
FT { ft_triv :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_triv = Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (LHsExpr GhcPs)
forall a. Maybe a
Nothing
, ft_var :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_var = Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> Maybe (LHsExpr GhcPs)
forall a. a -> Maybe a
Just LHsExpr GhcPs
f_Expr)
, ft_tup :: TyCon
-> [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_tup = \t :: TyCon
t gs :: [State [RdrName] (Maybe (LHsExpr GhcPs))]
gs -> do
[Maybe (LHsExpr GhcPs)]
gg <- [State [RdrName] (Maybe (LHsExpr GhcPs))]
-> State [RdrName] [Maybe (LHsExpr GhcPs)]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [State [RdrName] (Maybe (LHsExpr GhcPs))]
gs
LHsExpr GhcPs
lam <- (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
mkSimpleLam ((LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs))
-> State [RdrName] (LHsExpr GhcPs)
forall a b. (a -> b) -> a -> b
$ ([LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon
-> [Maybe (LHsExpr GhcPs)]
-> LHsExpr GhcPs
-> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a.
Monad m =>
([LPat GhcPs]
-> DataCon -> [a] -> m (LMatch GhcPs (LHsExpr GhcPs)))
-> TyCon -> [a] -> LHsExpr GhcPs -> m (LHsExpr GhcPs)
mkSimpleTupleCase [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con TyCon
t [Maybe (LHsExpr GhcPs)]
gg
Maybe (LHsExpr GhcPs) -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> Maybe (LHsExpr GhcPs)
forall a. a -> Maybe a
Just LHsExpr GhcPs
lam)
, ft_ty_app :: Type
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_ty_app = \_ g :: State [RdrName] (Maybe (LHsExpr GhcPs))
g -> (LHsExpr GhcPs -> LHsExpr GhcPs)
-> Maybe (LHsExpr GhcPs) -> Maybe (LHsExpr GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp LHsExpr GhcPs
traverse_Expr) (Maybe (LHsExpr GhcPs) -> Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> State [RdrName] (Maybe (LHsExpr GhcPs))
g
, ft_forall :: TcTyVar
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_forall = \_ g :: State [RdrName] (Maybe (LHsExpr GhcPs))
g -> State [RdrName] (Maybe (LHsExpr GhcPs))
g
, ft_co_var :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_co_var = String -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "contravariant in ft_trav"
, ft_fun :: State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
ft_fun = String
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
-> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "function in ft_trav"
, ft_bad_app :: State [RdrName] (Maybe (LHsExpr GhcPs))
ft_bad_app = String -> State [RdrName] (Maybe (LHsExpr GhcPs))
forall a. String -> a
panic "in other argument in ft_trav" }
match_for_con :: [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con :: [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
match_for_con = HsMatchContext RdrName
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall (m :: * -> *).
Monad m =>
HsMatchContext RdrName
-> (LHsExpr GhcPs -> [LHsExpr GhcPs] -> m (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> m (LMatch GhcPs (LHsExpr GhcPs))
mkSimpleConMatch2 HsMatchContext RdrName
forall id. HsMatchContext id
CaseAlt ((LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs)))
-> (LHsExpr GhcPs
-> [LHsExpr GhcPs] -> State [RdrName] (LHsExpr GhcPs))
-> [LPat GhcPs]
-> DataCon
-> [Maybe (LHsExpr GhcPs)]
-> State [RdrName] (LMatch GhcPs (LHsExpr GhcPs))
forall a b. (a -> b) -> a -> b
$
\con :: LHsExpr GhcPs
con xs :: [LHsExpr GhcPs]
xs -> LHsExpr GhcPs -> State [RdrName] (LHsExpr GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsExpr GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
mkApCon LHsExpr GhcPs
con [LHsExpr GhcPs]
xs)
where
mkApCon :: LHsExpr GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
mkApCon :: LHsExpr GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
mkApCon con :: LHsExpr GhcPs
con [] = IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
pure_RDR [LHsExpr GhcPs
con]
mkApCon con :: LHsExpr GhcPs
con [x :: LHsExpr GhcPs
x] = IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
fmap_RDR [LHsExpr GhcPs
con,LHsExpr GhcPs
x]
mkApCon con :: LHsExpr GhcPs
con (x1 :: LHsExpr GhcPs
x1:x2 :: LHsExpr GhcPs
x2:xs :: [LHsExpr GhcPs]
xs) =
(LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs)
-> LHsExpr GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' LHsExpr GhcPs -> LHsExpr GhcPs -> LHsExpr GhcPs
forall (id :: Pass).
(IdP (GhcPass id) ~ RdrName) =>
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
appAp (IdP GhcPs -> [LHsExpr GhcPs] -> LHsExpr GhcPs
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP GhcPs
liftA2_RDR [LHsExpr GhcPs
con,LHsExpr GhcPs
x1,LHsExpr GhcPs
x2]) [LHsExpr GhcPs]
xs
where appAp :: LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
appAp x :: LHsExpr (GhcPass id)
x y :: LHsExpr (GhcPass id)
y = IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
forall (id :: Pass).
IdP (GhcPass id) -> [LHsExpr (GhcPass id)] -> LHsExpr (GhcPass id)
nlHsApps RdrName
IdP (GhcPass id)
ap_RDR [LHsExpr (GhcPass id)
x,LHsExpr (GhcPass id)
y]
f_Expr, z_Expr, fmap_Expr, replace_Expr, mempty_Expr, foldMap_Expr,
traverse_Expr, coerce_Expr, pure_Expr, true_Expr, false_Expr,
all_Expr, null_Expr :: LHsExpr GhcPs
f_Expr :: LHsExpr GhcPs
f_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
f_RDR
z_Expr :: LHsExpr GhcPs
z_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
z_RDR
fmap_Expr :: LHsExpr GhcPs
fmap_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
fmap_RDR
replace_Expr :: LHsExpr GhcPs
replace_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
replace_RDR
mempty_Expr :: LHsExpr GhcPs
mempty_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
mempty_RDR
foldMap_Expr :: LHsExpr GhcPs
foldMap_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
foldMap_RDR
traverse_Expr :: LHsExpr GhcPs
traverse_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
traverse_RDR
coerce_Expr :: LHsExpr GhcPs
coerce_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar (TcTyVar -> RdrName
forall thing. NamedThing thing => thing -> RdrName
getRdrName TcTyVar
coerceId)
pure_Expr :: LHsExpr GhcPs
pure_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
pure_RDR
true_Expr :: LHsExpr GhcPs
true_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
true_RDR
false_Expr :: LHsExpr GhcPs
false_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
false_RDR
all_Expr :: LHsExpr GhcPs
all_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
all_RDR
null_Expr :: LHsExpr GhcPs
null_Expr = IdP GhcPs -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar RdrName
IdP GhcPs
null_RDR
f_RDR, z_RDR :: RdrName
f_RDR :: RdrName
f_RDR = FastString -> RdrName
mkVarUnqual (String -> FastString
fsLit "f")
z_RDR :: RdrName
z_RDR = FastString -> RdrName
mkVarUnqual (String -> FastString
fsLit "z")
as_RDRs, bs_RDRs :: [RdrName]
as_RDRs :: [RdrName]
as_RDRs = [ FastString -> RdrName
mkVarUnqual (String -> FastString
mkFastString ("a"String -> String -> String
forall a. [a] -> [a] -> [a]
++Arity -> String
forall a. Show a => a -> String
show Arity
i)) | Arity
i <- [(1::Int) .. ] ]
bs_RDRs :: [RdrName]
bs_RDRs = [ FastString -> RdrName
mkVarUnqual (String -> FastString
mkFastString ("b"String -> String -> String
forall a. [a] -> [a] -> [a]
++Arity -> String
forall a. Show a => a -> String
show Arity
i)) | Arity
i <- [(1::Int) .. ] ]
as_Vars, bs_Vars :: [LHsExpr GhcPs]
as_Vars :: [LHsExpr GhcPs]
as_Vars = (RdrName -> LHsExpr GhcPs) -> [RdrName] -> [LHsExpr GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map RdrName -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar [RdrName]
as_RDRs
bs_Vars :: [LHsExpr GhcPs]
bs_Vars = (RdrName -> LHsExpr GhcPs) -> [RdrName] -> [LHsExpr GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map RdrName -> LHsExpr GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar [RdrName]
bs_RDRs
f_Pat, z_Pat :: LPat GhcPs
f_Pat :: LPat GhcPs
f_Pat = IdP GhcPs -> LPat GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
nlVarPat RdrName
IdP GhcPs
f_RDR
z_Pat :: LPat GhcPs
z_Pat = IdP GhcPs -> LPat GhcPs
forall (id :: Pass). IdP (GhcPass id) -> LPat (GhcPass id)
nlVarPat RdrName
IdP GhcPs
z_RDR