Files
elm-0.19-workshop/intro/part6/src/Article/FeedSources.elm
Richard Feldman 8f67672ffe Add part6
2018-08-11 23:18:15 -04:00

110 lines
2.4 KiB
Elm

module Article.FeedSources exposing (FeedSources, Source(..), after, before, fromLists, select, selected)
import Article
import Article.Tag as Tag exposing (Tag)
import Username exposing (Username)
import Viewer.Cred as Cred exposing (Cred)
-- TYPES
type FeedSources
= FeedSources
{ before : List Source
, selected : Source
, after : List Source
}
type Source
= YourFeed Cred
| GlobalFeed
| TagFeed Tag
| FavoritedFeed Username
| AuthorFeed Username
-- BUILDING
fromLists : Source -> List Source -> FeedSources
fromLists selectedSource afterSources =
FeedSources
{ before = []
, selected = selectedSource
, after = afterSources
}
-- SELECTING
select : Source -> FeedSources -> FeedSources
select selectedSource (FeedSources sources) =
let
( newBefore, newAfter ) =
(sources.before ++ (sources.selected :: sources.after))
-- By design, tags can only be included if they're selected.
|> List.filter isNotTag
|> splitOn (\source -> source == selectedSource)
in
FeedSources
{ before = List.reverse newBefore
, selected = selectedSource
, after = List.reverse newAfter
}
splitOn : (Source -> Bool) -> List Source -> ( List Source, List Source )
splitOn isSelected sources =
let
( _, newBefore, newAfter ) =
List.foldl (splitOnHelp isSelected) ( False, [], [] ) sources
in
( newBefore, newAfter )
splitOnHelp : (Source -> Bool) -> Source -> ( Bool, List Source, List Source ) -> ( Bool, List Source, List Source )
splitOnHelp isSelected source ( foundSelected, beforeSelected, afterSelected ) =
if isSelected source then
( True, beforeSelected, afterSelected )
else if foundSelected then
( foundSelected, beforeSelected, source :: afterSelected )
else
( foundSelected, source :: beforeSelected, afterSelected )
isNotTag : Source -> Bool
isNotTag currentSource =
case currentSource of
TagFeed _ ->
False
_ ->
True
-- INFO
selected : FeedSources -> Source
selected (FeedSources record) =
record.selected
before : FeedSources -> List Source
before (FeedSources record) =
record.before
after : FeedSources -> List Source
after (FeedSources record) =
record.after