Skip to content

Commit acce50e

Browse files
committed
mono-traversable wip
1 parent 12659db commit acce50e

File tree

8 files changed

+103
-53
lines changed

8 files changed

+103
-53
lines changed

ghcjs/lightning-verifier/src/App/Widgets/Bolt11.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import qualified Bitcoin.Address as Btc
1010
import qualified Data.Aeson as A
1111
import qualified Data.ByteString.Base16 as B16
1212
import qualified Data.ByteString.Lazy as BL
13+
import qualified Data.Text.Lazy as TL
1314
import qualified Functora.Bolt11 as B11
1415
import Functora.Miso.Prelude
1516
import qualified Functora.Miso.Widgets.FieldPairs as FieldPairs
@@ -195,7 +196,7 @@ invoiceFields ln =
195196
>>= invoiceFieldsTag ln
196197
)
197198
<> [ pair "Signature"
198-
. toMisoString @Prelude.String
199+
. toMisoString @TL.Text
199200
. B11.inspectHex
200201
$ B11.bolt11SigVal sig,
201202
pair "Pubkey Recovery Flag"
@@ -245,7 +246,7 @@ invoiceFieldsTag ln = \case
245246
hex x =
246247
pure
247248
. pair x
248-
. toMisoString @Prelude.String
249+
. toMisoString @TL.Text
249250
. B11.inspectHex
250251

251252
preimageFields :: MisoString -> ByteString -> [FieldPair DynamicField Identity]

ghcjs/miso-widgets/src/Functora/Miso/Prelude.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Functora.Prelude as X hiding
1717
( Field (..),
1818
String,
1919
Text,
20+
cons,
2021
field,
2122
inspect,
2223
)
@@ -45,9 +46,9 @@ instance Binary MisoString where
4546
get = fmap (toMisoString @Prelude.Text) Binary.get
4647

4748
instance ConvertUtf8 MisoString ByteString where
48-
encodeUtf8 = encodeUtf8 . fromMisoString @Prelude.Text
49-
decodeUtf8 = toMisoString @Prelude.Text . decodeUtf8
50-
decodeUtf8Strict = fmap (toMisoString @Prelude.Text) . decodeUtf8Strict
49+
encodeUtf8 = encodeUtf8 . fromMisoString @Prelude.String
50+
decodeUtf8 = toMisoString @Prelude.String . decodeUtf8
51+
decodeUtf8Strict = fmap (toMisoString @Prelude.String) . decodeUtf8Strict
5152

5253
instance ToJSONKey MisoString where
5354
toJSONKey = contramap (fromMisoString @Prelude.Text) $ toJSONKey

pub/functora/functora.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ common pkg-prelude
103103
, microlens-ghc
104104
, microlens-th
105105
, modern-uri
106+
, mono-traversable
106107
, random
107108
, safe-exceptions
108109
, scientific
@@ -130,7 +131,6 @@ common pkg-qr
130131
, bmp
131132
, bytestring
132133
, qrcode-core
133-
, text
134134
, vector
135135

136136
common pkg-aes

pub/functora/src/bolt11/Functora/Bolt11.hs

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ import qualified Data.ByteString as BS
4040
import qualified Data.ByteString.Base16 as B16
4141
import qualified Data.ByteString.Builder as BS
4242
import qualified Data.ByteString.Lazy.Char8 as BL
43-
import qualified Data.Text as T
44-
import qualified Data.Text.Encoding as T
43+
import qualified Data.Text.Lazy as TL
4544
import Functora.Prelude hiding (error)
4645
import Prelude (Show (..), error)
4746

@@ -51,12 +50,13 @@ newtype Hex = Hex
5150
deriving stock (Eq, Ord, Data, Generic)
5251

5352
instance Show Hex where
54-
show = inspectHex
53+
show =
54+
from @TL.Text @String
55+
. inspectHex
5556

56-
inspectHex :: forall a. (From String a) => Hex -> a
57+
inspectHex :: Hex -> TL.Text
5758
inspectHex =
58-
from @String @a
59-
. BL.unpack
59+
decodeUtf8
6060
. BS.toLazyByteString
6161
. BS.byteStringHex
6262
. unHex
@@ -66,8 +66,7 @@ instance IsString Hex where
6666
Hex
6767
. handler
6868
. B16.decode
69-
. T.encodeUtf8
70-
. T.pack
69+
. encodeUtf8 @String @ByteString
7170
where
7271
#if MIN_VERSION_base16_bytestring(1,0,0)
7372
handler :: Either String ByteString -> ByteString
@@ -126,20 +125,18 @@ data FeatureName
126125
| Unknown_feature
127126
deriving stock (Eq, Ord, Show, Data, Generic)
128127

129-
inspectFeature :: forall a. (From Text a) => Feature -> a
128+
inspectFeature :: forall a. (Textual a) => Feature -> a
130129
inspectFeature x =
131-
from @Text @a
132-
$ "("
130+
"("
133131
<> inspect (featureBits x)
134132
<> ") "
135-
<> T.toLower (inspect $ featureName x)
133+
<> toLower (inspect $ featureName x)
136134
<> " "
137-
<> T.toLower (inspect $ featureRequiredOrSuported x)
135+
<> toLower (inspect $ featureRequiredOrSuported x)
138136

139-
inspectFeatures :: forall a. (From Text a) => [Feature] -> a
137+
inspectFeatures :: (Textual a) => [Feature] -> a
140138
inspectFeatures =
141-
from @Text @a
142-
. T.intercalate ", "
139+
intercalate ", "
143140
. fmap inspectFeature
144141

145142
parseFeatures :: [Word5] -> [Feature]
@@ -211,18 +208,18 @@ data Route = Route
211208
instance A.ToJSON Route where
212209
toJSON x =
213210
A.object
214-
[ "pubkey" A..= inspectHex @Text (routePubKey x),
215-
"short_channel_id" A..= inspectHex @Text (routeShortChanId x),
211+
[ "pubkey" A..= inspectHex (routePubKey x),
212+
"short_channel_id" A..= inspectHex (routeShortChanId x),
216213
"fee_base_msat" A..= routeFeeBaseMsat x,
217214
"fee_proportional_millionths" A..= routeFeePropMillionth x,
218215
"cltv_expiry_delta" A..= routeCltvExpiryDelta x
219216
]
220217
toEncoding x =
221218
A.pairs
222219
$ "pubkey"
223-
A..= inspectHex @Text (routePubKey x)
220+
A..= inspectHex (routePubKey x)
224221
<> "short_channel_id"
225-
A..= inspectHex @Text (routeShortChanId x)
222+
A..= inspectHex (routeShortChanId x)
226223
<> "fee_base_msat"
227224
A..= routeFeeBaseMsat x
228225
<> "fee_proportional_millionths"

pub/functora/src/functora-ghcjs.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ common pkg
105105
, microlens-ghc
106106
, microlens-th
107107
, modern-uri >=0.3.4.4
108+
, mono-traversable
108109
, network-uri
109110
, optparse-applicative
110111
, pkcs7

pub/functora/src/prelude/Functora/Prelude.hs

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ module Functora.Prelude
5959

6060
-- * Parsers
6161
-- $parsers
62-
parseWords,
6362
parseRatio,
6463
utf8FromLatin1,
6564

@@ -110,6 +109,11 @@ module Functora.Prelude
110109
enumerateNE,
111110
nextEnum,
112111
prevEnum,
112+
Textual,
113+
strip,
114+
Mono,
115+
dropAround,
116+
dropWhileEnd,
113117
)
114118
where
115119

@@ -171,6 +175,7 @@ import Data.ByteString.Base58 as X
171175
rippleAlphabet,
172176
)
173177
import qualified Data.ByteString.Lazy as BL
178+
import qualified Data.Char as Char
174179
import qualified Data.Digest.SHA256 as SHA256
175180
import Data.Either.Extra as X (fromEither)
176181
import Data.Fixed as X (Pico)
@@ -193,10 +198,41 @@ import qualified Data.HMAC as HMAC
193198
import Data.List.Extra as X (enumerate, notNull, nubOrd, nubOrdBy, nubOrdOn)
194199
import qualified Data.Map.Merge.Strict as Map
195200
import Data.Maybe as X (listToMaybe)
201+
import qualified Data.MonoTraversable as Mono
202+
import Data.MonoTraversable.Unprefixed as X (intercalate)
196203
import Data.Ratio as X ((%))
197204
import Data.Scientific as X (Scientific)
198205
import qualified Data.Scientific as Scientific
199206
import qualified Data.Semigroup as Semigroup
207+
import Data.Sequences as X hiding
208+
( Textual,
209+
Utf8 (..),
210+
break,
211+
catMaybes,
212+
drop,
213+
dropWhile,
214+
filter,
215+
filterM,
216+
find,
217+
fromList,
218+
group,
219+
groupBy,
220+
intersperse,
221+
isPrefixOf,
222+
permutations,
223+
replicate,
224+
replicateM,
225+
reverse,
226+
sort,
227+
sortBy,
228+
sortOn,
229+
splitAt,
230+
subsequences,
231+
take,
232+
takeWhile,
233+
uncons,
234+
)
235+
import qualified Data.Sequences as Seq
200236
import Data.Tagged as X (Tagged (..))
201237
import qualified Data.Text as T
202238
import Data.Text.Encoding as X (decodeLatin1)
@@ -252,7 +288,11 @@ import Universum as X hiding
252288
finally,
253289
fromInteger,
254290
fromIntegral,
291+
fromStrict,
255292
handleAny,
293+
inits,
294+
intercalate,
295+
lines,
256296
on,
257297
over,
258298
preview,
@@ -261,10 +301,15 @@ import Universum as X hiding
261301
show,
262302
state,
263303
swap,
304+
tails,
264305
throwM,
306+
toStrict,
265307
try,
266308
tryAny,
309+
unlines,
310+
unwords,
267311
view,
312+
words,
268313
(%~),
269314
(.~),
270315
(^.),
@@ -644,9 +689,6 @@ throwString =
644689
-- $parsers
645690
-- Parsers
646691

