unfree-0.1.0: Simplistic free monad with deriving through UndecidableInstances
Safe HaskellSafe-Inferred
LanguageHaskell2010

Unfree

Description

We redefine Free here because we prefer undeciable instances to having to derive Eq1 and so on. See https://hackage.haskell.org/package/free-5.1.7/docs/Control-Monad-Trans-Free.html

Synopsis

Documentation

data FreeF f a r Source #

The recursive layer of a free functor

Constructors

FreePureF !a 
FreeEmbedF !(f r) 

Instances

Instances details
Foldable f => Bifoldable (FreeF f) Source # 
Instance details

Defined in Unfree

Methods

bifold :: Monoid m => FreeF f m m -> m #

bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> FreeF f a b -> m #

bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> FreeF f a b -> c #

bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> FreeF f a b -> c #

Functor f => Bifunctor (FreeF f) Source # 
Instance details

Defined in Unfree

Methods

bimap :: (a -> b) -> (c -> d) -> FreeF f a c -> FreeF f b d #

first :: (a -> b) -> FreeF f a c -> FreeF f b c #

second :: (b -> c) -> FreeF f a b -> FreeF f a c #

Traversable f => Bitraversable (FreeF f) Source # 
Instance details

Defined in Unfree

Methods

bitraverse :: Applicative f0 => (a -> f0 c) -> (b -> f0 d) -> FreeF f a b -> f0 (FreeF f c d) #

Foldable f => Foldable (FreeF f a) Source # 
Instance details

Defined in Unfree

Methods

fold :: Monoid m => FreeF f a m -> m #

foldMap :: Monoid m => (a0 -> m) -> FreeF f a a0 -> m #

foldMap' :: Monoid m => (a0 -> m) -> FreeF f a a0 -> m #

foldr :: (a0 -> b -> b) -> b -> FreeF f a a0 -> b #

foldr' :: (a0 -> b -> b) -> b -> FreeF f a a0 -> b #

foldl :: (b -> a0 -> b) -> b -> FreeF f a a0 -> b #

foldl' :: (b -> a0 -> b) -> b -> FreeF f a a0 -> b #

foldr1 :: (a0 -> a0 -> a0) -> FreeF f a a0 -> a0 #

foldl1 :: (a0 -> a0 -> a0) -> FreeF f a a0 -> a0 #

toList :: FreeF f a a0 -> [a0] #

null :: FreeF f a a0 -> Bool #

length :: FreeF f a a0 -> Int #

elem :: Eq a0 => a0 -> FreeF f a a0 -> Bool #

maximum :: Ord a0 => FreeF f a a0 -> a0 #

minimum :: Ord a0 => FreeF f a a0 -> a0 #

sum :: Num a0 => FreeF f a a0 -> a0 #

product :: Num a0 => FreeF f a a0 -> a0 #

Traversable f => Traversable (FreeF f a) Source # 
Instance details

Defined in Unfree

Methods

traverse :: Applicative f0 => (a0 -> f0 b) -> FreeF f a a0 -> f0 (FreeF f a b) #

sequenceA :: Applicative f0 => FreeF f a (f0 a0) -> f0 (FreeF f a a0) #

mapM :: Monad m => (a0 -> m b) -> FreeF f a a0 -> m (FreeF f a b) #

sequence :: Monad m => FreeF f a (m a0) -> m (FreeF f a a0) #

Functor f => Functor (FreeF f a) Source # 
Instance details

Defined in Unfree

Methods

fmap :: (a0 -> b) -> FreeF f a a0 -> FreeF f a b #

(<$) :: a0 -> FreeF f a b -> FreeF f a a0 #

Generic (FreeF f a r) Source # 
Instance details

Defined in Unfree

Associated Types

type Rep (FreeF f a r) :: Type -> Type #

Methods

from :: FreeF f a r -> Rep (FreeF f a r) x #

to :: Rep (FreeF f a r) x -> FreeF f a r #

(Show a, Show (f r)) => Show (FreeF f a r) Source # 
Instance details

Defined in Unfree

Methods

showsPrec :: Int -> FreeF f a r -> ShowS #

show :: FreeF f a r -> String #

showList :: [FreeF f a r] -> ShowS #

(NFData a, NFData (f r)) => NFData (FreeF f a r) Source # 
Instance details

Defined in Unfree

Methods

rnf :: FreeF f a r -> () #

(Eq a, Eq (f r)) => Eq (FreeF f a r) Source # 
Instance details

