bowtie-0.7.0: Tying knots in polynomial functors
Safe HaskellNone
LanguageGHC2021

Bowtie.Memo

Synopsis

Documentation

newtype MemoF (f :: k -> Type) k1 (r :: k) Source #

The base functor for a Memo

Constructors

MemoF 

Fields

Bundled Patterns

pattern MemoFP :: forall {k1} k2 f r. k2 -> f r -> MemoF f k2 r 

Instances

Instances details
HasAttr d s k2 => HasAttr d s (MemoF f k2 x) Source # 
Instance details

Defined in Bowtie.Attr

Methods

viewAttr :: Proxy d -> Proxy s -> MemoF f k2 x -> Val d s Source #

setAttr :: Proxy d -> Proxy s -> Val d s -> MemoF f k2 x -> MemoF f k2 x Source #

WithAttr d s k2 j => WithAttr d s (MemoF f k2 x) (MemoF f j x) Source # 
Instance details

Defined in Bowtie.Attr

Methods

withAttr :: Proxy d -> Proxy s -> Val d s -> MemoF f j x -> MemoF f k2 x Source #

withoutAttr :: Proxy d -> Proxy s -> MemoF f k2 x -> MemoF f j x Source #

Foldable f => Foldable (MemoF f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

fold :: Monoid m => MemoF f k m -> m #

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

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

foldr :: (a -> b -> b) -> b -> MemoF f k a -> b #

foldr' :: (a -> b -> b) -> b -> MemoF f k a -> b #

foldl :: (b -> a -> b) -> b -> MemoF f k a -> b #

foldl' :: (b -> a -> b) -> b -> MemoF f k a -> b #

foldr1 :: (a -> a -> a) -> MemoF f k a -> a #

foldl1 :: (a -> a -> a) -> MemoF f k a -> a #

toList :: MemoF f k a -> [a] #

null :: MemoF f k a -> Bool #

length :: MemoF f k a -> Int #

elem :: Eq a => a -> MemoF f k a -> Bool #

maximum :: Ord a => MemoF f k a -> a #

minimum :: Ord a => MemoF f k a -> a #

sum :: Num a => MemoF f k a -> a #

product :: Num a => MemoF f k a -> a #

Traversable f => Traversable (MemoF f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

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

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

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

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

(Applicative f, Monoid k) => Applicative (MemoF f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

pure :: a -> MemoF f k a #

(<*>) :: MemoF f k (a -> b) -> MemoF f k a -> MemoF f k b #

liftA2 :: (a -> b -> c) -> MemoF f k a -> MemoF f k b -> MemoF f k c #

(*>) :: MemoF f k a -> MemoF f k b -> MemoF f k b #

(<*) :: MemoF f k a -> MemoF f k b -> MemoF f k a #

Functor f => Functor (MemoF f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

fmap :: (a -> b) -> MemoF f k a -> MemoF f k b #

(<$) :: a -> MemoF f k b -> MemoF f k a #

(Apply f, Semigroup k) => Apply (MemoF f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

(<.>) :: MemoF f k (a -> b) -> MemoF f k a -> MemoF f k b #

(.>) :: MemoF f k a -> MemoF f k b -> MemoF f k b #

(<.) :: MemoF f k a -> MemoF f k b -> MemoF f k a #

liftF2 :: (a -> b -> c) -> MemoF f k a -> MemoF f k b -> MemoF f k c #

(Monoid k2, IsString (f r)) => IsString (MemoF f k2 r) Source # 
Instance details

Defined in Bowtie.Memo

Methods

fromString :: String -> MemoF f k2 r #

(Show k2, Show (f r)) => Show (MemoF f k2 r) Source # 
Instance details

Defined in Bowtie.Memo

Methods

showsPrec :: Int -> MemoF f k2 r -> ShowS #

show :: MemoF f k2 r -> String #

showList :: [MemoF f k2 r] -> ShowS #

(Eq k2, Eq (f r)) => Eq (MemoF f k2 r) Source # 
Instance details

Defined in Bowtie.Memo

Methods

(==) :: MemoF f k2 r -> MemoF f k2 r -> Bool #

(/=) :: MemoF f k2 r -> MemoF f k2 r -> Bool #

(Ord k2, Ord (f r)) => Ord (MemoF f k2 r) Source # 
Instance details

Defined in Bowtie.Memo

Methods

compare :: MemoF f k2 r -> MemoF f k2 r -> Ordering #

(<) :: MemoF f k2 r -> MemoF f k2 r -> Bool #

(<=) :: MemoF f k2 r -> MemoF f k2 r -> Bool #

(>) :: MemoF f k2 r -> MemoF f k2 r -> Bool #

(>=) :: MemoF f k2 r -> MemoF f k2 r -> Bool #

max :: MemoF f k2 r -> MemoF f k2 r -> MemoF f k2 r #

min :: MemoF f k2 r -> MemoF f k2 r -> MemoF f k2 r #

Pretty (f r) => Pretty (MemoF f k2 r) Source # 
Instance details

Defined in Bowtie.Memo

Methods

pretty :: MemoF f k2 r -> Doc ann #

prettyList :: [MemoF f k2 r] -> Doc ann #

memoFKey :: forall {k1} (f :: k1 -> Type) k2 (r :: k1). MemoF f k2 r -> k2 Source #

memoFVal :: forall {k1} f k2 (r :: k1). MemoF f k2 r -> f r Source #

newtype Memo (f :: Type -> Type) k Source #

An annotated Fix

Constructors

Memo 

Fields

Bundled Patterns

pattern MemoP :: k -> f (Memo f k) -> Memo f k 

Instances

Instances details
HasAttr d s k => HasAttr d s (Memo f k) Source # 
Instance details

Defined in Bowtie.Attr

Methods

viewAttr :: Proxy d -> Proxy s -> Memo f k -> Val d s Source #

setAttr :: Proxy d -> Proxy s -> Val d s -> Memo f k -> Memo f k Source #

Foldable f => Foldable (Memo f) Source # 
Instance details

Defined in Bowtie.Memo

Methods

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

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

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

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

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

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

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

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

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

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

null :: Memo f a -> Bool #

length :: Memo f a -> Int #

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

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

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

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

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

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

Defined in Bowtie.Memo

Methods

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

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

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

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

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

Defined in Bowtie.Memo

Methods

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

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

(Monoid k, IsString (f (Memo f k))) => IsString (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

fromString :: String -> Memo f k #

(Show k, Show (f (Memo f k))) => Show (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

showsPrec :: Int -> Memo f k -> ShowS #

show :: Memo f k -> String #

showList :: [Memo f k] -> ShowS #

(Eq k, Eq (f (Memo f k))) => Eq (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

(==) :: Memo f k -> Memo f k -> Bool #

(/=) :: Memo f k -> Memo f k -> Bool #

(Ord k, Ord (f (Memo f k))) => Ord (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

compare :: Memo f k -> Memo f k -> Ordering #

(<) :: Memo f k -> Memo f k -> Bool #

(<=) :: Memo f k -> Memo f k -> Bool #

(>) :: Memo f k -> Memo f k -> Bool #

(>=) :: Memo f k -> Memo f k -> Bool #

max :: Memo f k -> Memo f k -> Memo f k #

min :: Memo f k -> Memo f k -> Memo f k #

Pretty (f (Memo f k)) => Pretty (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

pretty :: Memo f k -> Doc ann #

prettyList :: [Memo f k] -> Doc ann #

Functor f => Corecursive (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

embed :: Base (Memo f k) (Memo f k) -> Memo f k #

ana :: (a -> Base (Memo f k) a) -> a -> Memo f k #

apo :: (a -> Base (Memo f k) (Either (Memo f k) a)) -> a -> Memo f k #

postpro :: Recursive (Memo f k) => (forall b. Base (Memo f k) b -> Base (Memo f k) b) -> (a -> Base (Memo f k) a) -> a -> Memo f k #

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

Functor f => Recursive (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

Methods

project :: Memo f k -> Base (Memo f k) (Memo f k) #

cata :: (Base (Memo f k) a -> a) -> Memo f k -> a #

para :: (Base (Memo f k) (Memo f k, a) -> a) -> Memo f k -> a #

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

prepro :: Corecursive (Memo f k) => (forall b. Base (Memo f k) b -> Base (Memo f k) b) -> (Base (Memo f k) a -> a) -> Memo f k -> a #

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

type Base (Memo f k) Source # 
Instance details

Defined in Bowtie.Memo

type Base (Memo f k) = MemoF f k

mkMemo :: (Recursive t, Base t ~ f) => (f k -> k) -> t -> Memo f k Source #

Pull a recursive structure apart and retie as a Memo, using the given function to calculate a key for every level.

mkMemoM :: (Monad m, Recursive t, Base t ~ f, Traversable f) => (f k -> m k) -> t -> m (Memo f k) Source #

reMkMemo :: forall (f :: Type -> Type) j k. Functor f => (MemoF f j (Memo f k) -> k) -> Memo f j -> Memo f k Source #

Rebuild a memo with a new annotation.

reMkMemoM :: forall (f :: Type -> Type) m j k. (Traversable f, Monad m) => (MemoF f j (Memo f k) -> m k) -> Memo f j -> m (Memo f k) Source #

Rebuild a memo with a new annotation, effectfully.

unMkMemo :: forall t (f :: Type -> Type) k. (Corecursive t, Base t ~ f) => Memo f k -> t Source #

Forget keys at every level and convert back to a plain structure.

transMemo :: Functor f => (forall x. f x -> g x) -> Memo f k -> Memo g k Source #

Transform the base functor.

memoKey :: forall (f :: Type -> Type) k. Memo f k -> k Source #

memoVal :: Memo f k -> f (Memo f k) Source #

memoCata :: Functor f => (f x -> Reader k x) -> Memo f k -> x Source #

cata but nicer

memoCataM :: (Monad m, Traversable f) => (f x -> ReaderT k m x) -> Memo f k -> m x Source #

cataM but nicer

memoRight :: (f (Memo f k) -> Reader k x) -> Memo f k -> x Source #

Peek at the top value like annoRight

memoRightM :: (f (Memo f k) -> ReaderT k m x) -> Memo f k -> m x Source #

Peek at the top value like annoRightM

memoExtend :: forall (f :: Type -> Type) k x. Functor f => (Memo f k -> x) -> Memo f k -> Memo f x Source #

Re-annotate top-down

memoFix :: forall (f :: Type -> Type) k. Functor f => Memo f k -> Fix f Source #

Forget annotations (useful because the type annotation is tricky)

memoStructEq :: forall (f :: Type -> Type) k. (Functor f, Eq (f (Fix f))) => Memo f k -> Memo f k -> Bool Source #

Structural equality, ignoring annotations