647-
parseWords :: forall a. (From a Text) => a -> [Text]
648-
parseWords = filter (not . null) . T.splitOn " " . from @a @Text
649-
650692
parseRatio ::
651693
forall str int m.
652694
( From str Text,
@@ -986,3 +1028,32 @@ prevEnum :: (Eq a, Enum a, Bounded a) => a -> a
9861028
prevEnum x
9871029
| x == minBound = maxBound
9881030
| otherwise = pred x
1031+
1032+
type Textual mono =
1033+
( Seq.Textual mono,
1034+
Container mono
1035+
)
1036+
1037+
strip :: (Textual mono) => mono -> mono
1038+
strip =
1039+
dropAround Char.isSpace
1040+
1041+
type Mono a mono =
1042+
( a ~ Mono.Element mono,
1043+
Seq.IsSequence mono,
1044+
Container mono
1045+
)
1046+
1047+
dropAround :: (Mono a mono) => (a -> Bool) -> mono -> mono
1048+
dropAround f =
1049+
Seq.dropWhile f . dropWhileEnd f
1050+
1051+
dropWhileEnd :: (Mono a mono) => (a -> Bool) -> mono -> mono
1052+
dropWhileEnd f =
1053+
Mono.ofoldr
1054+
( \x xs ->
1055+
if f x && null xs
1056+
then mempty
1057+
else Seq.cons x xs
1058+
)
1059+
mempty

pub/functora/src/qr/Functora/Qr.hs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module Functora.Qr
66

77
-- * URL
88
qrToBmpDataUrlBL,
9-
qrToBmpDataUrlTL,
109
)
1110
where
1211

