coreygirard/elm-zipper/1.0.0

Zipper.ListList

A library for a template type.

If you're working with Chars, check out Zipper.StringString

Definition

type alias Zipper a =
( List a, List a )

A list type that tracks a split location

= LeftIndex Int
| RightIndex Int
type Section
= Left
| Right
type alias Position =
{ first : Int
, last : Int
, split : RelativeIndex
, leftEdge : Int
, rightEdge : Int
, section : Section
}

Passed to the user-provided function by indexedMap and similar functions to specify the current element's location in various reference frames

Create

empty : Zipper a

Create an empty zipper

empty --> ( [], [] )
fromTuple : ( List a, List a ) -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    --> ( [ 3, 2, 1 ], [ 4, 5, 6 ] )
fromListAndIndex : Int -> List a -> Maybe (Zipper a)
fromZipperListElemList : ( List a, a, List a ) -> Zipper a
( [ 3, 2, 1 ], 4, [ 5, 6, 7 ] )
    |> fromZipperListElemList
    --> ( [ 3, 2, 1 ], [ 5, 6, 7 ] )
fromZipperListListList : ( List a, List a, List a ) -> Zipper a
( [ 3, 2, 1 ], [ 4, 5, 6 ], [ 7, 8, 9 ] )
    |> fromZipperListListList
    --> ( [ 3, 2, 1 ], [ 7, 8, 9 ] )

To

toTuple : Zipper a -> ( List a, List a )
( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> fromTuple
    |> toTuple
    --> ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
toList : Zipper a -> List a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> toList
    --> [ 1, 2, 3, 4, 5, 6 ]
toZipperListElemList : a -> Zipper a -> ( List a, a, List a )
fromTuple ( [ 1, 2, 3 ], [ 5, 6, 7 ] )
    |> toZipperListElemList 4
    --> ( [ 3, 2, 1 ], 4, [ 5, 6, 7 ] )
toZipperListListList : List a -> Zipper a -> ( List a, List a, List a )
fromTuple ( [ 1, 2, 3 ], [ 7, 8, 9 ] )
    |> toZipperListListList [ 4, 5, 6 ]
    --> ( [ 3, 2, 1 ], [ 4, 5, 6 ], [ 7, 8, 9 ] )

Length

length : Zipper a -> Int
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> length
    --> 6
position : Zipper a -> Int
fromTuple ( [ 1, 2, 3 ], [ 4, 5 ] )
    |> position
    --> 3

Get

getLeft : Zipper a -> List a
fromTuple ( [ 1, 2, 3 ], [ 4, 5 ] )
    |> getLeft
    --> [ 1, 2, 3 ]
getRight : Zipper a -> List a
fromTuple ( [ 1, 2, 3 ], [ 4, 5 ] )
    |> getRight
    --> [ 4, 5 ]

Set

setLeft : List a -> Zipper a -> Zipper a
fromTuple ( [ '1', '2', '3' ], [ '4', '5', '6' ] )
    |> setLeft [ 'a', 'b', 'c' ]
    --> fromTuple ( [ 'a', 'b', 'c' ], [ '4', '5', '6' ] )
setRight : List a -> Zipper a -> Zipper a
fromTuple ( [ '1', '2', '3' ], [ '4', '5', '6' ] )
    |> setRight [ 'a', 'b', 'c' ]
    --> fromTuple ( [ '1', '2', '3' ], [ 'a', 'b', 'c' ] )

Map

map : (a -> b) -> Zipper a -> Zipper b
fromTuple ( [ 1, 2, 3 ], [ 4, 5 ] )
    |> map String.fromInt
    --> fromTuple ( [ "1", "2", "3" ], [ "4", "5" ] )
indexedMap : (Position -> a -> b) -> Zipper a -> Zipper b
fromTuple ( [ 0, 0 ], [ 0, 0, 0, 0 ] )
    |> indexedMap (\{first} _ -> first)
    --> fromTuple ( [ 0, 1 ], [ 2, 3, 4, 5 ] )


fromTuple ( [ 0, 0 ], [ 0, 0, 0, 0 ] )
    |> indexedMap (\{last} _ -> last)
    --> fromTuple ( [ 5, 4 ], [ 3, 2, 1, 0 ] )


fromTuple ( [ 0, 0 ], [ 0, 0, 0, 0 ] )
    |> indexedMap (\{leftEdge} _ -> leftEdge)
    --> fromTuple ( [ 0, 1 ], [ 0, 1, 2, 3 ] )


fromTuple ( [ 0, 0 ], [ 0, 0, 0, 0 ] )
    |> indexedMap (\{rightEdge} _ -> rightEdge)
    --> fromTuple ( [ 1, 0 ], [ 3, 2, 1, 0 ] )

Update

update : (List a -> List b) -> Zipper a -> Zipper b
fromTuple ( [ "a", "b", "c" ], [ "d", "e", "f" ] )
    |> update (String.join "" >> List.repeat 2 >> List.indexedMap Tuple.pair)
    --> fromTuple ( [ ( 0, "abc" ), ( 1, "abc" ) ], [ ( 0, "def" ), ( 1, "def" ) ] )

Filter

filter : (a -> Bool) -> Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3, 4 ], [ 1, 2, 3, 4 ] )
    |> filter (\n -> modBy 2 n == 0)
    --> fromTuple ( [ 2, 4 ], [ 2, 4 ] )
