-- |
-- Module      : Toml.Lens
-- Description : Lenses for toml-parser
-- Copyright   : (c) 2017-2022, Henry Till
-- License     : ISC
-- Maintainer  : henrytill@gmail.com
-- Stability   : experimental
--
-- Lenses for <https://hackage.haskell.org/package/toml-parser toml-parser>.
--
module Toml.Lens
  ( _Table
  , _Array
  , _Float
  , _Integer
  , _String
  , _Bool
  , _ZonedTime
  , _LocalTime
  , _Day
  , _TimeOfDay
  ) where

import           Data.Profunctor
import qualified Data.Time       as Time

import           Toml

--
-- With help from:
-- <https://github.com/ekmett/lens/wiki/How-can-I-write-lenses-without-depending-on-lens%3F>
--
-- @
-- type Prism s t a b = (Choice p, Applicative f) => p a (f b) -> p s (f t)
-- @
--
-- @
-- type Prism' s a = Prism s s a a
-- @
--

prism
  :: (Choice p, Applicative f)
  => (b -> t)
  -> (s -> Either t a)
  -> p a (f b)
  -> p s (f t)
prism :: forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism b -> t
bt s -> Either t a
seta = forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap s -> Either t a
seta (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> t
bt)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'
{-# INLINE prism #-}

-- | @_Table :: Prism' Value Table@
_Table
  :: (Choice p, Applicative f)
  => p Table (f Table)
  -> p Value (f Value)
_Table :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p Table (f Table) -> p Value (f Value)
_Table =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism Table -> Value
Table forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    Table Table
v -> forall a b. b -> Either a b
Right Table
v
    Value
_       -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _Table #-}

-- | @_Array :: Prism' Value [Value]@
_Array
  :: (Choice p, Applicative f)
  => p [Value] (f [Value])
  -> p Value (f Value)
_Array :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p [Value] (f [Value]) -> p Value (f Value)
_Array =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism [Value] -> Value
Array forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    Array [Value]
v -> forall a b. b -> Either a b
Right [Value]
v
    Value
_       -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _Array #-}

-- | @_Float :: Prism' Value Double@
_Float
  :: (Choice p, Applicative f)
  => p Double (f Double)
  -> p Value (f Value)
_Float :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p Double (f Double) -> p Value (f Value)
_Float =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism Double -> Value
Float forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    Float Double
v -> forall a b. b -> Either a b
Right Double
v
    Value
_       -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _Float #-}

-- | @_Integer :: Prism' Value Integer@
_Integer
  :: (Choice p, Applicative f)
  => p Integer (f Integer)
  -> p Value (f Value)
_Integer :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p Integer (f Integer) -> p Value (f Value)
_Integer =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism Integer -> Value
Integer forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    Integer Integer
v -> forall a b. b -> Either a b
Right Integer
v
    Value
_         -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _Integer #-}

-- | @_String :: Prism' Value String@
_String
  :: (Choice p, Applicative f)
  => p String (f String)
  -> p Value (f Value)
_String :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p String (f String) -> p Value (f Value)
_String =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism String -> Value
String forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    String String
v -> forall a b. b -> Either a b
Right String
v
    Value
_        -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _String #-}

-- | @_Bool :: Prism' Value Bool@
_Bool
  :: (Choice p, Applicative f)
  => p Bool (f Bool)
  -> p Value (f Value)
_Bool :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p Bool (f Bool) -> p Value (f Value)
_Bool =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism Bool -> Value
Bool forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    Bool Bool
v -> forall a b. b -> Either a b
Right Bool
v
    Value
_      -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _Bool #-}

-- | @_ZonedTime :: Prism' Value Time.ZonedTime@
_ZonedTime
  :: (Choice p, Applicative f)
  => p Time.ZonedTime (f Time.ZonedTime)
  -> p Value (f Value)
_ZonedTime :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p ZonedTime (f ZonedTime) -> p Value (f Value)
_ZonedTime =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism ZonedTime -> Value
ZonedTime forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    ZonedTime ZonedTime
v -> forall a b. b -> Either a b
Right ZonedTime
v
    Value
_           -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _ZonedTime #-}

-- | @_LocalTime :: Prism' Value Time.LocalTime@
_LocalTime
  :: (Choice p, Applicative f)
  => p Time.LocalTime (f Time.LocalTime)
  -> p Value (f Value)
_LocalTime :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p LocalTime (f LocalTime) -> p Value (f Value)
_LocalTime =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism LocalTime -> Value
LocalTime forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    LocalTime LocalTime
v -> forall a b. b -> Either a b
Right LocalTime
v
    Value
_           -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _LocalTime #-}

-- | @_Day :: Prism' Value Time.Day@
_Day
  :: (Choice p, Applicative f)
  => p Time.Day (f Time.Day)
  -> p Value (f Value)
_Day :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p Day (f Day) -> p Value (f Value)
_Day =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism Day -> Value
Day forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    Day Day
v -> forall a b. b -> Either a b
Right Day
v
    Value
_     -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _Day #-}

-- | @_TimeOfDay :: Prism' Value Time.TimeOfDay@
_TimeOfDay
  :: (Choice p, Applicative f)
  => p Time.TimeOfDay (f Time.TimeOfDay)
  -> p Value (f Value)
_TimeOfDay :: forall (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p TimeOfDay (f TimeOfDay) -> p Value (f Value)
_TimeOfDay =
  forall (p :: * -> * -> *) (f :: * -> *) b t s a.
(Choice p, Applicative f) =>
(b -> t) -> (s -> Either t a) -> p a (f b) -> p s (f t)
prism TimeOfDay -> Value
TimeOfDay forall a b. (a -> b) -> a -> b
$ \ Value
n -> case Value
n of
    TimeOfDay TimeOfDay
v -> forall a b. b -> Either a b
Right TimeOfDay
v
    Value
_           -> forall a b. a -> Either a b
Left Value
n
{-# INLINE _TimeOfDay #-}