anchor.diff:  /// Moves the zipper to the left
   let left z = 
       match z.Focus with
  -    | (Branch(v, explored, other)) -> { Focus = explored; Path = (TreeDirection.Left, v, other)::z.Path }
  +    | (Branch(v, explored, other)) -> { Focus = explored; Path = (Left, v, other) :: z.Path }
       | Leaf -> failwith "can't go down on leaf"
   
   /// Moves the zipper to the right
   let right z = 
       match z.Focus with
  -    | (Branch(v, other, explored)) -> { Focus = explored; Path= (TreeDirection.Right, v, other)::z.Path }
  +    | (Branch(v, other, explored)) -> { Focus = explored; Path = (Right, v, other) :: z.Path }
       | Leaf -> failwith "can't go down on leaf"
  +
  +/// Creates a zipper from a tree
  +let zipper t = { Focus = t; Path = [] } 
  +
  +type TreeZipperDirection = Up | Left | Right 
   
   let inline getMove direction =
       match direction with
  
positive.code: [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
  module FSharpx.DataStructures.TreeZipper
  
  /// A simple binarys tree
  type 'a Tree=
     | Leaf
     | Branch of 'a * 'a Tree * 'a Tree
  
  type TreeDirection =  Left | Right
  type ZipperDirection = Up | Left | Right 
  
  /// The tree zipper datastructure
  type 'a TreeZipper  = { 
  
negative.code: /// Moves the zipper one level up
  let up z =
      match z.Path with
      | (Left,v,other)::ep ->  { Focus = Branch(v,z.Focus,other); Path = ep }
      | (Right,v,other)::ep -> { Focus = Branch(v,other,z.Focus); Path = ep }
      | [] -> failwith "can't go up" // because ep only goes down and is empty 
  
  /// Moves the zipper to the top
  