@@ -16,8 +15,6 @@ import Codec.QRCode (QRImage (..))
1615
import qualified Data.ByteString as BS
1716
import qualified Data.ByteString.Base64.Lazy as B64L
1817
import qualified Data.ByteString.Lazy as BL
19-
import qualified Data.ByteString.Lazy.Char8 as BLC8
20-
import qualified Data.Text.Lazy as TL
2118
import qualified Data.Vector.Unboxed as UV
2219
import Functora.Prelude
2320

@@ -109,21 +106,3 @@ qrToBmpDataUrlBL border scale =
109106
. B64L.encode
110107
. BMP.renderBMP
111108
. qrToBmp border scale
112-
113-
-- | Convert an QR code into a text-like Uri.
114-
-- Has the same arguments as `qrToBmp`.
115-
-- This can be used to display a image in HTML without creating a temporary file.
116-
qrToBmpDataUrlTL ::
117-
forall a.
118-
( From TL.Text a
119-
) =>
120-
Border ->
121-
Scale ->
122-
QRImage ->
123-
a
124-
{-# INLINE qrToBmpDataUrlTL #-}
125-
qrToBmpDataUrlTL border scale =
126-
from @TL.Text @a
127-
. TL.pack
128-
. BLC8.unpack
129-
. qrToBmpDataUrlBL border scale

pub/functora/src/test/Functora/QrSpec.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ spec = do
3333
putStrLn . Prelude.show $ diffUTCTime ts1 ts0
3434
True `shouldBe` True
3535
it "qrToBmpDataUrlTL/0/0" $ do
36-
qrToBmpDataUrlTL @Text 0 0 <$> sample
36+
qrToBmpDataUrlBL @ByteString 0 0 <$> sample
3737
`shouldBe` Just
3838
"data:image/bmp;base64,Qk0aBwAAAAAAADYAAAAoAAAAFQAAABUAAAABACAAAAAAAOQGAAASCwAAEgsAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////AAAA////////////AAAA////////////AAAA//////8AAAD///////////////////////////8AAAD/AAAA//////8AAAD/AAAA/wAAAP//////AAAA////////////AAAA/wAAAP////////////////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP//////AAAA////////////AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD/AAAA////////////////////////////AAAA////////////AAAA//////8AAAD///////////8AAAD///////////////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD//////wAAAP//////AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/////////////////////////////////////////////////AAAA////////////AAAA//////////////////////////////////////////////////////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD///////////8AAAD/AAAA/wAAAP////////////////8AAAD///////////8AAAD///////////8AAAD/AAAA/wAAAP///////////wAAAP////////////////8AAAD/AAAA//////8AAAD///////////////////////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////AAAA/////////////////////////////////wAAAP///////////wAAAP8AAAD/AAAA//////////////////////8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA//////8AAAD/////////////////////////////////////////////////AAAA////////////AAAA/wAAAP8AAAD/AAAA/////////////////wAAAP////////////////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD///////////////////////////////////////////8AAAD//////wAAAP///////////wAAAP//////AAAA//////8AAAD/AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////////////////////8AAAD///////////8AAAD/AAAA//////////////////////8AAAD/AAAA////////////////////////////AAAA//////8AAAD/AAAA////////////////////////////AAAA/wAAAP8AAAD//////wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP8AAAD/////////////////AAAA////////////AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP//////AAAA////////////AAAA////////////AAAA//////8AAAD/////////////////AAAA/wAAAP//////AAAA//////8AAAD/AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP//////AAAA/////////////////wAAAP////////////////8AAAD/AAAA////////////////////////////AAAA////////////////////////////AAAA/wAAAP8AAAD/////////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////AAAA/////////////////////////////////wAAAP//////AAAA//////8AAAD/"
3939
it "qrToBmpDataUrlTL/1/0" $ do
40-
qrToBmpDataUrlTL @Text 1 0 <$> sample
40+
qrToBmpDataUrlBL @ByteString 1 0 <$> sample
4141
`shouldBe` Just
4242
"data:image/bmp;base64,Qk16CAAAAAAAADYAAAAoAAAAFwAAABcAAAABACAAAAAAAEQIAAASCwAAEgsAAAAAAAAAAAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////8AAAD///////////////////////////8AAAD///////////8AAAD///////////8AAAD//////wAAAP///////////////////////////wAAAP///////////wAAAP//////AAAA/wAAAP8AAAD//////wAAAP///////////wAAAP8AAAD/////////////////AAAA//////8AAAD/AAAA/wAAAP//////AAAA////////////AAAA//////8AAAD/AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD///////////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD///////////8AAAD/AAAA//////8AAAD//////wAAAP//////AAAA/wAAAP8AAAD//////wAAAP///////////wAAAP///////////////////////////wAAAP///////////wAAAP//////AAAA////////////AAAA////////////////////////////AAAA////////////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD//////wAAAP//////AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD///////////////////////////////////////////////////////////8AAAD///////////8AAAD/////////////////////////////////////////////////////////////////AAAA//////8AAAD/AAAA/wAAAP//////AAAA////////////AAAA/wAAAP8AAAD/////////////////AAAA////////////AAAA//////////////////////8AAAD/AAAA/wAAAP///////////wAAAP////////////////8AAAD/AAAA//////8AAAD///////////////////////////8AAAD///////////8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD/////////////////////////////////AAAA////////////AAAA/wAAAP8AAAD/////////////////////////////////AAAA/wAAAP8AAAD/AAAA////////////AAAA/wAAAP//////AAAA////////////////////////////////////////////////////////////AAAA////////////AAAA/wAAAP8AAAD/AAAA/////////////////wAAAP////////////////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD//////////////////////////////////////////////////////wAAAP//////AAAA////////////AAAA//////8AAAD//////wAAAP8AAAD/AAAA/////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////////////////////AAAA////////////AAAA/wAAAP//////////////////////AAAA////////////AAAA////////////////////////////AAAA//////8AAAD/AAAA////////////////////////////AAAA/wAAAP8AAAD//////wAAAP8AAAD///////////8AAAD//////wAAAP8AAAD/AAAA//////8AAAD//////wAAAP//////AAAA/wAAAP////////////////8AAAD///////////8AAAD//////wAAAP///////////wAAAP//////AAAA/wAAAP8AAAD//////wAAAP///////////wAAAP///////////wAAAP//////AAAA/////////////////wAAAP8AAAD/////////////////AAAA//////8AAAD/AAAA/wAAAP//////AAAA//////8AAAD//////wAAAP//////AAAA/////////////////wAAAP////////////////8AAAD///////////8AAAD///////////////////////////8AAAD///////////////////////////8AAAD/AAAA/wAAAP////////////////8AAAD/AAAA/wAAAP///////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP///////////wAAAP////////////////////////////////8AAAD//////wAAAP//////AAAA/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w=="

0 commit comments

Comments
 (0)