[{"name":"Scroll","comment":" 📜 Items rolled up on both sides of a focus\n\n→ good fit for dynamic choice selection: tabs, playlist, timeline...\n[↑ examples](https://github.com/lue-bird/elm-scroll/tree/master/example)\n\n[`Scroll`](#Scroll) can even focus a gap\n[`Down` or `Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/)\nfrom every item\n\nNot what you were looking for? Check out [alternatives](#alternatives)\n\n@docs Scroll, FocusGap\n\n\n## position\n\n@docs Location, nearest\n\n\n## create\n\n@docs empty, one\n@docs fuzz, focusFilledFuzz\n\n\n## scan\n\n@docs focusFill, focus\n@docs side\n@docs length\n\n\n## move the focus\n\n@docs to, toGap\n@docs toEnd, toEndGap\n@docs toWhen\n@docs dragFocus\n\n\n### alter\n\n@docs mirror\n@docs focusAlter, sideAlter\n@docs map, focusSidesMap\n@docs focusFilled\n\n\n## transform\n\n@docs foldFrom, fold, foldFromOne\n@docs toStack, toList\n\n\n## type-level\n\n@docs focusGapAdapt\n\n","unions":[{"name":"FocusGap","comment":" A word in every [`Scroll`](#Scroll) type:\n\n  - `🍍 🍓 <🍊> 🍉 🍇`: `Scroll ... FocusGap Never`\n\n  - `🍍 🍓 <?> 🍉 🍇`: `Scroll ... FocusGap` [`Possibly`](https://dark.elm.dmy.fr/packages/lue-bird/elm-allowable-state/latest/Possibly)\n\n    `<?>` means both are possible:\n\n      - `🍍 🍓 <> 🍉 🍇`: a gap between items ... Heh.\n      - `🍍 🍓 <🍊> 🍉 🍇`\n\n","args":[],"cases":[["FocusGap",["Basics.Never"]]]},{"name":"Location","comment":" Position in a [`Scroll`](#Scroll) relative to its focus\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable, filled)\n    import Stack exposing (topBelow)\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.to (Scroll.AtSide Up 2)\n        |> Emptiable.map Scroll.focusFill\n    --> filled 3\n    --: Emptiable (Stacked number_) Possibly\n\n","args":[],"cases":[["AtSide",["Linear.Direction","Basics.Int"]],["AtFocus",[]]]},{"name":"Scroll","comment":" 📜 Items rolled up on both sides of a focus\n\n→ good fit for dynamic choice selection: tabs, playlist, ...\n\n`Scroll` can even focus a gap `Down` and `Up` every item:\n\n  - `🍍 🍓 <🍊> 🍉 🍇`: `Scroll ... FocusGap Never`\n\n  - `🍍 🍓 <?> 🍉 🍇`: `Scroll ... FocusGap` [`Possibly`](https://dark.elm.dmy.fr/packages/lue-bird/elm-allowable-state/latest/Possibly)\n\n    `<?>` means both are possible:\n\n      - `🍍 🍓 <> 🍉 🍇`: a gap between items ... heh\n      - `🍍 🍓 <🍊> 🍉 🍇`\n\n\n#### in arguments\n\n    empty : Scroll item_ FocusGap Possibly\n\n\n#### in types\n\n    type alias Model =\n        RecordWithoutConstructorFunction\n            { choice : Scroll Option FocusGap Never\n            }\n\n(where [`RecordWithoutConstructorFunction`](https://dark.elm.dmy.fr/packages/lue-bird/elm-no-record-type-alias-constructor-function/latest/)\nstops the compiler from creating a constructor function for `Model`)\n\n","args":["item","focusGapTag","possiblyOrNever"],"cases":[["Scroll",["{ before : Emptiable.Emptiable (Stack.Stacked item) Possibly.Possibly, focus : Emptiable.Emptiable item possiblyOrNever, after : Emptiable.Emptiable (Stack.Stacked item) Possibly.Possibly }"]]]}],"aliases":[],"values":[{"name":"dragFocus","comment":" Try to move the focus to the nearest item\n[`Down|Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/)\n\n`Down`\n\n```monospace\n🍊 🍉 <🍓> 🍇  ->  🍊 <🍓> 🍉 🍇\n🍊 🍉 <> 🍇  ->  🍊 <> 🍉 🍇\n```\n\n`Up`\n\n```monospace\n🍊 <🍓> 🍉 🍇  ->  🍊 🍉 <🍓> 🍇\n🍊 <> 🍉 🍇  ->  🍊 🍉 <> 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable)\n    import Scroll exposing (Scroll, FocusGap)\n\n    Scroll.one 0\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.dragFocus Down\n        |> Emptiable.mapFlat Scroll.toStack\n    --> topBelow 3 [ 2, 0, 1 ]\n    --: Emptiable (Stacked number_) Possibly\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.dragFocus Up\n        |> Emptiable.mapFlat Scroll.toStack\n    --> topBelow 1 [ 0, 2, 3 ]\n    --: Emptiable (Stacked number_) Possibly\n\nIf there is no nearest item, the result is\n[`empty`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable#empty)\n\n    import Linear exposing (Direction(..))\n    import Emptiable\n    import Stack exposing (topBelow)\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.dragFocus Down\n    --> Emptiable.empty\n\n    Scroll.one 0\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.dragFocus Up\n    --> Emptiable.empty\n\n","type":"Linear.Direction -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Emptiable.Emptiable (Scroll.Scroll item Scroll.FocusGap possiblyOrNever) Possibly.Possibly"},{"name":"empty","comment":" An empty `Scroll` on a gap\nwith nothing before and after it.\nIt's the loneliest of all [`Scroll`](#Scroll)s\n\n```monospace\n<>\n```\n\n    import Emptiable\n\n    Scroll.empty |> Scroll.toStack\n    --> Emptiable.empty\n\n","type":"Scroll.Scroll item_ Scroll.FocusGap Possibly.Possibly"},{"name":"focus","comment":" The focused item or gap\n\n```monospace\n🍍 🍓 <🍊> 🍉 🍇  ->  🍊\n🍍 🍓 <> 🍉 🍇  ->  _\n```\n\n    import Emptiable exposing (filled, fill)\n\n    Scroll.empty |> Scroll.focus\n    --> Emptiable.empty\n\n    Scroll.one \"hi there\" |> Scroll.focus |> fill\n    --> \"hi there\"\n\n[`focusFill`](#focusFill) is short for `focus |> fill`\n\n","type":"Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Emptiable.Emptiable item possiblyOrNever"},{"name":"focusAlter","comment":" Alter the focus\n– [item or gap](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable) –\nbased on its current value\n\n\n#### `Scroll.focusAlter (\\_ -> 🍊 |> filled)`\n\n```monospace\n🍊  ->  🍓 <?> 🍉  ->  🍓 <🍊> 🍉\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow, onTopLay)\n\n    Scroll.empty\n            -- <>\n        |> Scroll.sideAlter Down\n            (onTopLay \"🍓\")\n            -- \"🍓\" <>\n        |> Scroll.sideAlter Up\n            (onTopLay \"🍉\")\n            -- \"🍓\" <> \"🍉\"\n        |> Scroll.focusAlter (\\_ -> \"🍊\" |> filled)\n            -- \"🍓\" <\"🍊\"> \"🍉\"\n        |> Scroll.toStack\n    --> topBelow \"🍓\" [ \"🍊\", \"🍉\" ]\n\n\n#### `Scroll.focusAlter (\\_ -> Emptiable.empty)`\n\n```monospace\n🍓 <?> 🍉  ->  🍓 <> 🍉\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n\n    Scroll.one \"hello\"\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"scrollable\" [ \"world\" ])\n        |> Scroll.to (Up |> Scroll.nearest)\n        |> Emptiable.map (Scroll.focusAlter (\\_ -> Emptiable.empty))\n        |> Emptiable.map Scroll.toList\n    --> filled [ \"hello\", \"world\" ]\n\n\n#### `Scroll.focusAlter (?🍒 -> ?🍊)`\n\n```monospace\n(?🍒 -> ?🍊)  ->  🍓 <?🍒> 🍉  ->  🍓 <?🍊> 🍉\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow, onTopLay)\n\n    Scroll.empty\n            -- <>\n        |> Scroll.sideAlter Down\n            (onTopLay \"🍓\")\n            -- \"🍓\" <>\n        |> Scroll.sideAlter Up\n            (onTopLay \"🍉\")\n            -- \"🍓\" <> \"🍉\"\n        |> Scroll.focusAlter\n            (\\_ -> filled \"🍊\")\n            -- \"🍓\" <\"🍊\"> \"🍉\"\n        |> Scroll.toStack\n    --> topBelow \"🍓\" [ \"🍊\", \"🍉\" ]\n\n    Scroll.one \"first\"\n        |> Scroll.sideAlter Down\n            (\\_ -> Stack.one \"zeroth\")\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"second\" [ \"third\" ])\n        |> Scroll.focusAlter (Emptiable.map String.toUpper)\n        |> Scroll.toStack\n    --> topBelow \"zeroth\" [ \"FIRST\", \"second\", \"third\" ]\n\n","type":"(Emptiable.Emptiable item possiblyOrNever -> Emptiable.Emptiable item alteredPossiblyOrNever) -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll item Scroll.FocusGap alteredPossiblyOrNever"},{"name":"focusFill","comment":" The focused item\n\n```monospace\n🍍 🍓 <🍊> 🍉 🍇  ->  🍊\n```\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one \"hi there\" |> Scroll.focusFill\n    --> \"hi there\"\n\n    Scroll.one 1\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 3, 4 ])\n        |> Scroll.toEnd Up\n        |> Scroll.focusFill\n    --> 4\n\nShort for\n\n    import Emptiable\n\n    Scroll.focusFill =\n        Scroll.focus >> Emptiable.fill\n\n","type":"Scroll.Scroll item Scroll.FocusGap Basics.Never -> item"},{"name":"focusFilled","comment":" If the current focussed thing is a gap,\n[`Emptiable.empty`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable#empty).\nIf it's an item,\n[`Emptiable.filled`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable#filled)\n\n    import Emptiable\n    import Stack exposing (topBelow)\n    import Linear exposing (Direction(..))\n\n    Scroll.one 3\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 1 ])\n        |> Scroll.toGap Up\n        |> Scroll.focusFilled\n    --> Emptiable.empty\n\n","type":"Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Emptiable.Emptiable (Scroll.Scroll item Scroll.FocusGap never_) possiblyOrNever"},{"name":"focusFilledFuzz","comment":" `Scroll item FocusGap never_`\n[`Fuzzer`](https://dark.elm.dmy.fr/packages/elm-explorations/test/latest/Fuzz#Fuzzer)\nwith a given `item` `Fuzzer`.\n\nEach side's generated length will be <= 32, The focus is always filled\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n    import Fuzz\n\n    Scroll.focusFilledFuzz (Fuzz.intRange 0 9)\n        |> Fuzz.examples 2\n    --> [ Scroll.one 5\n    -->     |> Scroll.sideAlter Down (\\_ -> topBelow 6 [ 7, 7, 5, 4, 1, 3, 9, 4, 0, 8, 8, 8, 5, 7, 9, 9 ])\n    -->     |> Scroll.sideAlter Up (\\_ -> topBelow 5 [ 9 ])\n    --> , Scroll.one 5\n    -->     |> Scroll.sideAlter Down (\\_ -> topBelow 9 [ 9, 6, 4, 4, 9, 8, 0, 5, 1, 2, 2, 5, 9, 9, 3, 0 ])\n    -->     |> Scroll.sideAlter Up (\\_ -> topBelow 2 [ 7, 8 ])\n    --> ]\n\nTo only sometimes fuzz the focus as filled → [`fuzz`](#fuzz)\n\n","type":"Fuzz.Fuzzer item -> Fuzz.Fuzzer (Scroll.Scroll item Scroll.FocusGap never_)"},{"name":"focusGapAdapt","comment":" Change the `possiblyOrNever` type\n\n  - A `Scroll ... FocusGap possiblyOrNever`\n    can't be used as a `Scroll ... Possibly`?\n\n        import Possibly exposing (Possibly(..))\n\n        Scroll.focusGapAdapt (always Possible)\n\n  - A `Scroll ... FocusGap Never`\n    can't be unified with `Scroll ... FocusGap Possibly` or an argument variable `FocusGap possiblyOrNever`?\n\n        Scroll.focusGapAdapt never\n\nPlease read more\nat [`Emptiable.emptyAdapt`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable#emptyAdapt)\n\n","type":"(possiblyOrNever -> possiblyOrNeverAdapted) -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll item Scroll.FocusGap possiblyOrNeverAdapted"},{"name":"focusSidesMap","comment":" Change the [`focus`](#focus),\nthe [`side`](#side)s `Down` and `Up`\nusing different functions\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n\n    Scroll.one \"first\"\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one \"second\")\n        |> Scroll.toGap Up\n        |> Scroll.focusAlter (\\_ -> filled \"one-and-a-halfth\")\n        |> Scroll.focusSidesMap\n            { side =\n                \\side ->\n                    Stack.map\n                        (\\_ item ->\n                            String.concat\n                                [ side |> sideToString, \": \", item ]\n                        )\n            , focus =\n                map (\\item -> \"focused item: \" ++ item)\n            }\n        |> Scroll.toStack\n    --→\n    topBelow\n        \"before: first\"\n        [ \"focused item: one-and-a-halfth\"\n        , \"after: second\"\n        ]\n\n    sideToString =\n        \\side ->\n            case side of\n                Down ->\n                    \"before\"\n\n                Up ->\n                    \"after\"\n\n[`map`](#map) transforms every item\n\n","type":"{ focus : Emptiable.Emptiable item possiblyOrNever -> Emptiable.Emptiable mappedItem possiblyOrNeverMapped, side : Linear.Direction -> Emptiable.Emptiable (Stack.Stacked item) Possibly.Possibly -> Emptiable.Emptiable (Stack.Stacked mappedItem) possiblyOrNeverMappedBefore_ } -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll mappedItem Scroll.FocusGap possiblyOrNeverMapped"},{"name":"fold","comment":" Fold, starting from one end item as the initial accumulation value,\nreducing in a given [`Direction`](https://package.elm-lang.org/packages/lue-bird/elm-linear-direction/latest/)\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one 234\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 345 [ 543 ])\n        |> Scroll.fold Up max\n    --> 543\n\nTo accumulate into anything that doesn't have the same type as the [`Scroll`]s items,\n[`foldFromOne`](#foldFromOne)\n\n","type":"Linear.Direction -> (item -> item -> item) -> Scroll.Scroll item Scroll.FocusGap Basics.Never -> item"},{"name":"foldFrom","comment":" Reduce in a [direction](https://package.elm-lang.org/packages/lue-bird/elm-linear-direction/latest/)\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one 'i'\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 'v' [ 'e' ])\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one 'l')\n        |> Scroll.foldFrom \"\" Down String.cons\n    --> \"evil\"\n\n    Scroll.one 'v'\n        |> Scroll.sideAlter Down\n            (\\_ -> Stack.one 'e')\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow  'i' [ 'l' ])\n        |> Scroll.foldFrom \"\" Up String.cons\n    --> \"live\"\n\n    Scroll.empty\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 'v' [ 'e' ])\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow  'i' [ 'l' ])\n        |> Scroll.foldFrom \"\" Up String.cons\n    --> \"live\"\n\n","type":"accumulationValue -> Linear.Direction -> (item -> accumulationValue -> accumulationValue) -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever_ -> accumulationValue"},{"name":"foldFromOne","comment":" Fold, starting from one end item transformed to the initial accumulation value,\nreducing in a given [`Direction`](https://package.elm-lang.org/packages/lue-bird/elm-linear-direction/latest/)\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one 234\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 345 [ 543 ])\n        |> Scroll.foldFromOne Stack.one Down Stack.onTopLay\n    --> topBelow 234 [ 345, 543 ]\n\nA simpler version is\n\n    Scroll.fold =\n        Scroll.foldFromOne identity\n\n","type":"(item -> accumulated) -> Linear.Direction -> (item -> accumulated -> accumulated) -> Scroll.Scroll item Scroll.FocusGap Basics.Never -> accumulated"},{"name":"fuzz","comment":" `Scroll item FocusGap Possibly`\n[`Fuzzer`](https://dark.elm.dmy.fr/packages/elm-explorations/test/latest/Fuzz#Fuzzer)\nwith a given `item` `Fuzzer`.\n\nEach side's generated length will be <= 32, The focus is either filled or not\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n    import Fuzz\n\n    Scroll.fuzz (Fuzz.intRange 0 9) |> Fuzz.examples 2\n    --> [ Scroll.one 6\n    -->     |> Scroll.sideAlter Down (\\_ -> topBelow 0 [ 1, 6, 0, 5, 1, 7, 8, 8, 0, 5, 4, 9, 4, 9, 3, 7, 0, 3, 6, 4 ])\n    -->     |> Scroll.sideAlter Up (\\_ -> topBelow 5 [ 9 ])\n    --> , Scroll.empty\n    -->     |> Scroll.sideAlter Down (\\_ -> topBelow 3 [ 9, 7, 5, 0, 3 ])\n    -->     |> Scroll.sideAlter Up (\\_ -> topBelow 8 [ 4, 5, 6, 9, 6, 0, 6, 4, 3, 8, 0, 5, 4 ])\n    --> ]\n\nTo always fuzz the focus as filled → [`focusFilledFuzz`](#focusFilledFuzz)\n\n","type":"Fuzz.Fuzzer item -> Fuzz.Fuzzer (Scroll.Scroll item Scroll.FocusGap Possibly.Possibly)"},{"name":"length","comment":" Counting all contained items\n\n    import Stack exposing (topBelow)\n    import Linear exposing (Direction(..))\n\n    Scroll.one 0\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow -1 [ -2 ])\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.length\n    --> 6\n\n    Scroll.empty\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow -1 [ -2 ])\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.length\n    --> 5\n\n`O(n)` like [`Scroll.length`](Scroll#length)\n\n","type":"Scroll.Scroll item_ Scroll.FocusGap possiblyOrNever_ -> Basics.Int"},{"name":"map","comment":" Change every item based on its current value\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one \"first\"\n        |> Scroll.sideAlter Down\n            (\\_ -> Stack.one \"zeroth\")\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"second\" [ \"third\" ])\n        |> Scroll.map (\\_ -> String.toUpper)\n        |> Scroll.toStack\n    --> topBelow \"ZEROTH\" [ \"FIRST\", \"SECOND\", \"THIRD\" ]\n\n[`focusSidesMap`](#focusSidesMap) allows changing the individual parts separately\n\n","type":"(Scroll.Location -> item -> mappedItem) -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll mappedItem Scroll.FocusGap possiblyOrNever"},{"name":"mirror","comment":" Swap the [stack](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack)\non the [`side Down`](#side) the [`focus`](#focus)\nwith the [stack](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack)\non the [`side Up`](#side)\n\n```monospace\n🍓 <🍊> 🍉 🍇  <->  🍇 🍉 <🍊> 🍓\n```\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one 1\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 3, 4 ])\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 4 [ 3, 2 ])\n        |> Scroll.mirror\n    --> Scroll.one 1\n    -->     |> Scroll.sideAlter Down\n    -->         (\\_ -> topBelow 2 [ 3, 4 ])\n    -->     |> Scroll.sideAlter Up\n    -->         (\\_ -> topBelow 4 [ 3, 2 ])\n\nIn contrast to `List` or [stack](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack),\nruntime is `O(1)`\n\n","type":"Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever"},{"name":"nearest","comment":" The [`Location`](#Location) directly\n[`Down`|`Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/) the focus\n\n    import Emptiable exposing (Emptiable, filled)\n    import Stack exposing (onTopLay, topBelow)\n    import Scroll exposing (Scroll, FocusGap)\n    import Linear exposing (Direction(..))\n\n    Scroll.one \"hello\"\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"scrollable\" [ \"world\" ])\n        |> Scroll.toEnd Up\n        |> Scroll.to (Down |> Scroll.nearest)\n        |> Emptiable.map Scroll.focusFill\n    --> filled \"scrollable\"\n    --: Emptiable (Scroll String FocusGap Never) Possibly\n\n    Scroll.empty\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow \"world\" [ \"scrollable\" ])\n        |> Scroll.to (Down |> Scroll.nearest)\n    --> Scroll.one \"world\"\n    -->     |> Scroll.sideAlter Down\n    -->         (\\_ -> Stack.one \"scrollable\")\n    -->     |> filled\n    --: Emptiable (Scroll String FocusGap Never) Possibly\n\n    Scroll.empty\n        |> Scroll.sideAlter Up\n            (onTopLay \"foo\")\n        |> Scroll.to (Up |> Scroll.nearest)\n    --> filled (Scroll.one \"foo\")\n    --: Emptiable (Scroll String FocusGap Never) Possibly\n\n    nearest =\n        \\side ->\n            Scroll.AtSide side 0\n\n","type":"Linear.Direction -> Scroll.Location"},{"name":"one","comment":" A `Scroll` with a single focussed item in it,\nnothing `Down` and `Up` it\n\n```monospace\n🍊  ->  <🍊>\n```\n\n    import Stack\n\n    Scroll.one \"wat\" |> Scroll.focusFill\n    --> \"wat\"\n\n    Scroll.one \"wat\" |> Scroll.toStack\n    --> Stack.one \"wat\"\n\n","type":"element -> Scroll.Scroll element Scroll.FocusGap never_"},{"name":"side","comment":" The [stack](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack)\nto one [side](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/)\nof the focus\n\n`Down`\n\n```monospace\n🍍←🍓) <🍊> 🍉 🍇\n```\n\n`Up`\n\n```monospace\n🍍 🍓 <🍊> (🍉→🍇\n```\n\n    import Emptiable exposing (Emptiable)\n    import Stack exposing (Stacked, topBelow)\n    import Linear exposing (Direction(..))\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.to (Up |> Scroll.nearest)\n        |> Emptiable.mapFlat (Scroll.to (Up |> Scroll.nearest))\n        |> Emptiable.mapFlat (Scroll.side Down)\n    --> topBelow 1 [ 0 ]\n    --: Emptiable (Stacked number_) Possibly\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.to (Up |> Scroll.nearest)\n        |> Emptiable.mapFlat (Scroll.side Up)\n    --> topBelow 2 [ 3 ]\n    --: Emptiable (Stacked number_) Possibly\n\n","type":"Linear.Direction -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever_ -> Emptiable.Emptiable (Stack.Stacked item) Possibly.Possibly"},{"name":"sideAlter","comment":" Look [`Down|Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/)\nthe [`focus`](#focus) and operate directly\nan the [stack](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack)\nyou see\n\n\n#### `sideAlter Linear.Direction (\\_ -> 🍒🍋)`\n\n`Down`\n\n```monospace\n🍓 <🍊> 🍉\n      ↓\n🍋 🍒 <🍊> 🍉\n```\n\n`Up`\n\n```monospace\n🍍 🍓 <🍊> 🍉\n      ↓\n🍍 🍓 <🍊> 🍒 🍋\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable\n    import Stack exposing (topBelow)\n\n    Scroll.one \"selectoo\"\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow \"earlee\" [ \"agua\", \"enutai\" ])\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"orangloo\" [ \"iquipy\", \"oice\" ])\n        |> Scroll.sideAlter Up\n            (\\_ -> Emptiable.empty)\n        |> Scroll.toStack\n    --> topBelow \"enutai\" [ \"agua\", \"earlee\", \"selectoo\" ]\n\n\n#### `sideAlter Linear.Direction (Stack.map ...)`\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one \"second\"\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow \"first\" [ \"zeroth\" ])\n        |> Scroll.sideAlter Down\n            (Stack.map (\\_ -> String.toUpper))\n        |> Scroll.toStack\n    --> topBelow \"ZEROTH\" [ \"FIRST\", \"second\" ]\n\n    Scroll.one \"zeroth\"\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"first\" [ \"second\" ])\n        |> Scroll.sideAlter Up\n            (Stack.map (\\_ -> String.toUpper))\n        |> Scroll.toStack\n    --> topBelow \"zeroth\" [ \"FIRST\", \"SECOND\" ]\n\nLook to one [side](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/) from the focus\nand slide items in directly at the nearest location\n\n\n#### `sideAlter Linear.Direction (Stack.attach 🍒🍋)`\n\n`Down`\n\n```monospace\n      🍒🍋\n🍍 🍓 \\↓/ <🍊> 🍉\n```\n\n`Up`\n\n```monospace\n        🍒🍋\n🍓 <🍊> \\↓/ 🍉 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one 0\n        |> Scroll.sideAlter Down\n            (Stack.attach Down ([ -4, -5 ] |> Stack.fromList))\n        |> Scroll.sideAlter Down\n            (Stack.attach Down (topBelow -1 [ -2, -3 ]))\n        |> Scroll.toStack\n    --> topBelow -5 [ -4, -3, -2, -1, 0 ]\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (Stack.attach Down ([ 4, 5 ] |> Stack.fromList))\n        |> Scroll.sideAlter Up\n            (Stack.attach Down (topBelow 1 [ 2, 3 ]))\n        |> Scroll.toStack\n    --> topBelow 0 [ 1, 2, 3, 4, 5 ]\n\n\n#### `Scroll.sideAlter Linear.Direction (Stack.attach Up 🍒🍋)`\n\n`Down`\n\n```monospace\n🍋🍒\n \\↓ 🍍 🍓 <🍊> 🍉\n```\n\n`Up`\n\n```monospace\n              🍒🍋\n🍓 <🍊> 🍉 🍇 ↓/\n```\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow)\n\n    Scroll.one 1\n        |> Scroll.sideAlter Up\n            (Stack.attach Up (topBelow 2 [ 3, 4 ]))\n        |> Scroll.toEnd Up\n        |> Scroll.sideAlter Down\n            (Stack.attach Up (topBelow 7 [ 6, 5 ]))\n        |> Scroll.toStack\n    --> topBelow 5 [ 6, 7, 1, 2, 3, 4 ]\n\n    Scroll.one 123\n        |> Scroll.sideAlter Up\n            (Stack.attach Up (Stack.one 456))\n        |> Scroll.sideAlter Up\n            (Stack.attach Up (topBelow 789 [ 0 ]))\n        |> Scroll.toStack\n    --> topBelow 123 [ 456, 789, 0 ]\n\n\n#### `sideAlter Linear.Direction (`[`Stack.onTopLay`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack#onTopLay) `...)`\n\n`Down`\n\n```monospace\n      🍒\n🍍 🍓 ↓ <🍊> 🍉\n```\n\n\n#### `Up`\n\n```monospace\n        🍒\n🍓 <🍊> ↓ 🍉 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Stack exposing (topBelow, onTopLay)\n\n    Scroll.one 123\n        |> Scroll.sideAlter Down\n            (onTopLay 456)\n        |> Scroll.toStack\n    --> topBelow 456 [ 123 ]\n\n    Scroll.one 123\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one 789)\n        |> Scroll.sideAlter Up\n            (onTopLay 456)\n        |> Scroll.toStack\n    --> topBelow 123 [ 456, 789 ]\n\n","type":"Linear.Direction -> (Emptiable.Emptiable (Stack.Stacked item) Possibly.Possibly -> Emptiable.Emptiable (Stack.Stacked item) possiblyOrNever_) -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever"},{"name":"to","comment":" Try to move the [`focus`](#focus) to the item at a given [`Scroll.Location`](#Location)\n\n\n#### `Scroll.to (Down |> Scroll.nearest)`\n\n```monospace\n🍊 <🍉> 🍇  ->  <🍊> 🍉 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable, filled)\n    import Scroll exposing (Scroll, FocusGap)\n\n    Scroll.empty |> Scroll.to (Down |> Scroll.nearest)\n    --> Emptiable.empty\n\n    Scroll.one \"hello\"\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow \"scrollable\" [ \"world\" ])\n        |> Scroll.toEnd Up\n        |> Scroll.to (Down |> Scroll.nearest)\n        |> Emptiable.map Scroll.focusFill\n    --> filled \"scrollable\"\n    --: Emptiable (Scroll String FocusGap Never) Possibly\n\nThis also works from within gaps:\n\n```monospace\n🍊 🍉 <> 🍇  ->  🍊 <🍉> 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable, filled)\n    import Stack exposing (onTopLay)\n    import Scroll exposing (Scroll, FocusGap)\n\n    Scroll.empty\n        |> Scroll.sideAlter Down\n            (onTopLay \"foo\")\n        |> Scroll.to (Down |> Scroll.nearest)\n    --> filled (Scroll.one \"foo\")\n    --: Emptiable (Scroll String FocusGap Never) Possibly\n\n\n#### `Scroll.to (Up |> Scroll.nearest)`\n\n```monospace\n<🍊> 🍉 🍇  ->  🍊 <🍉> 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable, filled)\n    import Scroll exposing (Scroll, FocusGap)\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.to (Up |> Scroll.nearest)\n        |> Emptiable.map Scroll.focusFill\n    --> filled 1\n    --: Emptiable number_ Possibly\n\nThis also works from within gaps:\n\n```monospace\n🍊 <> 🍉 🍇  ->  🍊 <🍉> 🍇\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable, filled)\n    import Stack exposing (onTopLay)\n    import Scroll exposing (Scroll, FocusGap)\n\n    Scroll.empty\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one \"foo\")\n        |> Scroll.to (Up |> Scroll.nearest)\n    --> filled (Scroll.one \"foo\")\n    --: Emptiable (Scroll String FocusGap Never) Possibly\n\nIf there is no next item,\nthe result is [`empty`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable#empty)\n\n    import Linear exposing (Direction(..))\n    import Emptiable\n    import Stack exposing (topBelow)\n\n    Scroll.empty |> Scroll.to (Up |> Scroll.nearest)\n    --> Emptiable.empty\n\n    Scroll.one 0\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 1 [ 2, 3 ])\n        |> Scroll.toEnd Up\n        |> Scroll.to (Up |> Scroll.nearest)\n    --> Emptiable.empty\n\n\n#### `Scroll.to Location`\n\n    import Element as Ui\n    import Element.Input as UIn\n    import Emptiable\n    import RecordWithoutConstructorFunction exposing (RecordWithoutConstructorFunction)\n    import Scroll exposing (FocusGap, Scroll)\n    import Stack\n\n    type alias Model =\n        RecordWithoutConstructorFunction\n            { numbers : Scroll Int FocusGap Never\n            }\n\n    type Event\n        = NumberClicked Scroll.Location\n\n    update : Event -> Model -> ( Model, Cmd Event )\n    update event model =\n        case event of\n            NumberClicked location ->\n                ( { model\n                    | numbers =\n                        model.numbers\n                            |> Scroll.to location\n                            |> Emptiable.fillElseOnEmpty (\\_ -> model.numbers)\n                            |> Scroll.focusAlter (Emptiable.map (\\n -> n + 1))\n                  }\n                , Cmd.none\n                )\n\n    interface : Model -> Ui.Element Event\n    interface =\n        \\{ numbers } ->\n            numbers\n                |> Scroll.map numberInterface\n                |> Scroll.toList\n                |> Ui.column []\n\n    numberInterface :\n        Scroll.Location\n        -> Int\n        -> Ui.Element Event\n    numberInterface location =\n        \\number ->\n            UIn.button []\n                { onPress = NumberClicked location |> Just\n                , label =\n                    number\n                        |> String.fromInt\n                        |> Ui.text\n                }\n\nThe same _functionality_ is often provided as `duplicate : Scroll item ... -> Scroll (Scroll item) ...`\n\n  - [turboMaCk/non-empty-list-alias: `List.NonEmpty.Zipper.duplicate`](https://package.elm-lang.org/packages/turboMaCk/non-empty-list-alias/latest/List-NonEmpty-Zipper#duplicate)\n  - [miyamoen/select-list: `SelectList.selectedMap`](https://dark.elm.dmy.fr/packages/miyamoen/select-list/latest/SelectList#selectedMap)\n  - [jjant/elm-comonad-zipper: `Zipper.duplicate`](https://package.elm-lang.org/packages/jjant/elm-comonad-zipper/latest/Zipper#duplicate)\n  - [arowM/elm-reference: `Reference.List.unwrap`](https://dark.elm.dmy.fr/packages/arowM/elm-reference/latest/Reference-List#unwrap)\n\nSaving a [`Scroll`](#Scroll) with every item becomes expensive for long [`Scroll`](#Scroll)s, though!\n\n","type":"Scroll.Location -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever_ -> Emptiable.Emptiable (Scroll.Scroll item Scroll.FocusGap never_) Possibly.Possibly"},{"name":"toEnd","comment":" Focus the furthest item [`Down/Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/) the focus\n\n`Down`\n\n```monospace\n🍍 🍓 <🍊> 🍉  ->  <🍍> 🍓 🍊 🍉\n```\n\n`Up`\n\n```monospace\n🍓 <🍊> 🍉 🍇  ->  🍓 🍊 🍉 <🍇>\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (Emptiable)\n    import Stack exposing (Stacked, topBelow)\n\n    Scroll.one 1\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 3, 4 ])\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 4 [ 3, 2 ])\n        |> Scroll.toEnd Down\n        |> Scroll.focusFill\n    --> 2\n\n    Scroll.one 1\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 3, 4 ])\n        |> Scroll.toEnd Up\n        |> Scroll.focusFill\n    --> 4\n\n    Scroll.one 1\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 3, 4 ])\n        |> Scroll.toEnd Up\n        |> Scroll.side Down\n    --> topBelow 3 [ 2, 1 ]\n    --: Emptiable (Stacked number_) Possibly\n\n","type":"Linear.Direction -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever"},{"name":"toEndGap","comment":" Focus the gap beyond the furthest item [`Down|Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/).\nRemember that gaps surround everything!\n\n`Down`\n\n```monospace\n🍍 🍓 <🍊> 🍉  ->  <> 🍍 🍓 🍊 🍉\n```\n\n`Up`\n\n```monospace\n🍓 <🍊> 🍉  ->  🍓 🍊 🍉 <>\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n\n    Scroll.one 1\n            -- <1>\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 3 [ 4 ])\n            -- <1> 3 4\n        |> Scroll.toGap Up\n            -- 1 <> 3 4\n        |> Scroll.focusAlter (\\_ -> filled 2)\n            -- 1 <2> 3 4\n        |> Scroll.toEndGap Down\n            -- <> 1 2 3 4\n        |> Scroll.focusAlter (\\_ -> filled 0)\n            -- <0> 1 2 3 4\n        |> Scroll.toStack\n    --> topBelow 0 [ 1, 2, 3, 4 ]\n\n    Scroll.one 1\n            -- <1>\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ 3 ])\n            -- <1> 2 3\n        |> Scroll.toEndGap Up\n            -- 1 2 3 <>\n        |> Scroll.focusAlter (\\_ -> filled 4)\n            -- 1 2 3 <4>\n        |> Scroll.toStack\n    --> topBelow 1 [ 2, 3, 4 ]\n\n","type":"Linear.Direction -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever_ -> Scroll.Scroll item Scroll.FocusGap Possibly.Possibly"},{"name":"toGap","comment":" Move the focus to the gap directly [`Down|Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/).\nFeel free to [plug](#focusAlter) that gap right up!\n\n\n#### `Scroll.toGap Down`\n\n```monospace\n🍍 <🍊> 🍉  ->  🍍 <> 🍊 🍉\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n\n    Scroll.one \"world\"\n        |> Scroll.toGap Down\n        |> Scroll.focusAlter (\\_ -> \"hello\" |> filled)\n        |> Scroll.toStack\n    --> topBelow \"hello\" [ \"world\" ]\n\n\n#### `Scroll.toGap Up`\n\n```monospace\n🍍 <🍊> 🍉  ->  🍍 🍊 <> 🍉\n```\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n\n    Scroll.one \"hello\"\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one \"world\")\n        |> Scroll.toGap Up\n        |> Scroll.focusAlter (\\_ -> filled \"scrollable\")\n        |> Scroll.toStack\n    --> topBelow \"hello\" [ \"scrollable\", \"world\" ]\n\n","type":"Linear.Direction -> Scroll.Scroll item Scroll.FocusGap Basics.Never -> Scroll.Scroll item Scroll.FocusGap Possibly.Possibly"},{"name":"toList","comment":" Converts it to a `List`, rolled out to both ends:\n\n    import Linear exposing (Direction(..))\n    import Stack\n\n    Scroll.one 456\n        |> Scroll.sideAlter Down\n            (\\_ -> Stack.one 123)\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one 789)\n        |> Scroll.toList\n    --> [ 123, 456, 789 ]\n\nOnly use this if you need a list in the end.\nOtherwise, use [`toStack`](#toStack) to preserve some information about its length\n\n","type":"Scroll.Scroll item Scroll.FocusGap possiblyOrNever_ -> List.List item"},{"name":"toStack","comment":" Roll out the [`Scroll`](#Scroll) to both ends\ninto a [`Stack`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Stack)\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n\n    Scroll.empty\n        |> Scroll.toStack\n    --> Emptiable.empty\n\n    Scroll.one 123\n        |> Scroll.sideAlter Up\n            (\\_ -> Stack.one 789)\n        |> Scroll.toGap Up\n        |> Scroll.focusAlter (\\_-> filled 456)\n        |> Scroll.toStack\n    --> topBelow 123 [ 456, 789 ]\n\nits type information gets carried over, so\n\n    Scroll.FocusGap Never -> Emptiable Never\n    Scroll.FocusGap Possibly -> Emptiable Possibly\n\n","type":"Scroll.Scroll item Scroll.FocusGap possiblyOrNever -> Emptiable.Emptiable (Stack.Stacked item) possiblyOrNever"},{"name":"toWhen","comment":" Move the focus to the nearest item [`Down|Up`](https://dark.elm.dmy.fr/packages/lue-bird/elm-linear-direction/latest/)\nthat matches a predicate.\nIf no such item was found,\n[`Emptiable.empty`](https://dark.elm.dmy.fr/packages/lue-bird/elm-emptiness-typed/latest/Emptiable#empty)\n\n    import Linear exposing (Direction(..))\n    import Emptiable exposing (filled)\n    import Stack exposing (topBelow)\n    import Linear exposing (Direction(..))\n\n    Scroll.one 4\n        |> Scroll.sideAlter Down\n            (\\_ -> topBelow 2 [ -1, 0, 3 ])\n        |> Scroll.toWhen Down (\\_ item -> item < 0)\n        |> Emptiable.map Scroll.focusFill\n    --> filled -1\n\n    Scroll.one 4\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ -1, 0, 3 ])\n        |> Scroll.toWhen Up (\\_ item -> item < 0)\n        |> Emptiable.map focusFill\n    --> filled -1\n\n    Scroll.one -4\n        |> Scroll.sideAlter Up\n            (\\_ -> topBelow 2 [ -1, 0, 3 ])\n        |> Scroll.toWhen Up (\\_ item -> item < 0)\n        |> Emptiable.map focusFill\n    --> filled -4\n\n","type":"Linear.Direction -> ({ index : Basics.Int } -> item -> Basics.Bool) -> Scroll.Scroll item Scroll.FocusGap possiblyOrNever_ -> Emptiable.Emptiable (Scroll.Scroll item Scroll.FocusGap never_) Possibly.Possibly"}],"binops":[]}]