indexedFilter : (Position -> a -> Bool) -> Zipper a -> Zipper a
fromTuple ( [ 1, 0 ], [ 4, 2, 1, 7, 8 ] )
    |> indexedFilter (\{first} val -> val > first)
    --> fromTuple ( [ 1 ], [ 4, 7, 8 ] )

Move

moveLeft : Zipper a -> Maybe (Zipper a)
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> moveLeft
    --> Just (fromTuple ( [ 1, 2 ], [ 3, 4, 5, 6 ] ))


fromTuple ( [], [ 4, 5, 6 ] )
    |> moveLeft
    --> Nothing
tryMoveLeft : Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> tryMoveLeft
    --> fromTuple ( [ 1, 2 ], [ 3, 4, 5, 6 ] )


fromTuple ( [], [ 4, 5, 6 ] )
    |> tryMoveLeft
    --> fromTuple ( [], [ 4, 5, 6 ] )
moveRight : Zipper a -> Maybe (Zipper a)
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> moveRight
    --> Just (fromTuple ( [ 1, 2, 3, 4 ], [ 5, 6 ] ))


fromTuple ( [ 1, 2, 3 ], [] )
    |> moveRight
    --> Nothing
tryMoveRight : Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> tryMoveRight
    --> fromTuple ( [ 1, 2, 3, 4 ], [ 5, 6 ] )


fromTuple ( [ 1, 2, 3 ], [] )
    |> tryMoveRight
    --> fromTuple ( [ 1, 2, 3 ], [] )
moveToFirst : Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> moveToFirst
    --> fromTuple ( [], [ 1, 2, 3, 4, 5, 6 ] )
moveToLast : Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> moveToLast
    --> fromTuple ( [ 1, 2, 3, 4, 5, 6 ], [] )

Insert

insertFirst : a -> Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> insertFirst 0
    --> fromTuple ( [ 0, 1, 2, 3 ], [ 4, 5, 6 ] )
insertLast : a -> Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> insertLast 0
    --> fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6, 0 ] )
insertLeftOfSplit : a -> Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> insertLeftOfSplit 0
    --> fromTuple ( [ 1, 2, 3, 0 ], [ 4, 5, 6 ] )
insertRightOfSplit : a -> Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> insertRightOfSplit 0
    --> fromTuple ( [ 1, 2, 3 ], [ 0, 4, 5, 6 ] )

Sort

sortKeepIndex : Zipper comparable -> Zipper comparable
fromTuple ( [ 1, 4, 2 ], [ 2, 3 ] )
    |> sortKeepIndex
    --> fromTuple ( [ 1, 2, 2 ], [ 3, 4 ] )

Reverse

reverse : Zipper a -> Zipper a
fromTuple ( [ 1, 2, 3 ], [ 4, 5, 6 ] )
    |> reverse
    --> fromTuple ( [ 6, 5, 4 ], [ 3, 2, 1 ] )

Swap

Indexes

calcIndex : Zipper a -> Int -> Maybe Position
Zipper a
-> { left : List Position
, right : List Position
}
zipper : Zipper Int
zipper = ( [ 0, 0, 0 ], [ 0, 0, 0 ] )


indexRelativeToAbsolute zipper (LeftIndex 3) --> -1


indexRelativeToAbsolute zipper (LeftIndex 2) --> 0


indexRelativeToAbsolute zipper (LeftIndex 0) --> 2


indexRelativeToAbsolute zipper (RightIndex 0) --> 3


indexRelativeToAbsolute zipper (RightIndex 2) --> 5


indexRelativeToAbsolute zipper (RightIndex 3) --> 6