module TaskToNote where

import Protolude as P (
  Eq,
  Generic,
  Show,
  Text,
  decodeUtf8,
  (.),
  (<$>),
  (<*>),
 )

import Data.Generics (Data)
import Data.Text as T (dropEnd)
import Data.Yaml as Yaml (ToJSON, encode)
import Database.SQLite.Simple (FromRow, field, fromRow, toRow)
import Database.SQLite.Simple.ToField (toField)
import Database.SQLite.Simple.ToRow (ToRow)
import Prettyprinter (Pretty (pretty))


-- | Record for storing entries of the `task_to_note` table
data TaskToNote = TaskToNote
  { TaskToNote -> Text
ulid :: Text -- Ulid
  , TaskToNote -> Text
task_ulid :: Text
  , TaskToNote -> Text
note :: Text
  }
  deriving (Int -> TaskToNote -> ShowS
[TaskToNote] -> ShowS
TaskToNote -> String
(Int -> TaskToNote -> ShowS)
-> (TaskToNote -> String)
-> ([TaskToNote] -> ShowS)
-> Show TaskToNote
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TaskToNote -> ShowS
showsPrec :: Int -> TaskToNote -> ShowS
$cshow :: TaskToNote -> String
show :: TaskToNote -> String
$cshowList :: [TaskToNote] -> ShowS
showList :: [TaskToNote] -> ShowS
Show, TaskToNote -> TaskToNote -> Bool
(TaskToNote -> TaskToNote -> Bool)
-> (TaskToNote -> TaskToNote -> Bool) -> Eq TaskToNote
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TaskToNote -> TaskToNote -> Bool
== :: TaskToNote -> TaskToNote -> Bool
$c/= :: TaskToNote -> TaskToNote -> Bool
/= :: TaskToNote -> TaskToNote -> Bool
Eq, (forall x. TaskToNote -> Rep TaskToNote x)
-> (forall x. Rep TaskToNote x -> TaskToNote) -> Generic TaskToNote
forall x. Rep TaskToNote x -> TaskToNote
forall x. TaskToNote -> Rep TaskToNote x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TaskToNote -> Rep TaskToNote x
from :: forall x. TaskToNote -> Rep TaskToNote x
$cto :: forall x. Rep TaskToNote x -> TaskToNote
to :: forall x. Rep TaskToNote x -> TaskToNote
Generic, Typeable TaskToNote
Typeable TaskToNote =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> TaskToNote -> c TaskToNote)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c TaskToNote)
-> (TaskToNote -> Constr)
-> (TaskToNote -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c TaskToNote))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c TaskToNote))
-> ((forall b. Data b => b -> b) -> TaskToNote -> TaskToNote)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> TaskToNote -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> TaskToNote -> r)
-> (forall u. (forall d. Data d => d -> u) -> TaskToNote -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> TaskToNote -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote)
-> Data TaskToNote
TaskToNote -> Constr
TaskToNote -> DataType
(forall b. Data b => b -> b) -> TaskToNote -> TaskToNote
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> TaskToNote -> u
forall u. (forall d. Data d => d -> u) -> TaskToNote -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TaskToNote -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TaskToNote -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c TaskToNote
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TaskToNote -> c TaskToNote
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c TaskToNote)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c TaskToNote)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TaskToNote -> c TaskToNote
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TaskToNote -> c TaskToNote
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c TaskToNote
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c TaskToNote
$ctoConstr :: TaskToNote -> Constr
toConstr :: TaskToNote -> Constr
$cdataTypeOf :: TaskToNote -> DataType
dataTypeOf :: TaskToNote -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c TaskToNote)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c TaskToNote)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c TaskToNote)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c TaskToNote)
$cgmapT :: (forall b. Data b => b -> b) -> TaskToNote -> TaskToNote
gmapT :: (forall b. Data b => b -> b) -> TaskToNote -> TaskToNote
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TaskToNote -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TaskToNote -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TaskToNote -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TaskToNote -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> TaskToNote -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> TaskToNote -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> TaskToNote -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> TaskToNote -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TaskToNote -> m TaskToNote
Data)


instance FromRow TaskToNote where
  fromRow :: RowParser TaskToNote
fromRow =
    Text -> Text -> Text -> TaskToNote
TaskToNote
      (Text -> Text -> Text -> TaskToNote)
-> RowParser Text -> RowParser (Text -> Text -> TaskToNote)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RowParser Text
forall a. FromField a => RowParser a
field
      RowParser (Text -> Text -> TaskToNote)
-> RowParser Text -> RowParser (Text -> TaskToNote)
forall a b. RowParser (a -> b) -> RowParser a -> RowParser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RowParser Text
forall a. FromField a => RowParser a
field
      RowParser (Text -> TaskToNote)
-> RowParser Text -> RowParser TaskToNote
forall a b. RowParser (a -> b) -> RowParser a -> RowParser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> RowParser Text
forall a. FromField a => RowParser a
field


instance ToRow TaskToNote where
  toRow :: TaskToNote -> [SQLData]
toRow TaskToNote{Text
ulid :: TaskToNote -> Text
task_ulid :: TaskToNote -> Text
note :: TaskToNote -> Text
ulid :: Text
task_ulid :: Text
note :: Text
..} =
    [ Text -> SQLData
forall a. ToField a => a -> SQLData
toField Text
ulid
    , Text -> SQLData
forall a. ToField a => a -> SQLData
toField Text
task_ulid
    , Text -> SQLData
forall a. ToField a => a -> SQLData
toField Text
note
    ]


instance ToJSON TaskToNote


instance Pretty TaskToNote where
  pretty :: forall ann. TaskToNote -> Doc ann
pretty =
    Text -> Doc ann
forall ann. Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty
      (Text -> Doc ann) -> (TaskToNote -> Text) -> TaskToNote -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> Text
T.dropEnd Int
1 -- Drop trailing newline to maybe add it later
      (Text -> Text) -> (TaskToNote -> Text) -> TaskToNote -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
decodeUtf8
      (ByteString -> Text)
-> (TaskToNote -> ByteString) -> TaskToNote -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TaskToNote -> ByteString
forall a. ToJSON a => a -> ByteString
Yaml.encode