{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Codec.Xlsx.Types.Internal where

import Control.Arrow
import Data.Monoid ((<>))
import Data.Text (Text)
import GHC.Generics (Generic)

import Codec.Xlsx.Parser.Internal
import Codec.Xlsx.Writer.Internal

newtype RefId = RefId { RefId -> Text
unRefId :: Text } deriving (RefId -> RefId -> Bool
(RefId -> RefId -> Bool) -> (RefId -> RefId -> Bool) -> Eq RefId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RefId -> RefId -> Bool
$c/= :: RefId -> RefId -> Bool
== :: RefId -> RefId -> Bool
$c== :: RefId -> RefId -> Bool
Eq, Eq RefId
Eq RefId
-> (RefId -> RefId -> Ordering)
-> (RefId -> RefId -> Bool)
-> (RefId -> RefId -> Bool)
-> (RefId -> RefId -> Bool)
-> (RefId -> RefId -> Bool)
-> (RefId -> RefId -> RefId)
-> (RefId -> RefId -> RefId)
-> Ord RefId
RefId -> RefId -> Bool
RefId -> RefId -> Ordering
RefId -> RefId -> RefId
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: RefId -> RefId -> RefId
$cmin :: RefId -> RefId -> RefId
max :: RefId -> RefId -> RefId
$cmax :: RefId -> RefId -> RefId
>= :: RefId -> RefId -> Bool
$c>= :: RefId -> RefId -> Bool
> :: RefId -> RefId -> Bool
$c> :: RefId -> RefId -> Bool
<= :: RefId -> RefId -> Bool
$c<= :: RefId -> RefId -> Bool
< :: RefId -> RefId -> Bool
$c< :: RefId -> RefId -> Bool
compare :: RefId -> RefId -> Ordering
$ccompare :: RefId -> RefId -> Ordering
$cp1Ord :: Eq RefId
Ord, Int -> RefId -> ShowS
[RefId] -> ShowS
RefId -> String
(Int -> RefId -> ShowS)
-> (RefId -> String) -> ([RefId] -> ShowS) -> Show RefId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RefId] -> ShowS
$cshowList :: [RefId] -> ShowS
show :: RefId -> String
$cshow :: RefId -> String
showsPrec :: Int -> RefId -> ShowS
$cshowsPrec :: Int -> RefId -> ShowS
Show, (forall x. RefId -> Rep RefId x)
-> (forall x. Rep RefId x -> RefId) -> Generic RefId
forall x. Rep RefId x -> RefId
forall x. RefId -> Rep RefId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RefId x -> RefId
$cfrom :: forall x. RefId -> Rep RefId x
Generic)

instance ToAttrVal RefId where
    toAttrVal :: RefId -> Text
toAttrVal = Text -> Text
forall a. ToAttrVal a => a -> Text
toAttrVal (Text -> Text) -> (RefId -> Text) -> RefId -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RefId -> Text
unRefId

instance FromAttrVal RefId where
    fromAttrVal :: Reader RefId
fromAttrVal Text
t = (Text -> RefId) -> (Text, Text) -> (RefId, Text)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Text -> RefId
RefId ((Text, Text) -> (RefId, Text))
-> Either String (Text, Text) -> Either String (RefId, Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Reader Text
forall a. FromAttrVal a => Reader a
fromAttrVal Text
t

instance FromAttrBs RefId where
  fromAttrBs :: ByteString -> Either Text RefId
fromAttrBs = (Text -> RefId) -> Either Text Text -> Either Text RefId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> RefId
RefId (Either Text Text -> Either Text RefId)
-> (ByteString -> Either Text Text)
-> ByteString
-> Either Text RefId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either Text Text
forall a. FromAttrBs a => ByteString -> Either Text a
fromAttrBs

unsafeRefId :: Int -> RefId
unsafeRefId :: Int -> RefId
unsafeRefId Int
num = Text -> RefId
RefId (Text -> RefId) -> Text -> RefId
forall a b. (a -> b) -> a -> b
$ Text
"rId" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text
forall a. Integral a => a -> Text
txti Int
num