Defined in Unfree

Methods

(==) :: FreeF f a r -> FreeF f a r -> Bool #

(/=) :: FreeF f a r -> FreeF f a r -> Bool #

(Ord a, Ord (f r)) => Ord (FreeF f a r) Source # 
Instance details

Defined in Unfree

Methods

compare :: FreeF f a r -> FreeF f a r -> Ordering #

(<) :: FreeF f a r -> FreeF f a r -> Bool #

(<=) :: FreeF f a r -> FreeF f a r -> Bool #

(>) :: FreeF f a r -> FreeF f a r -> Bool #

(>=) :: FreeF f a r -> FreeF f a r -> Bool #

max :: FreeF f a r -> FreeF f a r -> FreeF f a r #

min :: FreeF f a r -> FreeF f a r -> FreeF f a r #

(Hashable a, Hashable (f r)) => Hashable (FreeF f a r) Source # 
Instance details

Defined in Unfree

Methods

hashWithSalt :: Int -> FreeF f a r -> Int #

hash :: FreeF f a r -> Int #

type Rep (FreeF f a r) Source # 
Instance details

Defined in Unfree

type Rep (FreeF f a r) = D1 ('MetaData "FreeF" "Unfree" "unfree-0.1.0-AGvDlvd0ig1WEVWuPmmEx" 'False) (C1 ('MetaCons "FreePureF" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 a)) :+: C1 ('MetaCons "FreeEmbedF" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (f r))))

newtype Free f a Source #

The free functor. Use patterns FreePure and FreeEmbed to match and construct.

Constructors

Free 

Fields

Instances

Instances details
Foldable f => Foldable (Free f) Source # 
Instance details

Defined in Unfree

Methods

fold :: Monoid m => Free f m -> m #

foldMap :: Monoid m => (a -> m) -> Free f a -> m #

foldMap' :: Monoid m => (a -> m) -> Free f a -> m #

foldr :: (a -> b -> b) -> b -> Free f a -> b #

foldr' :: (a -> b -> b) -> b -> Free f a -> b #

foldl :: (b -> a -> b) -> b -> Free f a -> b #

foldl' :: (b -> a -> b) -> b -> Free f a -> b #

foldr1 :: (a -> a -> a) -> Free f a -> a #

foldl1 :: (a -> a -> a) -> Free f a -> a #

toList :: Free f a -> [a] #

null :: Free f a -> Bool #

length :: Free f a -> Int #

elem :: Eq a => a -> Free f a -> Bool #

maximum :: Ord a => Free f a -> a #

minimum :: Ord a => Free f a -> a #

sum :: Num a => Free f a -> a #

product :: Num a => Free f a -> a #

Traversable f => Traversable (Free f) Source # 
Instance details

Defined in Unfree

Methods

traverse :: Applicative f0 => (a -> f0 b) -> Free f a -> f0 (Free f b) #

sequenceA :: Applicative f0 => Free f (f0 a) -> f0 (Free f a) #

mapM :: Monad m => (a -> m b) -> Free f a -> m (Free f b) #

sequence :: Monad m => Free f (m a) -> m (Free f a) #

Functor f => Applicative (Free f) Source # 
Instance details

Defined in Unfree

Methods

pure :: a -> Free f a #

(<*>) :: Free f (a -> b) -> Free f a -> Free f b #

liftA2 :: (a -> b -> c) -> Free f a -> Free f b -> Free f c #

(*>) :: Free f a -> Free f b -> Free f b #

(<*) :: Free f a -> Free f b -> Free f a #

Functor f => Functor (Free f) Source # 
Instance details

Defined in Unfree

Methods

fmap :: (a -> b) -> Free f a -> Free f b #

(<$) :: a -> Free f b -> Free f a #

Functor f => Monad (Free f) Source # 
Instance details

Defined in Unfree

Methods

(>>=) :: Free f a -> (a -> Free f b) -> Free f b #

(>>) :: Free f a -> Free f b -> Free f b #

return :: a -> Free f a #

(Show (f (Free f a)), Show a) => Show (Free f a) Source # 
Instance details

Defined in Unfree

Methods

showsPrec :: Int -> Free f a -> ShowS #

show :: Free f a -> String #

showList :: [Free f a] -> ShowS #

(NFData (f (Free f a)), NFData a) => NFData (Free f a) Source # 
Instance details

Defined in Unfree

Methods

rnf :: Free f a -> () #

(Eq (f (Free f a)), Eq a) => Eq (Free f a) Source # 
Instance details

