Advertisement
Guest User

Untitled

a guest
Apr 29th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. import Html exposing (..)
  2. import Debug
  3.  
  4. main = text <| toString newTree
  5.  
  6. newTree = (freeTree, []) |> goLeft |> goRight |> modify (\_ -> 'P') |>
  7. attach (Node 'Z' Empty Empty) |> goUp |> modify (\_ -> 'X') |> topMost
  8.  
  9. type Tree a = Empty | Node a (Tree a) (Tree a)
  10.  
  11. freeTree : Tree Char
  12. freeTree =
  13. Node 'P'
  14. (Node 'O'
  15. (Node 'L'
  16. (Node 'N' Empty Empty)
  17. (Node 'T' Empty Empty)
  18. )
  19. (Node 'Y'
  20. (Node 'S' Empty Empty)
  21. (Node 'A' Empty Empty)
  22. )
  23. )
  24. (Node 'L'
  25. (Node 'W'
  26. (Node 'C' Empty Empty)
  27. (Node 'R' Empty Empty)
  28. )
  29. (Node 'A'
  30. (Node 'A' Empty Empty)
  31. (Node 'C' Empty Empty)
  32. )
  33. )
  34.  
  35. type Direction = L | R
  36. type alias Directions = List Direction
  37.  
  38. changeToP : Directions -> Tree Char -> Tree Char
  39. changeToP dir tree =
  40. case (dir, tree) of
  41. ( L::ds, Node x l r ) -> Node x (changeToP ds l) r
  42. ( R::ds, Node x l r ) -> Node x l (changeToP ds r)
  43. ( [], Node _ l r ) -> Node 'P' l r
  44. _ -> Debug.crash "Can't change to P!"
  45.  
  46. elemAt : Directions -> Tree a -> Maybe a
  47. elemAt dir tree =
  48. case (dir, tree) of
  49. ( L::ds, Node _ l _ ) -> elemAt ds l
  50. ( R::ds, Node _ _ r ) -> elemAt ds r
  51. ( [] , Node x _ _ ) -> Just x
  52. _ -> Nothing
  53.  
  54.  
  55. type Crumb a = LeftCrumb a (Tree a)
  56. | RightCrumb a (Tree a)
  57.  
  58. type alias Breadcrumbs a = List (Crumb a)
  59.  
  60. type alias Zipper a = (Tree a, Breadcrumbs a)
  61.  
  62. goLeft : Zipper a -> Zipper a
  63. goLeft (tree, bs) =
  64. case (tree, bs) of
  65. ( Node x l r, bs) -> ( l, LeftCrumb x r::bs )
  66. _ -> Debug.crash "Doesn't exist Left"
  67.  
  68. goRight : Zipper a -> Zipper a
  69. goRight (tree, bs) =
  70. case (tree, bs) of
  71. ( Node x l r, bs) -> ( r, RightCrumb x l::bs )
  72. _ -> Debug.crash "Doesn't exist Right"
  73.  
  74. goUp : Zipper a -> Zipper a
  75. goUp (tree, bs) =
  76. case (tree, bs) of
  77. (t, LeftCrumb x r::bs) -> (Node x t r, bs)
  78. (t, RightCrumb x l::bs) -> (Node x l t, bs)
  79. _ -> Debug.crash "Doesn't exist Up"
  80.  
  81. modify : (a -> a) -> Zipper a -> Zipper a
  82. modify f (tree, bs) =
  83. case (tree, bs) of
  84. (Node x l r, bs) -> (Node (f x) l r, bs)
  85. (Empty, bs) -> (Empty, bs)
  86.  
  87. attach : Tree a -> Zipper a -> Zipper a
  88. attach t (_, bs) = (t, bs)
  89.  
  90. topMost : Zipper a -> Zipper a
  91. topMost ((tree, bs) as z) =
  92. case z of
  93. (t, []) -> (t, [])
  94. z -> topMost (goUp z)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement