{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE RecordWildCards #-} module Cursor.FuzzyDay ( FuzzyDayCursor(..) , emptyFuzzyDayCursor , makeFuzzyDayCursor , rebuildFuzzyDayCursor , fuzzyDayCursorTextCursorL , fuzzyDayCursorGuess ) where import GHC.Generics (Generic) import Data.Maybe import qualified Data.Text as T import Control.DeepSeq import Data.Time import Data.Validity import Text.Megaparsec import Lens.Micro import Data.FuzzyTime import Cursor.Text data FuzzyDayCursor = FuzzyDayCursor { fuzzyDayCursorTextCursor :: TextCursor , fuzzyDayCursorBaseDay :: Day } deriving (Show, Eq, Generic) instance Validity FuzzyDayCursor instance NFData FuzzyDayCursor emptyFuzzyDayCursor :: Day -> FuzzyDayCursor emptyFuzzyDayCursor d = FuzzyDayCursor {fuzzyDayCursorTextCursor = emptyTextCursor, fuzzyDayCursorBaseDay = d} makeFuzzyDayCursor :: Day -> FuzzyDayCursor makeFuzzyDayCursor d = FuzzyDayCursor { fuzzyDayCursorTextCursor = fromJust $ makeTextCursor $ T.pack $ formatTime defaultTimeLocale "%F" d , fuzzyDayCursorBaseDay = d } rebuildFuzzyDayCursor :: FuzzyDayCursor -> Day rebuildFuzzyDayCursor fdc@FuzzyDayCursor {..} = fromMaybe fuzzyDayCursorBaseDay $ fuzzyDayCursorGuess fdc fuzzyDayCursorTextCursorL :: Lens' FuzzyDayCursor TextCursor fuzzyDayCursorTextCursorL = lens fuzzyDayCursorTextCursor $ \fdc tc -> fdc {fuzzyDayCursorTextCursor = tc} fuzzyDayCursorGuess :: FuzzyDayCursor -> Maybe Day fuzzyDayCursorGuess FuzzyDayCursor {..} = do fd <- parseMaybe fuzzyDayP $ rebuildTextCursor fuzzyDayCursorTextCursor pure $ resolveDay fuzzyDayCursorBaseDay fd