From 4de2ba2590490f38fbfba6515edad6c1b0072042 Mon Sep 17 00:00:00 2001 From: Bob Whitelock Date: Tue, 14 Nov 2017 22:13:24 +0000 Subject: [PATCH 1/3] Let latest elm-format do its thing --- src/SelectList.elm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SelectList.elm b/src/SelectList.elm index 8eada0e..9aa581c 100644 --- a/src/SelectList.elm +++ b/src/SelectList.elm @@ -1,18 +1,18 @@ module SelectList exposing - ( SelectList + ( Position(..) + , SelectList + , after + , append + , before + , fromLists , map , mapBy - , Position(..) - , fromLists - , select , prepend - , append - , before - , after + , select , selected - , toList , singleton + , toList ) {-| A `SelectList` is a nonempty list which always has exactly one element selected. @@ -217,7 +217,7 @@ selectHelp isSelectable beforeList selectedElem afterList = ( first :: rest, _ ) -> if isSelectable first then - Just ( [], first, (rest ++ selectedElem :: afterList) ) + Just ( [], first, rest ++ selectedElem :: afterList ) else case selectHelp isSelectable rest selectedElem afterList of Nothing -> From af0cf89504908ac1c147bf791f328f9da6edb716 Mon Sep 17 00:00:00 2001 From: Bob Whitelock Date: Tue, 14 Nov 2017 22:28:21 +0000 Subject: [PATCH 2/3] Add `fromList` --- src/SelectList.elm | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/SelectList.elm b/src/SelectList.elm index 9aa581c..f24fa0f 100644 --- a/src/SelectList.elm +++ b/src/SelectList.elm @@ -5,6 +5,7 @@ module SelectList , after , append , before + , fromList , fromLists , map , mapBy @@ -19,7 +20,7 @@ module SelectList It is an example of a list [zipper](https://en.wikipedia.org/wiki/Zipper_(data_structure)). -@docs SelectList, fromLists, singleton +@docs SelectList, fromLists, fromList, singleton ## Reading @@ -171,6 +172,22 @@ fromLists = SelectList +{-| -} +fromList : List a -> Maybe (SelectList a) +fromList list = + let + ( maybeHead, maybeTail ) = + ( List.head list, List.tail list ) + in + Maybe.map2 + (\head -> + \tail -> + fromLists [] head tail + ) + maybeHead + maybeTail + + {-| Change the selected element to the first one which passes a predicate function. If no elements pass, the `SelectList` is unchanged. From bdd803aa53fdbe542068e64a0de07ca5dd479832 Mon Sep 17 00:00:00 2001 From: Bob Whitelock Date: Tue, 14 Nov 2017 22:33:09 +0000 Subject: [PATCH 3/3] Add `decoder` --- src/SelectList.elm | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/SelectList.elm b/src/SelectList.elm index f24fa0f..b022867 100644 --- a/src/SelectList.elm +++ b/src/SelectList.elm @@ -5,6 +5,7 @@ module SelectList , after , append , before + , decoder , fromList , fromLists , map @@ -32,8 +33,15 @@ It is an example of a list [zipper](https://en.wikipedia.org/wiki/Zipper_(data_s @docs map, mapBy, Position, select, append, prepend + +## Decoding + +@docs decoder + -} +import Json.Decode + {-| A nonempty list which always has exactly one element selected. @@ -287,3 +295,20 @@ prepend list (SelectList beforeSel sel afterSel) = toList : SelectList a -> List a toList (SelectList beforeSel sel afterSel) = beforeSel ++ sel :: afterSel + + +{-| -} +decoder : Json.Decode.Decoder a -> Json.Decode.Decoder (SelectList a) +decoder itemDecoder = + let + createSelectList = + \list -> + case fromList list of + Just selectList -> + Json.Decode.succeed selectList + + Nothing -> + Json.Decode.fail "expected list with more than one element" + in + Json.Decode.list itemDecoder + |> Json.Decode.andThen createSelectList