Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

zippers: mapping over last breadcrumb

I've bumped into an issue using zippers and lens. Consider following example:

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
import Control.Lens
import Control.Zipper

data A = AA { _aa :: A }
       | AB { _ab :: B }
       deriving (Show)

data B = B deriving (Show)

makeLenses ''A
makeLenses ''B

main :: IO ()
main = do
    let a = AA $ AB $ B

        z :: Top :>> A
        z = zipper a

        zAA :: Maybe (Top :>> A :>> A)
        zAA = z & within aa

        zAB :: Maybe (Top :>> A :>> B)
        zAB = z & within (aa . ab)
    return ()

As you can see, I can move from Top :>> A either to Top :>> A :>> A and Top :>> A :>> B.

Having ab lens, how can I move from Top :>> A :>> A (zAA) to Top :>> A :>> B (zAB), without using upward - just mapping with lens over last breadcrumb?

like image 956
remdezx Avatar asked Jan 08 '15 16:01

remdezx


1 Answers

Basically, you can't.

To change the type of the current focus you'd need to move upwards. The type you'll be 'sealing up with' has already been committed to inside the zipper. It contains the second half of the traversal or lens that got you to this point already. You've opened the lens or traversal already and 'upwards' seals off the changes by writing them back into the surrounding context.

like image 167
Edward Kmett Avatar answered Nov 06 '22 02:11

Edward Kmett