{-# language FunctionalDependencies #-}
{-# language TemplateHaskell #-}
{-# options_ghc -Wno-missing-signatures #-}
module Nix.Unused
where
import Nix.Prelude
import Control.Monad.Free ( Free(..) )
import Data.Fix ( Fix(..) )
import Lens.Family2.TH ( makeLensesBy )
type AlgM f m a = f a -> m a
whenFree :: (Monoid b)
=> (f (Free f a) -> b) -> Free f a -> b
whenFree :: forall b (f :: * -> *) a.
Monoid b =>
(f (Free f a) -> b) -> Free f a -> b
whenFree =
forall a b (f :: * -> *).
(a -> b) -> (f (Free f a) -> b) -> Free f a -> b
free
forall a. Monoid a => a
mempty
{-# inline whenFree #-}
whenPure :: (Monoid b)
=> (a -> b) -> Free f a -> b
whenPure :: forall b a (f :: * -> *). Monoid b => (a -> b) -> Free f a -> b
whenPure a -> b
f =
forall a b (f :: * -> *).
(a -> b) -> (f (Free f a) -> b) -> Free f a -> b
free
a -> b
f
forall a. Monoid a => a
mempty
{-# inline whenPure #-}
freeToFix :: Functor f => (a -> Fix f) -> Free f a -> Fix f
freeToFix :: forall (f :: * -> *) a.
Functor f =>
(a -> Fix f) -> Free f a -> Fix f
freeToFix a -> Fix f
f = Free f a -> Fix f
go
where
go :: Free f a -> Fix f
go =
forall a b (f :: * -> *).
(a -> b) -> (f (Free f a) -> b) -> Free f a -> b
free
a -> Fix f
f
forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). f (Fix f) -> Fix f
Fix forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Free f a -> Fix f
go forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>)
fixToFree :: Functor f => Fix f -> Free f a
fixToFree :: forall (f :: * -> *) a. Functor f => Fix f -> Free f a
fixToFree = forall (f :: * -> *) a. f (Free f a) -> Free f a
Free forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {f :: * -> *} {a}. Functor f => Fix f -> f (Free f a)
go
where
go :: Fix f -> f (Free f a)
go (Fix f (Fix f)
f) = forall (f :: * -> *) a. f (Free f a) -> Free f a
Free forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fix f -> f (Free f a)
go forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (Fix f)
f
loeb :: Functor f => f (f a -> a) -> f a
loeb :: forall (f :: * -> *) a. Functor f => f (f a -> a) -> f a
loeb f (f a -> a)
x = f a
go
where
go :: f a
go = (forall a b. (a -> b) -> a -> b
$ f a
go) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (f a -> a)
x
adiM
:: ( Traversable t
, Monad m
)
=> Transform t (m a)
-> AlgM t m a
-> Fix t
-> m a
adiM :: forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
Transform t (m a) -> AlgM t m a -> Fix t -> m a
adiM Transform t (m a)
g AlgM t m a
f = Transform t (m a)
g forall a b. (a -> b) -> a -> b
$ AlgM t m a
f forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
Transform t (m a) -> AlgM t m a -> Fix t -> m a
adiM Transform t (m a)
g AlgM t m a
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *). Fix f -> f (Fix f)
unFix
para :: Functor f => (f (Fix f, a) -> a) -> Fix f -> a
para :: forall (f :: * -> *) a.
Functor f =>
(f (Fix f, a) -> a) -> Fix f -> a
para f (Fix f, a) -> a
f = f (Fix f, a) -> 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 a. a -> a
id forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& forall (f :: * -> *) a.
Functor f =>
(f (Fix f, a) -> a) -> Fix f -> a
para f (Fix f, a) -> a
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *). Fix f -> f (Fix f)
unFix
paraM :: (Traversable f, Monad m) => (f (Fix f, a) -> m a) -> Fix f -> m a
paraM :: forall (f :: * -> *) (m :: * -> *) a.
(Traversable f, Monad m) =>
(f (Fix f, a) -> m a) -> Fix f -> m a
paraM f (Fix f, a) -> m a
f = f (Fix f, a) -> m a
f forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (\Fix f
x -> (Fix f
x, ) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) (m :: * -> *) a.
(Traversable f, Monad m) =>
(f (Fix f, a) -> m a) -> Fix f -> m a
paraM f (Fix f, a) -> m a
f Fix f
x) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *). Fix f -> f (Fix f)
unFix
cataP :: Functor f => (Fix f -> f a -> a) -> Fix f -> a
cataP :: forall (f :: * -> *) a.
Functor f =>
(Fix f -> f a -> a) -> Fix f -> a
cataP Fix f -> f a -> a
f Fix f
x = Fix f -> f a -> a
f Fix f
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a.
Functor f =>
(Fix f -> f a -> a) -> Fix f -> a
cataP Fix f -> f a -> a
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *). Fix f -> f (Fix f)
unFix forall a b. (a -> b) -> a -> b
$ Fix f
x
cataPM :: (Traversable f, Monad m) => (Fix f -> f a -> m a) -> Fix f -> m a
cataPM :: forall (f :: * -> *) (m :: * -> *) a.
(Traversable f, Monad m) =>
(Fix f -> f a -> m a) -> Fix f -> m a
cataPM Fix f -> f a -> m a
f Fix f
x = Fix f -> f a -> m a
f Fix f
x forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall (f :: * -> *) (m :: * -> *) a.
(Traversable f, Monad m) =>
(Fix f -> f a -> m a) -> Fix f -> m a
cataPM Fix f -> f a -> m a
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *). Fix f -> f (Fix f)
unFix forall a b. (a -> b) -> a -> b
$ Fix f
x
$(makeLensesBy (\n -> pure $ "_" <> n) ''Fix)