Defined in Unfree

Methods

(==) :: Free f a -> Free f a -> Bool #

(/=) :: Free f a -> Free f a -> Bool #

(Ord (f (Free f a)), Ord a) => Ord (Free f a) Source # 
Instance details

Defined in Unfree

Methods

compare :: Free f a -> Free f a -> Ordering #

(<) :: Free f a -> Free f a -> Bool #

(<=) :: Free f a -> Free f a -> Bool #

(>) :: Free f a -> Free f a -> Bool #

(>=) :: Free f a -> Free f a -> Bool #

max :: Free f a -> Free f a -> Free f a #

min :: Free f a -> Free f a -> Free f a #

(Hashable (f (Free f a)), Hashable a) => Hashable (Free f a) Source # 
Instance details

Defined in Unfree

Methods

hashWithSalt :: Int -> Free f a -> Int #

hash :: Free f a -> Int #

Functor f => Corecursive (Free f a) Source # 
Instance details

Defined in Unfree

Methods

embed :: Base (Free f a) (Free f a) -> Free f a #

ana :: (a0 -> Base (Free f a) a0) -> a0 -> Free f a #

apo :: (a0 -> Base (Free f a) (Either (Free f a) a0)) -> a0 -> Free f a #

postpro :: Recursive (Free f a) => (forall b. Base (Free f a) b -> Base (Free f a) b) -> (a0 -> Base (Free f a) a0) -> a0 -> Free f a #

gpostpro :: (Recursive (Free f a), Monad m) => (forall b. m (Base (Free f a) b) -> Base (Free f a) (m b)) -> (forall c. Base (Free f a) c -> Base (Free f a) c) -> (a0 -> Base (Free f a) (m a0)) -> a0 -> Free f a #

Functor f => Recursive (Free f a) Source # 
Instance details

Defined in Unfree

Methods

project :: Free f a -> Base (Free f a) (Free f a) #

cata :: (Base (Free f a) a0 -> a0) -> Free f a -> a0 #

para :: (Base (Free f a) (Free f a, a0) -> a0) -> Free f a -> a0 #

gpara :: (Corecursive (Free f a), Comonad w) => (forall b. Base (Free f a) (w b) -> w (Base (Free f a) b)) -> (Base (Free f a) (EnvT (Free f a) w a0) -> a0) -> Free f a -> a0 #

prepro :: Corecursive (Free f a) => (forall b. Base (Free f a) b -> Base (Free f a) b) -> (Base (Free f a) a0 -> a0) -> Free f a -> a0 #

gprepro :: (Corecursive (Free f a), Comonad w) => (forall b. Base (Free f a) (w b) -> w (Base (Free f a) b)) -> (forall c. Base (Free f a) c -> Base (Free f a) c) -> (Base (Free f a) (w a0) -> a0) -> Free f a -> a0 #

type Base (Free f a) Source # 
Instance details

Defined in Unfree

type Base (Free f a) = FreeF f a

pattern FreeEmbed :: f (Free f a) -> Free f a Source #

pattern FreePure :: a -> Free f a Source #

substFree :: (Corecursive t, f ~ Base t) => (a -> t) -> Free f a -> t Source #

Fills all the holes in the free functor

liftFree :: Functor f => f a -> Free f a Source #

A version of lift that can be used with just a Functor for f

iterFree :: Functor f => (f a -> a) -> Free f a -> a Source #

Tear down a free monad using iteration

iterFreeM :: (Functor f, Monad m) => (f (m a) -> m a) -> Free f a -> m a Source #

Like iterFree for monadic values

newtype FreeT f m a Source #

Constructors

FreeT 

Fields

Instances

Instances details
(Foldable f, Foldable m) => Foldable (FreeT f m) Source # 
Instance details

Defined in Unfree

Methods

fold :: Monoid m0 => FreeT f m m0 -> m0 #

foldMap :: Monoid m0 => (a -> m0) -> FreeT f m a -> m0 #

foldMap' :: Monoid m0 => (a -> m0) -> FreeT f m a -> m0 #

foldr :: (a -> b -> b) -> b -> FreeT f m a -> b #

foldr' :: (a -> b -> b) -> b -> FreeT f m a -> b #

foldl :: (b -> a -> b) -> b -> FreeT f m a -> b #

foldl' :: (b -> a -> b) -> b -> FreeT f m a -> b #

foldr1 :: (a -> a -> a) -> FreeT f m a -> a #

