proteome-0.9.9.9: lib/Proteome/Data/FilesState.hs
module Proteome.Data.FilesState where
import Path (Abs, File, Path, filename, parent)
import Ribosome (pathText)
import Ribosome.Menu (Filter, MenuItem (MenuItem), Modal)
import qualified Ribosome.Menu.MenuState as MenuState
import Ribosome.Menu.MenuState (FilterMode (FilterMode), MenuMode (cycleFilter, renderFilter))
import Exon (exon)
data FileSegments =
FileSegments {
path :: Path Abs File,
name :: Text,
dir :: Text
}
deriving stock (Eq, Show, Generic)
fileSegments :: Path Abs File -> FileSegments
fileSegments path =
FileSegments {
name = pathText (filename path),
dir = pathText (parent path),
..
}
data Segment =
Full
|
Name
|
Dir
deriving stock (Eq, Show, Ord)
renderSegment :: Segment -> Text
renderSegment = \case
Full -> "full"
Name -> "name"
Dir -> "dir"
segmentExtract :: MenuItem FileSegments -> Segment -> Text
segmentExtract (MenuItem FileSegments {..} _ render) = \case
Full -> render
Name -> name
Dir -> dir
cycle :: Segment -> Segment
cycle = \case
Full -> Name
Name -> Dir
Dir -> Full
data FilesMode =
FilesMode {
mode :: Filter,
segment :: Segment
}
deriving stock (Eq, Show, Ord, Generic)
type FilesState =
Modal FilesMode FileSegments
instance MenuMode FileSegments FilesMode where
type Filter FilesMode =
FilterMode Filter
cycleFilter (FilesMode mode segment) =
FilesMode (cycleFilter mode) segment
renderFilter (FilesMode mode _) =
renderFilter mode
renderExtra (FilesMode _ segment) =
Just [exon|🔧 #{renderSegment segment}|]
filterMode (FilesMode mode segment) =
FilterMode mode (Just . flip segmentExtract segment)