binder 0.2.1 → 0.3
raw patch · 3 files changed
+23/−5 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Binder: copyVar :: MonadNumbering m => Var m b -> (Var m a -> m a) -> m (Var m a)
+ Data.Binder: copyVarList :: MonadNumbering m => VarList m b -> (Var m a -> m a) -> m (VarList m a)
- Data.Binder: binder'Body :: forall a_a8HJ m_a8HK b_a8HL b_a9tQ. Lens (Binder a_a8HJ m_a8HK b_a8HL) (Binder a_a8HJ m_a8HK b_a9tQ) (a_a8HJ -> m_a8HK b_a8HL) (a_a8HJ -> m_a8HK b_a9tQ)
+ Data.Binder: binder'Body :: forall a_a8HL m_a8HM b_a8HN b_a9vI. Lens (Binder a_a8HL m_a8HM b_a8HN) (Binder a_a8HL m_a8HM b_a9vI) (a_a8HL -> m_a8HM b_a8HN) (a_a8HL -> m_a8HM b_a9vI)
- Data.Binder: binder'Name :: forall a_a8HJ m_a8HK b_a8HL. Lens' (Binder a_a8HJ m_a8HK b_a8HL) Text
+ Data.Binder: binder'Name :: forall a_a8HL m_a8HM b_a8HN. Lens' (Binder a_a8HL m_a8HM b_a8HN) Text
- Data.Binder: binder'mkFree :: forall a_a8HJ m_a8HK b_a8HL. Lens' (Binder a_a8HJ m_a8HK b_a8HL) (Var m_a8HK a_a8HJ -> m_a8HK a_a8HJ)
+ Data.Binder: binder'mkFree :: forall a_a8HL m_a8HM b_a8HN. Lens' (Binder a_a8HL m_a8HM b_a8HN) (Var m_a8HM a_a8HL -> m_a8HM a_a8HL)
- Data.Binder: binderList'Body :: forall a_a9ut m_a9uu b_a9uv b_a9RA. Lens (BinderList a_a9ut m_a9uu b_a9uv) (BinderList a_a9ut m_a9uu b_a9RA) ([a_a9ut] -> m_a9uu b_a9uv) ([a_a9ut] -> m_a9uu b_a9RA)
+ Data.Binder: binderList'Body :: forall a_a9wm m_a9wn b_a9wo b_a9Uq. Lens (BinderList a_a9wm m_a9wn b_a9wo) (BinderList a_a9wm m_a9wn b_a9Uq) ([a_a9wm] -> m_a9wn b_a9wo) ([a_a9wm] -> m_a9wn b_a9Uq)
- Data.Binder: binderList'Names :: forall a_a9ut m_a9uu b_a9uv. Lens' (BinderList a_a9ut m_a9uu b_a9uv) [Text]
+ Data.Binder: binderList'Names :: forall a_a9wm m_a9wn b_a9wo. Lens' (BinderList a_a9wm m_a9wn b_a9wo) [Text]
- Data.Binder: binderList'mkFree :: forall a_a9ut m_a9uu b_a9uv. Lens' (BinderList a_a9ut m_a9uu b_a9uv) (Var m_a9uu a_a9ut -> m_a9uu a_a9ut)
+ Data.Binder: binderList'mkFree :: forall a_a9wm m_a9wn b_a9wo. Lens' (BinderList a_a9wm m_a9wn b_a9wo) (Var m_a9wn a_a9wm -> m_a9wn a_a9wm)
- Data.Binder: newVar :: forall m a. MonadNumbering m => Text -> (Var m a -> m a) -> m (Var m a)
+ Data.Binder: newVar :: MonadNumbering m => Text -> (Var m a -> m a) -> m (Var m a)
Files
- CHANGELOG.md +5/−0
- binder.cabal +2/−2
- src/Data/Binder.hs +16/−3
CHANGELOG.md view
@@ -2,6 +2,11 @@ ## version 0 +### 0.3 -- 2023-10-09++* Add new functions `copyVar` and `copyVarList`.+* `newVarList`: Refactoring.+ ### 0.2.1 -- 2023-10-09 * Expose the functions `unbind2` and `unbind2List`.
binder.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: binder-version: 0.2.1+version: 0.3 synopsis: Variable binding for abstract syntax tree description: binder is purely functional implementation of Ocaml's@@ -29,7 +29,7 @@ source-repository this type: git location: https://github.com/ijaketak/binder- tag: v0.2.1+ tag: v0.3 common depends build-depends:
src/Data/Binder.hs view
@@ -32,6 +32,7 @@ , nameOf , boxVar , newVar+ , copyVar , isClosed , occur -- ** Box@@ -69,6 +70,7 @@ , namesOf , boxVarList , newVarList+ , copyVarList -- * Binder for list , BinderList , binderList'Names@@ -164,16 +166,24 @@ boxVar x = x ^. var'Box -- | Create a new variable with given name.-newVar :: forall m a. MonadNumbering m => Text -> (Var m a -> m a) -> m (Var m a)+newVar :: MonadNumbering m => Text -> (Var m a -> m a) -> m (Var m a) newVar name mkFree = do i <- numbering+ buildVar i name mkFree++copyVar :: MonadNumbering m => Var m b -> (Var m a -> m a) -> m (Var m a)+copyVar x mkFree = buildVar (x ^. var'Key) (x ^. var'Name) mkFree++buildVar :: MonadNumbering m => Numbering m -> Text -> (Var m a -> m a)+ -> m (Var m a)+buildVar i name mkFree = let x = let b = Box'Env (M.singleton i $ AnyVar x) (Closure $ \env -> let f (AnyOne y) = pure $ unsafeCoerce y in f $ fromJust $ M.lookup i env) in Var i $ VarBody name mkFree b- return x+ in return x -- | 'Box' is closed if it exposes no free variables.@@ -317,7 +327,10 @@ -- | Create new variables with given names. newVarList :: MonadNumbering m => [Text] -> (Var m a -> m a) -> m (VarList m a)-newVarList names mkFree = sequence $ flip fmap names $ \name -> newVar name mkFree+newVarList names mkFree = flip traverse names $ flip newVar mkFree++copyVarList :: MonadNumbering m => VarList m b -> (Var m a -> m a) -> m (VarList m a)+copyVarList xs mkFree = flip traverse xs $ flip copyVar mkFree -- | Essentially, @BinderList a m b@ means @[a] -> m b@.