···99import Maybe.Extra as Maybe
1010import Queue exposing (Item)
1111import Random exposing (Generator, Seed)
1212+import Set exposing (Set)
1213import Time
1314import Tracks exposing (IdentifiedTrack)
1415import UI.Queue.Common exposing (makeItem)
···959696979798shuffled : Time.Posix -> List IdentifiedTrack -> State -> List Item
9898-shuffled timestamp unfilteredTracks state =
9999+shuffled timestamp unfilteredTracks s =
99100 let
101101+ state =
102102+ if List.isEmpty s.future && not (List.isEmpty s.past) then
103103+ -- We played every available track,
104104+ -- disregard the past tracks.
105105+ { s | past = [] }
106106+107107+ else
108108+ s
109109+100110 idsToIgnore =
101111 [ state.ignored
102112 , state.past
···129139 timestamp
130140 |> Time.posixToMillis
131141 |> Random.initialSeed
132132- |> generateIndexes generator howMany []
142142+ |> generateIndexes generator howMany Set.empty
143143+ |> Set.toList
133144 |> List.foldl
134145 (\idx acc ->
135146 case Array.get idx tracks of
···171182 `squirrel` = accumulator, ie. collected indexes
172183173184-}
174174-generateIndexes : Generator Int -> Int -> List Int -> Seed -> List Int
185185+generateIndexes : Generator Int -> Int -> Set Int -> Seed -> Set Int
175186generateIndexes generator howMany squirrel seed =
176187 let
177188 ( index, newSeed ) =
178189 Random.step generator seed
190190+ in
191191+ if Set.member index squirrel then
192192+ generateIndexes generator howMany squirrel newSeed
179193180180- newSquirrel =
181181- -- We could check if the generated index is already one we have,
182182- -- but I don't think that ever happens (because of the use of `Random.step`)
183183- index :: squirrel
184184- in
185185- if howMany - 1 > 0 then
186186- generateIndexes generator (howMany - 1) newSquirrel newSeed
194194+ else if howMany - 1 > 0 then
195195+ generateIndexes generator (howMany - 1) (Set.insert index squirrel) newSeed
187196188197 else
189189- newSquirrel
198198+ Set.insert index squirrel
190199191200192201