{-# LANGUAGE PatternSynonyms #-} module MusicScroll.TrackSuplement ( tsTitle, tsArtist, tsKeepArtist, TrackSuplement (), trackSuplement, suplement, mergeSuplement, suplementOnlyArtist, ) where import Data.Text import MusicScroll.TrackInfo ( TrackByPath (..), TrackIdentifier, TrackInfo (..), pattern OnlyMissingArtist, ) import Pipes (Pipe) import qualified Pipes.Prelude as PP (map) -- | Invariant, always a valid artist text. data TrackSuplement = TrackSuplement { tsTitle :: Text, tsArtist :: Text, tsKeepArtist :: Bool } trackSuplement :: Text -> Text -> Bool -> Maybe TrackSuplement trackSuplement title artist keep | strip artist == artist = pure (TrackSuplement title artist keep) | otherwise = Nothing suplement :: TrackSuplement -> TrackIdentifier -> TrackInfo suplement supl = either byPath byInfo where byPath :: TrackByPath -> TrackInfo byPath path = TrackInfo { tTitle = tsTitle supl, tArtist = tsArtist supl, tUrl = tpPath path } byInfo :: TrackInfo -> TrackInfo byInfo info = info {tTitle = tsTitle supl, tArtist = tsArtist supl} mergeSuplement :: Functor m => TrackSuplement -> Pipe TrackIdentifier TrackInfo m a mergeSuplement = PP.map . suplement suplementOnlyArtist :: TrackSuplement -> TrackIdentifier -> TrackIdentifier suplementOnlyArtist supl (Left byPath@OnlyMissingArtist) = let trackinfo = TrackInfo { tTitle = maybe mempty id (tpTitle byPath), tArtist = tsArtist supl, tUrl = tpPath byPath } in Right trackinfo suplementOnlyArtist _ other = other