packages feed

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)