foldl1 :: (a -> a -> a) -> FreeT f m a -> a #

toList :: FreeT f m a -> [a] #

null :: FreeT f m a -> Bool #

length :: FreeT f m a -> Int #

elem :: Eq a => a -> FreeT f m a -> Bool #

maximum :: Ord a => FreeT f m a -> a #

minimum :: Ord a => FreeT f m a -> a #

sum :: Num a => FreeT f m a -> a #

product :: Num a => FreeT f m a -> a #

(Traversable f, Traversable m) => Traversable (FreeT f m) Source # 
Instance details

Defined in Unfree

Methods

traverse :: Applicative f0 => (a -> f0 b) -> FreeT f m a -> f0 (FreeT f m b) #

sequenceA :: Applicative f0 => FreeT f m (f0 a) -> f0 (FreeT f m a) #

mapM :: Monad m0 => (a -> m0 b) -> FreeT f m a -> m0 (FreeT f m b) #

sequence :: Monad m0 => FreeT f m (m0 a) -> m0 (FreeT f m a) #

(Functor f, Monad m) => Applicative (FreeT f m) Source # 
Instance details

Defined in Unfree

Methods

pure :: a -> FreeT f m a #

(<*>) :: FreeT f m (a -> b) -> FreeT f m a -> FreeT f m b #

liftA2 :: (a -> b -> c) -> FreeT f m a -> FreeT f m b -> FreeT f m c #

(*>) :: FreeT f m a -> FreeT f m b -> FreeT f m b #

(<*) :: FreeT f m a -> FreeT f m b -> FreeT f m a #

(Functor f, Functor m) => Functor (FreeT f m) Source # 
Instance details

Defined in Unfree

Methods

fmap :: (a -> b) -> FreeT f m a -> FreeT f m b #

(<$) :: a -> FreeT f m b -> FreeT f m a #

(Functor f, Monad m) => Monad (FreeT f m) Source # 
Instance details

Defined in Unfree

Methods

(>>=) :: FreeT f m a -> (a -> FreeT f m b) -> FreeT f m b #

(>>) :: FreeT f m a -> FreeT f m b -> FreeT f m b #

return :: a -> FreeT f m a #

Show (m (FreeF f a (FreeT f m a))) => Show (FreeT f m a) Source # 
Instance details

Defined in Unfree

Methods

showsPrec :: Int -> FreeT f m a -> ShowS #

show :: FreeT f m a -> String #

showList :: [FreeT f m a] -> ShowS #

NFData (m (FreeF f a (FreeT f m a))) => NFData (FreeT f m a) Source # 
Instance details

Defined in Unfree

Methods

rnf :: FreeT f m a -> () #

Eq (m (FreeF f a (FreeT f m a))) => Eq (FreeT f m a) Source # 
Instance details

Defined in Unfree

Methods

(==) :: FreeT f m a -> FreeT f m a -> Bool #

(/=) :: FreeT f m a -> FreeT f m a -> Bool #

Ord (m (FreeF f a (FreeT f m a))) => Ord (FreeT f m a) Source # 
Instance details

Defined in Unfree

Methods

compare :: FreeT f m a -> FreeT f m a -> Ordering #

(<) :: FreeT f m a -> FreeT f m a -> Bool #

(<=) :: FreeT f m a -> FreeT f m a -> Bool #

(>) :: FreeT f m a -> FreeT f m a -> Bool #

(>=) :: FreeT f m a -> FreeT f m a -> Bool #

max :: FreeT f m a -> FreeT f m a -> FreeT f m a #

min :: FreeT f m a -> FreeT f m a -> FreeT f m a #

Hashable (m (FreeF f a (FreeT f m a))) => Hashable (FreeT f m a) Source # 
Instance details

Defined in Unfree

Methods

hashWithSalt :: Int -> FreeT f m a -> Int #

hash :: FreeT f m a -> Int #

liftFreeT :: (Functor f, Applicative m) => f a -> FreeT f m a Source #

iterFreeT :: (Functor f, Monad m) => (f (m a) -> m a) -> FreeT f m a -> m a Source #

hoistFreeT :: (Functor f, Functor m) => (forall a. m a -> n a) -> FreeT f m b -> FreeT f n b Source #

transFreeT :: (Functor g, Monad m) => (forall a. f a -> g a) -> FreeT f m b -> FreeT g m b Source #

joinFreeT :: (Monad m, Traversable f) => FreeT f m a -> m (Free f a) Source #