on 47d0463 help sign in
cabal.projectdeleted−11
since splitsnapshots
unifiedsplit
@@ -1,11 +0,0 @@
1−packages:
2− .
3−
4−-- To compile with js-backend use this:
5−source-repository-package
6− type: git
7− location: https://github.com/typeable/uuid.git
8− tag: 49f50ae517de0e4d5dfbf783edc61e71cfd54d6b
9− subdir:
10− uuid
11− uuid-types
id.cabal+25−71
@@ -1,85 +1,39 @@
1−cabal-version: 2.4
1+cabal-version: 2.4
2−name: id
3−version: 0.2.0.0
4−license-file: LICENSE
5
2
6−flag cassava
3+name: id
7− description: Enable Postgresql support
4+version: 0.1.0.0
8− default: True
5+license-file: LICENSE
9− manual: False
10−
11−flag postgres
12− description: Enable Postgresql support
13− default: True
14− manual: False
15−
16−flag flat
17− description: Enable Flat serialization support
18− default: True
19− manual: False
20−
21−flag store
22− description: Enable Data.Store serialization support
23− default: False
24− manual: False
25−
26−flag uuid-impl
27− description: Include some functions with extra dependencies.
28− Disable to reduce dependencies.
29− default: True
30− manual: False
31
6
32library
7library
33− exposed-modules: Data.Id
8+ exposed-modules:
9+ Data.Id
10+ -- other-modules:
11+ -- other-extensions:
34 build-depends:
12 build-depends:
35− , aeson >=1.0
13+ aeson,
36− , base >=4.12 && <5
14+ base >=4.12 && <5,
37− , binary
15+ binary,
38− , deepseq
16+ deepseq,
17+ QuickCheck,
39− , hashable
18+ hashable,
40− , http-api-data
19+ http-api-data,
41− , lens
20+ lens,
21+ openapi3,
22+ uuid,
42− , path-pieces
23+ path-pieces,
43− , text
44− , uuid-types
45− if flag(uuid-impl)
46− build-depends:
47− , uuid >=1.3.9
48− cpp-options: -DUSE_UUID
49−
50− if !(impl(ghcjs) || arch(javascript) || arch(wasm32))
24+ if !impl(ghcjs)
51 build-depends:
25 build-depends:
52− , openapi3
53− , QuickCheck
54−
55− cpp-options: -DBACKEND
56−
57− if (flag(postgres) && !(impl(ghcjs) || arch(javascript) || arch(wasm32)))
58− build-depends: postgresql-simple
26+ postgresql-simple,
59− cpp-options: -DUSE_POSTGRES
60−
61− if (flag(cassava) && !(impl(ghcjs) || arch(javascript) || arch(wasm32)))
62− build-depends: cassava
63− cpp-options: -DUSE_CASSAVA
64−
65− if flag(flat)
66− build-depends: flat >=0.4
67− cpp-options: -DUSE_FLAT
68−
69− if flag(store)
70− build-depends: store
71− cpp-options: -DUSE_STORE
72−
73− hs-source-dirs: src
27+ hs-source-dirs:
28+ src
74− default-language: Haskell2010
29+ default-language:
30+ Haskell2010
75 default-extensions:
31 default-extensions:
76 AllowAmbiguousTypes
32 AllowAmbiguousTypes
77 DeriveGeneric
33 DeriveGeneric
78− DerivingStrategies
79 GeneralizedNewtypeDeriving
34 GeneralizedNewtypeDeriving
80 PolyKinds
35 PolyKinds
81 RankNTypes
36 RankNTypes
82 RoleAnnotations
37 RoleAnnotations
83− ScopedTypeVariables
84 TypeApplications
38 TypeApplications
85 TypeFamilies
39 TypeFamilies
src/Data/Id.hs+25−208
@@ -4,140 +4,64 @@
4{-# OPTIONS_GHC -Wno-orphans #-}
4{-# OPTIONS_GHC -Wno-orphans #-}
5
5
6module Data.Id
6module Data.Id
7− ( Id, mkId, unId, unsafeIdTagConvert, coerceId, _Id, nilId
7+ ( Id(..)
8− , IntId, mkIntId, unIntId, unsafeIntIdTagConvert, coerceIntId, _IntId
8+ , coerceId
9− , Name, mkName, unName, unsafeNameTagConvert, coerceName, _Name
9+ , nilId
10−#ifdef USE_UUID
10+ , _Id
11− , randomId
12−#endif
13− )
14− where
11+ ) where
15
12
16import Control.DeepSeq (NFData)
13import Control.DeepSeq (NFData)
17import Control.Lens
14import Control.Lens
18−import Control.Monad
19import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey)
15import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey)
20import Data.Binary (Binary)
16import Data.Binary (Binary)
21import Data.Coerce (coerce)
17import Data.Coerce (coerce)
22import Data.Data
18import Data.Data
23import Data.Hashable (Hashable)
19import Data.Hashable (Hashable)
24−import Data.String
25−import Data.Text as T
26−import Data.UUID.Types (UUID)
27−import qualified Data.UUID.Types as UUID
28−import GHC.TypeLits
29−import Prelude as P
30−import Text.ParserCombinators.ReadP
31−import Web.HttpApiData
32−import Web.PathPieces (PathPiece(..))
33−
34−#ifdef USE_UUID
35−import qualified Data.UUID.V4 as UUID.V4
36−#endif
37−#ifdef BACKEND
38import Data.OpenApi
20import Data.OpenApi
39−import Test.QuickCheck
21+import Data.UUID (UUID)
40−#ifdef USE_CASSAVA
41−import Data.Csv as Csv hiding(Name)
42−#endif
43−#ifdef USE_POSTGRES
44−import Database.PostgreSQL.Simple.FromField as PG (FromField)
45−import Database.PostgreSQL.Simple.ToField as PG (ToField)
46−#endif
47−#endif
48−
49−#ifdef USE_FLAT
50−import Flat as F
51−#endif
52−#ifdef USE_STORE
53−import qualified Data.Store
22+import qualified Data.UUID as UUID
23+#ifndef ghcjs_HOST_OS
24+import Database.PostgreSQL.Simple.FromField (FromField)
25+import Database.PostgreSQL.Simple.ToField (ToField)
54#endif
26#endif
27+import GHC.Generics (Generic)
28+import Test.QuickCheck
29+import Web.HttpApiData
30+import Web.PathPieces (PathPiece(..))
55
31
56newtype Id t = Id { unId :: UUID }
32newtype Id t = Id { unId :: UUID }
57− deriving stock Data
33+ deriving
58− deriving newtype
34+ ( Eq, Ord, Generic, Read, Show, Data
59− ( Eq, Ord, Binary
60#ifndef ghcjs_HOST_OS
35#ifndef ghcjs_HOST_OS
61−#ifdef USE_POSTGRES
62− , PG.ToField, PG.FromField
36+ , ToField, FromField
63−#endif
64−#endif
65− , FromJSON, ToJSON, NFData, Hashable, FromJSONKey, ToJSONKey
66−#ifdef BACKEND
67− , ToSchema, ToParamSchema
68#endif
37#endif
38+ , PathPiece, FromJSON
39+ , ToJSON, NFData, Hashable, FromJSONKey, ToJSONKey, ToSchema, ToParamSchema
69 , FromHttpApiData, ToHttpApiData )
40 , FromHttpApiData, ToHttpApiData )
70
41
71type role Id nominal
42type role Id nominal
72
43
73−makePrisms ''Id
74−
75−mkId :: forall s. UUID -> Id s
76−mkId = coerce
77−{-# INLINE mkId #-}
78−
79−#ifdef USE_UUID
80−randomId :: forall s. IO (Id s)
81−randomId = coerce <$> UUID.V4.nextRandom
82−{-# INLINE randomId #-}
83−#endif
84−
85−instance KnownSymbol s => Show (Id s) where
86− show (Id v) = "Id-" <> symbolVal (Proxy @s) <> "-" <> P.show v
87−
88−instance KnownSymbol s => Read (Id s) where
89− readsPrec _ = readP_to_S $ do
90− _ <- string ("Id-" <> symbolVal (Proxy @s) <> "-")
91− mkId <$> readS_to_P reads
92−
93−#ifdef USE_FLAT
94−instance Flat (Id s) where
95− encode = F.encode . UUID.toWords . coerce
96− decode = coerce . (\(a,b,c,d) -> UUID.fromWords a b c d) <$> F.decode
97− size = F.size . UUID.toWords . coerce
98−#endif
99−
100−#ifdef USE_STORE
101−instance Data.Store.Store (Id s) where
102− poke = Data.Store.poke . UUID.toWords . coerce
103− peek = coerce . (\(a,b,c,d) -> UUID.fromWords a b c d) <$> Data.Store.peek
104− size = Data.Store.ConstSize 16
105−#endif
106−
107−#ifdef BACKEND
108instance Arbitrary (Id t) where
44instance Arbitrary (Id t) where
109 arbitrary = fmap Id $ UUID.fromWords
45 arbitrary = fmap Id $ UUID.fromWords
110 <$> arbitrary
46 <$> arbitrary
111 <*> arbitrary
47 <*> arbitrary
112 <*> arbitrary
48 <*> arbitrary
113 <*> arbitrary
49 <*> arbitrary
114−#endif
115−
116−instance PathPiece (Id t) where
117− fromPathPiece = coerce . UUID.fromText
118− toPathPiece = UUID.toText . coerce
119−
120−#ifndef ghcjs_HOST_OS
121
50
122−#ifdef USE_CASSAVA
123−instance Csv.FromField (Id tag) where
51+instance Binary (Id t) where
124− parseField = parseField
125− >=> fmap mkId . maybe (fail "invalid UUID in CSV") pure . UUID.fromText
126
52
127−instance Csv.ToField (Id tag) where
53+instance PathPiece UUID.UUID where
128− toField = Csv.toField . UUID.toText . coerce
54+ fromPathPiece = UUID.fromText
129−#endif
55+ toPathPiece = UUID.toText
130
56
131−#endif
57+makePrisms ''Id
132
58
133-- | This is a more \"explicit\" 'coerce' specifically for 'Id'.
59-- | This is a more \"explicit\" 'coerce' specifically for 'Id'.
134-- You are forced to explicitly specify the phantom types you are converting
60-- You are forced to explicitly specify the phantom types you are converting
135-- via the @TypeApplications@ compiler extension.
61-- via the @TypeApplications@ compiler extension.
136−coerceId, unsafeIdTagConvert :: forall a b. Id (Ambiguous a) -> Id (Ambiguous b)
62+coerceId :: forall a b. Id (Ambiguous a) -> Id (Ambiguous b)
137coerceId = coerce
63coerceId = coerce
138{-# INLINE coerceId #-}
64{-# INLINE coerceId #-}
139−unsafeIdTagConvert = coerce
140−{-# INLINE unsafeIdTagConvert #-}
141
65
142-- | Id corresponding to UUID nil. Useful for testing etc.
66-- | Id corresponding to UUID nil. Useful for testing etc.
143nilId :: forall a. Id (Ambiguous a)
67nilId :: forall a. Id (Ambiguous a)
@@ -146,110 +70,3 @@ nilId = Id UUID.nil
146-- https://kcsongor.github.io/ambiguous-tags/
70-- https://kcsongor.github.io/ambiguous-tags/
147type family Ambiguous (a :: k) :: j where
71type family Ambiguous (a :: k) :: j where
148 Ambiguous x = x
72 Ambiguous x = x
149−
150−----------------- IntId
151−newtype IntId t = IntId { unIntId :: Integer }
152− deriving stock Data
153− deriving newtype
154− ( Eq, Ord, Binary
155−#ifndef ghcjs_HOST_OS
156−#ifdef USE_POSTGRES
157− , PG.ToField, PG.FromField
158−#endif
159−#ifdef USE_CASSAVA
160− , Csv.ToField, Csv.FromField
161−#endif
162−#endif
163−#ifdef USE_FLAT
164− , Flat
165−#endif
166−#ifdef USE_STORE
167− , Data.Store.Store
168−#endif
169−#ifdef BACKEND
170− , ToSchema, ToParamSchema, Arbitrary
171−#endif
172− , FromJSON, ToJSON, NFData, Hashable, FromJSONKey, ToJSONKey, FromHttpApiData
173− , ToHttpApiData, PathPiece, Num, Integral, Real, Enum )
174−
175−type role IntId nominal
176−
177−makePrisms ''IntId
178−
179−mkIntId :: forall s. Integer -> IntId s
180−mkIntId = coerce
181−{-# INLINE mkIntId #-}
182−
183−instance KnownSymbol s => Show (IntId s) where
184− show (IntId v) = "IntId-" <> symbolVal (Proxy @s) <> "-" <> P.show v
185−
186−instance KnownSymbol s => Read (IntId s) where
187− readsPrec _ = readP_to_S $ do
188− _ <- string ("IntId-" <> symbolVal (Proxy @s) <> "-")
189− mkIntId <$> readS_to_P reads
190−
191−-- | This is a more \"explicit\" 'coerce' specifically for 'IntId'.
192−-- You are forced to explicitly specify the phantom types you are converting
193−-- via the @TypeApplications@ compiler extension.
194−coerceIntId, unsafeIntIdTagConvert
195− :: forall a b. IntId (Ambiguous a) -> IntId (Ambiguous b)
196−coerceIntId = coerce
197−{-# INLINE coerceIntId #-}
198−unsafeIntIdTagConvert = coerce
199−{-# INLINE unsafeIntIdTagConvert #-}
200−
201−----------------- Name
202−newtype Name t = Name { unName :: Text }
203− deriving stock Data
204− deriving newtype
205− ( Eq, Ord, Binary
206−#ifndef ghcjs_HOST_OS
207−#ifdef USE_POSTGRES
208− , PG.ToField, PG.FromField
209−#endif
210−#ifdef USE_CASSAVA
211− , Csv.ToField, Csv.FromField
212−#endif
213−#endif
214−#ifdef USE_FLAT
215− , Flat
216−#endif
217−#ifdef USE_STORE
218− , Data.Store.Store
219−#endif
220−#ifdef BACKEND
221− , ToSchema, ToParamSchema
222−#endif
223− , FromJSON, ToJSON, NFData, Hashable, FromJSONKey, ToJSONKey, FromHttpApiData
224− , ToHttpApiData, PathPiece, IsString, Semigroup, Monoid )
225−
226−type role Name nominal
227−
228−makePrisms ''Name
229−
230−mkName :: forall s. Text -> Name s
231−mkName = coerce
232−{-# INLINE mkName #-}
233−
234−instance KnownSymbol s => Show (Name s) where
235− show (Name v) = "Name-" <> symbolVal (Proxy @s) <> "-" <> P.show v
236−
237−instance KnownSymbol s => Read (Name s) where
238− readsPrec _ = readP_to_S $ do
239− _ <- string ("Name-" <> symbolVal (Proxy @s) <> "-")
240− mkName <$> readS_to_P reads
241−
242−#ifdef BACKEND
243−instance Arbitrary (Name s) where
244− arbitrary = coerce . T.pack . getPrintableString <$> arbitrary
245−#endif
246−
247−-- | This is a more \"explicit\" 'coerce' specifically for 'Name'.
248−-- You are forced to explicitly specify the phantom types you are converting
249−-- via the @TypeApplications@ compiler extension.
250−coerceName, unsafeNameTagConvert
251− :: forall a b. Name (Ambiguous a) -> Name (Ambiguous b)
252−coerceName = coerce
253−{-# INLINE coerceName #-}
254−unsafeNameTagConvert = coerce
255−{-# INLINE unsafeNameTagConvert #-}
stack.yamldeleted−4
@@ -1,4 +0,0 @@
1−resolver: lts-18.18
2−
3−packages:
4−- .