{-|
Description:    Objects used to describe the CD and filesystem format.

Copyright:      (c) 2020-2021 Sam May
License:        GPL-3.0-or-later
Maintainer:     ag@eitilt.life

Stability:      stable
Portability:    non-portable (requires libcdio)

Like any drive, discs may store their data according to many different
filesystem structures.  These are abstracted to a degree in libcdio, but as
each track may store its data differently, and at the very least
'Foreign.Audio' is handled differently than any of the file-oriented layouts,
it is still helpful to know the underlying structure.  This module, then, is a
counterpart to "Sound.Libcdio.Read.Data", providing information about the
/structure/ for the latter's retrieval of /data/.
-}
module Sound.Libcdio.Read.Filesystem
    ( -- * Types
      Foreign.Filesystem ( .. )
    , Foreign.FilesystemClass ( .. )
    , Foreign.FilesystemClasses
    , Foreign.fsAny
    , Foreign.fsAnyVcd
    , Foreign.IsoAnalysis ( .. )
      -- * Query
    , trackType
    ) where


import qualified Foreign.Libcdio.CdTypes as Foreign

import Sound.Libcdio.Track
import Sound.Libcdio.Types.Cdio


-- | Determine what type of file system is stored in the given track of a disc.
trackType :: Track -> Cdio (Maybe Foreign.Filesystem, Foreign.FilesystemClasses, Maybe Foreign.IsoAnalysis)
trackType :: Track
-> Cdio (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis)
trackType = (Cdio
 -> IO (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis))
-> Cdio (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio ((Cdio
  -> IO (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis))
 -> Cdio (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis))
-> (Track
    -> Cdio
    -> IO (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis))
-> Track
-> Cdio (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Cdio
 -> Track
 -> IO (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis))
-> Track
-> Cdio
-> IO (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Cdio
-> Track
-> IO (Maybe Filesystem, FilesystemClasses, Maybe IsoAnalysis)
Foreign.trackType