diff --git a/Plutarch/CPS/Optics/Fix.hs b/Plutarch/CPS/Optics/Fix.hs new file mode 100644 index 0000000..88035ba --- /dev/null +++ b/Plutarch/CPS/Optics/Fix.hs @@ -0,0 +1,27 @@ +{-# LANGUAGE PartialTypeSignatures #-} +module Plutarch.CPS.Optics.Fix(fixt) where + +import Data.Fix +import Control.Lens + +import Data.Functor.Base +import Data.Function + +fixt :: + (Applicative f) => + (forall ra rb. (ra -> f rb) -> a ra -> f (b rb)) -> + Fix a -> + f (Fix b) +fixt f = fmap Fix . (fix (f . dimap unFix (fmap Fix))) . unFix + +list' :: Traversal (Fix (ListF a)) (Fix (ListF b)) a b +list' f = fixt (listf f) + +listf :: + (Applicative f) => + (a -> f b) -> + (ra -> f rb) -> + ListF a ra -> + f (ListF b rb) +listf _ _ Nil = pure Nil +listf f r (Cons a b) = Cons <$> f a <*> r b diff --git a/plutarch-core.cabal b/plutarch-core.cabal index 1723029..3791514 100644 --- a/plutarch-core.cabal +++ b/plutarch-core.cabal @@ -97,6 +97,7 @@ library exposed-modules: Plutarch.Core + Plutarch.CPS.Optics.Fix Plutarch.CPS.Optics.Iso Plutarch.CPS.Optics.Lens Plutarch.CPS.Optics.Optic @@ -116,5 +117,8 @@ library build-depends: , base + , data-fix , generics-sop + , lens , mtl + , recursion-schemes