From 1231ca4a5bafe5742cb778927c1611082f4cf964 Mon Sep 17 00:00:00 2001 From: Ari Fordsham Date: Wed, 31 Aug 2022 17:52:21 +0300 Subject: [PATCH] Prototype Haskell Fix Traversal combinator --- Plutarch/CPS/Optics/Fix.hs | 27 +++++++++++++++++++++++++++ plutarch-core.cabal | 4 ++++ 2 files changed, 31 insertions(+) create mode 100644 Plutarch/CPS/Optics/Fix.hs 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