UNPKG

3.85 kBJavaScriptView Raw
1import { intersect } from './Decoder';
2import { memoize } from './Schemable';
3import { identity } from 'fp-ts/es6/function';
4// -------------------------------------------------------------------------------------
5// constructors
6// -------------------------------------------------------------------------------------
7/**
8 * @since 2.2.3
9 */
10export function id() {
11 return {
12 encode: identity
13 };
14}
15// -------------------------------------------------------------------------------------
16// combinators
17// -------------------------------------------------------------------------------------
18/**
19 * @since 2.2.3
20 */
21export function nullable(or) {
22 return {
23 encode: function (a) { return (a === null ? null : or.encode(a)); }
24 };
25}
26/**
27 * @since 2.2.3
28 */
29export function type(properties) {
30 return {
31 encode: function (a) {
32 var o = {};
33 for (var k in properties) {
34 o[k] = properties[k].encode(a[k]);
35 }
36 return o;
37 }
38 };
39}
40/**
41 * @since 2.2.3
42 */
43export function partial(properties) {
44 return {
45 encode: function (a) {
46 var o = {};
47 for (var k in properties) {
48 var v = a[k];
49 // don't add missing properties
50 if (k in a) {
51 // don't strip undefined properties
52 o[k] = v === undefined ? undefined : properties[k].encode(v);
53 }
54 }
55 return o;
56 }
57 };
58}
59/**
60 * @since 2.2.3
61 */
62export function record(codomain) {
63 return {
64 encode: function (r) {
65 var o = {};
66 for (var k in r) {
67 o[k] = codomain.encode(r[k]);
68 }
69 return o;
70 }
71 };
72}
73/**
74 * @since 2.2.3
75 */
76export function array(items) {
77 return {
78 encode: function (as) { return as.map(items.encode); }
79 };
80}
81/**
82 * @since 2.2.3
83 */
84export function tuple() {
85 var components = [];
86 for (var _i = 0; _i < arguments.length; _i++) {
87 components[_i] = arguments[_i];
88 }
89 return {
90 encode: function (as) { return components.map(function (c, i) { return c.encode(as[i]); }); }
91 };
92}
93/**
94 * @since 2.2.3
95 */
96export function intersection(left, right) {
97 return {
98 encode: function (ab) { return intersect(left.encode(ab), right.encode(ab)); }
99 };
100}
101/**
102 * @since 2.2.3
103 */
104export function sum(tag) {
105 return function (members) {
106 return {
107 encode: function (a) { return members[a[tag]].encode(a); }
108 };
109 };
110}
111/**
112 * @since 2.2.3
113 */
114export function lazy(f) {
115 var get = memoize(f);
116 return {
117 encode: function (a) { return get().encode(a); }
118 };
119}
120// -------------------------------------------------------------------------------------
121// pipeables
122// -------------------------------------------------------------------------------------
123/**
124 * @since 2.2.3
125 */
126export var contramap = function (f) { return function (fa) {
127 return contramap_(fa, f);
128}; };
129var contramap_ = function (fa, f) { return ({
130 encode: function (b) { return fa.encode(f(b)); }
131}); };
132/**
133 * @since 2.2.3
134 */
135export var compose = function (ea) { return function (ab) {
136 return compose_(ab, ea);
137}; };
138var compose_ = function (ab, ea) { return ({
139 encode: function (b) { return ea.encode(ab.encode(b)); }
140}); };
141// -------------------------------------------------------------------------------------
142// instances
143// -------------------------------------------------------------------------------------
144/**
145 * @since 2.2.3
146 */
147export var URI = 'io-ts/Encoder';
148/**
149 * @since 2.2.3
150 */
151export var contravariantEncoder = {
152 URI: URI,
153 contramap: contramap_
154};
155/**
156 * @since 2.2.3
157 */
158export var categoryEncoder = {
159 URI: URI,
160 compose: compose_,
161 id: id
162};