-- |
-- Module      :  Data.Text.Fuzzy.Dates
-- Copyright   :  Dmitry Zuikov 2020
-- License     :  MIT
--
-- Maintainer  :  dzuikov@gmail.com
-- Stability   :  experimental
-- Portability :  unknown
--
-- Dates fuzzy parsing.
-- Supports a number of dates format and tries to recover
-- the incomplete dates from text, with use of some
-- reasonable assumptions. Does not support locales,
-- i.e assums only English for dates yet.
--
-- == Examples
--
-- > parseMaybeDay "01.01.1979"
-- > Just 1979-01-01
-- > parseMaybeDay "01.01.01"
-- > Just 2001-01-01
-- > parseMaybeDay "13/01/2019"
-- > Just 2019-01-13
-- > parseMaybeDay "2019-12-1"
-- > Just 2019-12-01
-- > parseMaybeDay "21-feb-79"
-- > Just 1979-02-21
-- > parseMaybeDay "21-feb-01"
-- > Just 2001-02-21
-- > parseMaybeDay "29feb04"
-- > Just 2004-02-29
-- > parseMaybeDay "21feb28"
-- > Just 2028-02-21

module Data.Text.Fuzzy.Dates where

import Data.Attoparsec.Text (parseOnly)
import Data.Either (either)
import Data.Text.Fuzzy.Attoparsec.Day
import Data.Text (Text)
import Data.Time.Calendar

-- | Tries to parse a date from the text.
parseMaybeDay :: Text -> Maybe Day
parseMaybeDay s = either (const Nothing) pure (parseOnly day s)