{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
#include "free-common.h"
module Control.Monad.Free.Church
( F(..)
, improve
, fromF
, iter
, iterM
, toF
, retract
, hoistF
, foldF
, MonadFree(..)
, liftF
, cutoff
) where
import Control.Applicative
import Control.Monad as Monad
import Control.Monad.Fix
import Control.Monad.Free hiding (retract, iter, iterM, cutoff)
import Control.Monad.Reader.Class
import Control.Monad.Writer.Class
import Control.Monad.Cont.Class
import Control.Monad.Trans.Class
import Control.Monad.State.Class
import Data.Foldable
import Data.Traversable
import Data.Functor.Bind
import Data.Semigroup.Foldable
import Data.Semigroup.Traversable
import Prelude hiding (foldr)
newtype F f a = F { forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF :: forall r. (a -> r) -> (f r -> r) -> r }
iter :: (f a -> a) -> F f a -> a
iter :: forall (f :: * -> *) a. (f a -> a) -> F f a -> a
iter f a -> a
phi F f a
xs = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
xs forall a. a -> a
id f a -> a
phi
iterM :: Monad m => (f (m a) -> m a) -> F f a -> m a
iterM :: forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
(f (m a) -> m a) -> F f a -> m a
iterM f (m a) -> m a
phi F f a
xs = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
xs forall (m :: * -> *) a. Monad m => a -> m a
return f (m a) -> m a
phi
instance Functor (F f) where
fmap :: forall a b. (a -> b) -> F f a -> F f b
fmap a -> b
f (F forall r. (a -> r) -> (f r -> r) -> r
g) = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\b -> r
kp -> forall r. (a -> r) -> (f r -> r) -> r
g (b -> r
kp forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f))
instance Apply (F f) where
<.> :: forall a b. F f (a -> b) -> F f a -> F f b
(<.>) = forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
instance Applicative (F f) where
pure :: forall a. a -> F f a
pure a
a = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
kp f r -> r
_ -> a -> r
kp a
a)
F forall r. ((a -> b) -> r) -> (f r -> r) -> r
f <*> :: forall a b. F f (a -> b) -> F f a -> F f b
<*> F forall r. (a -> r) -> (f r -> r) -> r
g = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\b -> r
kp f r -> r
kf -> forall r. ((a -> b) -> r) -> (f r -> r) -> r
f (\a -> b
a -> forall r. (a -> r) -> (f r -> r) -> r
g (b -> r
kp forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
a) f r -> r
kf) f r -> r
kf)
instance Alternative f => Alternative (F f) where
empty :: forall a. F f a
empty = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
_ f r -> r
kf -> f r -> r
kf forall (f :: * -> *) a. Alternative f => f a
empty)
F forall r. (a -> r) -> (f r -> r) -> r
f <|> :: forall a. F f a -> F f a -> F f a
<|> F forall r. (a -> r) -> (f r -> r) -> r
g = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
kp f r -> r
kf -> f r -> r
kf (forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall r. (a -> r) -> (f r -> r) -> r
f a -> r
kp f r -> r
kf) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall r. (a -> r) -> (f r -> r) -> r
g a -> r
kp f r -> r
kf)))
instance Bind (F f) where
>>- :: forall a b. F f a -> (a -> F f b) -> F f b
(>>-) = forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
(>>=)
instance Monad (F f) where
return :: forall a. a -> F f a
return = forall (f :: * -> *) a. Applicative f => a -> f a
pure
F forall r. (a -> r) -> (f r -> r) -> r
m >>= :: forall a b. F f a -> (a -> F f b) -> F f b
>>= a -> F f b
f = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\b -> r
kp f r -> r
kf -> forall r. (a -> r) -> (f r -> r) -> r
m (\a
a -> forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF (a -> F f b
f a
a) b -> r
kp f r -> r
kf) f r -> r
kf)
instance MonadFix (F f) where
mfix :: forall a. (a -> F f a) -> F f a
mfix a -> F f a
f = F f a
a where
a :: F f a
a = a -> F f a
f (forall {f :: * -> *} {r}. F f r -> r
impure F f a
a)
impure :: F f r -> r
impure (F forall r. (r -> r) -> (f r -> r) -> r
x) = forall r. (r -> r) -> (f r -> r) -> r
x forall a. a -> a
id (forall a. HasCallStack => [Char] -> a
error [Char]
"MonadFix (F f): wrap")
instance Foldable f => Foldable (F f) where
foldMap :: forall m a. Monoid m => (a -> m) -> F f a -> m
foldMap a -> m
f F f a
xs = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
xs a -> m
f forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
{-# INLINE foldMap #-}
foldr :: forall a b. (a -> b -> b) -> b -> F f a -> b
foldr a -> b -> b
f b
r F f a
xs = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
xs a -> b -> b
f (forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) forall a. a -> a
id) b
r
{-# INLINE foldr #-}
#if MIN_VERSION_base(4,6,0)
foldl' :: forall b a. (b -> a -> b) -> b -> F f a -> b
foldl' b -> a -> b
f b
z F f a
xs = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
xs (\a
a !b
r -> b -> a -> b
f b
r a
a) (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall a b. (a -> b) -> a -> b
$ \b
r b -> b
g -> b -> b
g b
r) b
z
{-# INLINE foldl' #-}
#endif
instance Traversable f => Traversable (F f) where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> F f a -> f (F f b)
traverse a -> f b
f F f a
m = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
m (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> f b
f) (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) (m :: * -> *) a.
MonadFree f m =>
f (m a) -> m a
wrap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA)
{-# INLINE traverse #-}
instance Foldable1 f => Foldable1 (F f) where
foldMap1 :: forall m a. Semigroup m => (a -> m) -> F f a -> m
foldMap1 a -> m
f F f a
m = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
m a -> m
f forall (t :: * -> *) m. (Foldable1 t, Semigroup m) => t m -> m
fold1
instance Traversable1 f => Traversable1 (F f) where
traverse1 :: forall (f :: * -> *) a b.
Apply f =>
(a -> f b) -> F f a -> f (F f b)
traverse1 a -> f b
f F f a
m = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
m (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> f b
f) (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) (m :: * -> *) a.
MonadFree f m =>
f (m a) -> m a
wrap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) b.
(Traversable1 t, Apply f) =>
t (f b) -> f (t b)
sequence1)
instance MonadPlus f => MonadPlus (F f) where
mzero :: forall a. F f a
mzero = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
_ f r -> r
kf -> f r -> r
kf forall (m :: * -> *) a. MonadPlus m => m a
mzero)
F forall r. (a -> r) -> (f r -> r) -> r
f mplus :: forall a. F f a -> F f a -> F f a
`mplus` F forall r. (a -> r) -> (f r -> r) -> r
g = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
kp f r -> r
kf -> f r -> r
kf (forall (m :: * -> *) a. Monad m => a -> m a
return (forall r. (a -> r) -> (f r -> r) -> r
f a -> r
kp f r -> r
kf) forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` forall (m :: * -> *) a. Monad m => a -> m a
return (forall r. (a -> r) -> (f r -> r) -> r
g a -> r
kp f r -> r
kf)))
instance MonadTrans F where
lift :: forall (m :: * -> *) a. Monad m => m a -> F m a
lift m a
f = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
kp m r -> r
kf -> m r -> r
kf (forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM a -> r
kp m a
f))
instance Functor f => MonadFree f (F f) where
wrap :: forall a. f (F f a) -> F f a
wrap f (F f a)
f = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
kp f r -> r
kf -> f r -> r
kf (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\ (F forall r. (a -> r) -> (f r -> r) -> r
m) -> forall r. (a -> r) -> (f r -> r) -> r
m a -> r
kp f r -> r
kf) f (F f a)
f))
instance MonadState s m => MonadState s (F m) where
get :: F m s
get = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall s (m :: * -> *). MonadState s m => m s
get
put :: s -> F m ()
put = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *). MonadState s m => s -> m ()
put
instance MonadReader e m => MonadReader e (F m) where
ask :: F m e
ask = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall r (m :: * -> *). MonadReader r m => m r
ask
local :: forall a. (e -> e) -> F m a -> F m a
local e -> e
f = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local e -> e
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => F m a -> m a
retract
instance MonadWriter w m => MonadWriter w (F m) where
tell :: w -> F m ()
tell = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell
pass :: forall a. F m (a, w -> w) -> F m a
pass = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a
pass forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => F m a -> m a
retract
listen :: forall a. F m a -> F m (a, w)
listen = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w)
listen forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => F m a -> m a
retract
instance MonadCont m => MonadCont (F m) where
callCC :: forall a b. ((a -> F m b) -> F m a) -> F m a
callCC (a -> F m b) -> F m a
f = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a b. MonadCont m => ((a -> m b) -> m a) -> m a
callCC (forall (m :: * -> *) a. Monad m => F m a -> m a
retract forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> F m b) -> F m a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift)
retract :: Monad m => F m a -> m a
retract :: forall (m :: * -> *) a. Monad m => F m a -> m a
retract (F forall r. (a -> r) -> (m r -> r) -> r
m) = forall r. (a -> r) -> (m r -> r) -> r
m forall (m :: * -> *) a. Monad m => a -> m a
return forall (m :: * -> *) a. Monad m => m (m a) -> m a
Monad.join
{-# INLINE retract #-}
hoistF :: (forall x. f x -> g x) -> F f a -> F g a
hoistF :: forall (f :: * -> *) (g :: * -> *) a.
(forall x. f x -> g x) -> F f a -> F g a
hoistF forall x. f x -> g x
t (F forall r. (a -> r) -> (f r -> r) -> r
m) = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
p g r -> r
f -> forall r. (a -> r) -> (f r -> r) -> r
m a -> r
p (g r -> r
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. f x -> g x
t))
foldF :: Monad m => (forall x. f x -> m x) -> F f a -> m a
foldF :: forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
(forall x. f x -> m x) -> F f a -> m a
foldF forall x. f x -> m x
f (F forall r. (a -> r) -> (f r -> r) -> r
m) = forall r. (a -> r) -> (f r -> r) -> r
m forall (m :: * -> *) a. Monad m => a -> m a
return (forall (m :: * -> *) a. Monad m => m (m a) -> m a
Monad.join forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall x. f x -> m x
f)
fromF :: MonadFree f m => F f a -> m a
fromF :: forall (f :: * -> *) (m :: * -> *) a. MonadFree f m => F f a -> m a
fromF (F forall r. (a -> r) -> (f r -> r) -> r
m) = forall r. (a -> r) -> (f r -> r) -> r
m forall (m :: * -> *) a. Monad m => a -> m a
return forall (f :: * -> *) (m :: * -> *) a.
MonadFree f m =>
f (m a) -> m a
wrap
{-# INLINE fromF #-}
toF :: Functor f => Free f a -> F f a
toF :: forall (f :: * -> *) a. Functor f => Free f a -> F f a
toF Free f a
xs = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F (\a -> r
kp f r -> r
kf -> forall {f :: * -> *} {t} {b}.
Functor f =>
(t -> b) -> (f b -> b) -> Free f t -> b
go a -> r
kp f r -> r
kf Free f a
xs) where
go :: (t -> b) -> (f b -> b) -> Free f t -> b
go t -> b
kp f b -> b
_ (Pure t
a) = t -> b
kp t
a
go t -> b
kp f b -> b
kf (Free f (Free f t)
fma) = f b -> b
kf (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((t -> b) -> (f b -> b) -> Free f t -> b
go t -> b
kp f b -> b
kf) f (Free f t)
fma)
improve :: Functor f => (forall m. MonadFree f m => m a) -> Free f a
improve :: forall (f :: * -> *) a.
Functor f =>
(forall (m :: * -> *). MonadFree f m => m a) -> Free f a
improve forall (m :: * -> *). MonadFree f m => m a
m = forall (f :: * -> *) (m :: * -> *) a. MonadFree f m => F f a -> m a
fromF forall (m :: * -> *). MonadFree f m => m a
m
{-# INLINE improve #-}
{-# INLINE cutoff #-}
cutoff :: (Functor f) => Integer -> F f a -> F f (Maybe a)
cutoff :: forall (f :: * -> *) a.
Functor f =>
Integer -> F f a -> F f (Maybe a)
cutoff Integer
n F f a
m
| Integer
n forall a. Ord a => a -> a -> Bool
<= Integer
0 = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
| Integer
n forall a. Ord a => a -> a -> Bool
<= forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
maxBound :: Int) = forall (f :: * -> *) n a.
(Functor f, Integral n) =>
n -> F f a -> F f (Maybe a)
cutoffI (forall a. Num a => Integer -> a
fromInteger Integer
n :: Int) F f a
m
| Bool
otherwise = forall (f :: * -> *) n a.
(Functor f, Integral n) =>
n -> F f a -> F f (Maybe a)
cutoffI Integer
n F f a
m
{-# SPECIALIZE cutoffI :: (Functor f) => Int -> F f a -> F f (Maybe a) #-}
{-# SPECIALIZE cutoffI :: (Functor f) => Integer -> F f a -> F f (Maybe a) #-}
cutoffI :: (Functor f, Integral n) => n -> F f a -> F f (Maybe a)
cutoffI :: forall (f :: * -> *) n a.
(Functor f, Integral n) =>
n -> F f a -> F f (Maybe a)
cutoffI n
n F f a
m = forall (f :: * -> *) a.
(forall r. (a -> r) -> (f r -> r) -> r) -> F f a
F forall {t}. (Maybe a -> t) -> (f t -> t) -> t
m' where
m' :: (Maybe a -> t) -> (f t -> t) -> t
m' Maybe a -> t
kp f t -> t
kf = forall (f :: * -> *) a.
F f a -> forall r. (a -> r) -> (f r -> r) -> r
runF F f a
m forall {a}. (Ord a, Num a) => a -> a -> t
kpn forall {a}. (Ord a, Num a) => f (a -> t) -> a -> t
kfn n
n where
kpn :: a -> a -> t
kpn a
a a
i
| a
i forall a. Ord a => a -> a -> Bool
<= a
0 = Maybe a -> t
kp forall a. Maybe a
Nothing
| Bool
otherwise = Maybe a -> t
kp (forall a. a -> Maybe a
Just a
a)
kfn :: f (a -> t) -> a -> t
kfn f (a -> t)
fr a
i
| a
i forall a. Ord a => a -> a -> Bool
<= a
0 = Maybe a -> t
kp forall a. Maybe a
Nothing
| Bool
otherwise = let
i' :: a
i' = a
i forall a. Num a => a -> a -> a
- a
1
in a
i' seq :: forall a b. a -> b -> b
`seq` f t -> t
kf (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b. (a -> b) -> a -> b
$ a
i') f (a -> t)
fr)