aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/specification/lux/abstract/codec.lux
blob: acbc076470dec6fe491946b15d7a94331dc75e22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(.require
 [library
  [lux (.except)
   ["_" test (.only Test)]
   [abstract
    [monad (.only do)]]
   [control
    ["[0]" try]]
   [math
    ["[0]" random (.only Random)]]]]
 [\\library
  ["[0]" / (.only)
   [//
    [equivalence (.only Equivalence)]]]])

(def .public (spec (open "@//[0]") (open "@//[0]") generator)
  (All (_ m a) (-> (Equivalence a) (/.Codec m a) (Random a) Test))
  (do random.monad
    [expected generator]
    (_.for [/.Codec]
           (_.property "Isomorphism."
             (case (|> expected @//encoded @//decoded)
               {try.#Success actual}
               (@//= expected actual)
               
               {try.#Failure _}
               false)))))