src/RelationshipsCache.ts   A
last analyzed

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 86
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 91.67%

Importance

Changes 0
Metric Value
wmc 2
eloc 68
mnd 2
bc 2
fnc 0
dl 0
loc 86
ccs 22
cts 24
cp 0.9167
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import {Monoid} from 'fp-ts/lib/Monoid';
2
import * as t from 'io-ts';
3 1
import {Lens} from 'monocle-ts';
4 1
import {ArrayC} from './io/ArrayC';
5 1
import {RelationshipsCacheC} from './io/RelationshipsCacheC';
6 1
import {RelationshipsRecord} from './RelationshipsRecord';
7 1
import {ResourceIdentifier} from './ResourceIdentifier';
8
9
export interface RelationshipsCache extends t.TypeOf<typeof RelationshipsCacheC> {
10
}
11
12 1
const fromRelationships = (x: RelationshipsCache | RelationshipsRecord): RelationshipsCache =>
13 105
  RelationshipsCacheC.is(x)
14
    ? x
15
    : [0, {}, x];
16
17 1
const lenses = {
18
  counter: new Lens<RelationshipsCache, number>(
19 80
    s => s[0],
20
    a => s => ([a, s[1], s[2]])
21
  ),
22
  global: new Lens<RelationshipsCache, RelationshipsRecord>(
23 80
    s => s[1],
24
    a => s => ([s[0], a, s[2]])
25
  ),
26
  local: new Lens<RelationshipsCache, RelationshipsRecord>(
27 137
    s => s[2],
28 12
    a => s => ([s[0], s[1], a])
29
  )
30
};
31
32 1
const monoid: Monoid<RelationshipsCache | RelationshipsRecord> = {
33
  empty: [0, {}, {}],
34
  concat: (x, y): RelationshipsCache => {
35 40
    const [xs, ys] = [x, y].map(fromRelationships) as [RelationshipsCache, RelationshipsCache];
36 40
    const locals = Object.values(lenses.local.get(ys))
37
      .reduce<Array<ResourceIdentifier>>(
38
        (
39
          array: Array<ResourceIdentifier>,
40
          item: ResourceIdentifier | Array<ResourceIdentifier>
41 15
        ): Array<ResourceIdentifier> => ([
42
          ...array,
43
          ...(ArrayC<ResourceIdentifier>().is(item) ? item : [item])
44
        ]),
45
        []
46
      );
47
48 40
    return [
49
      lenses.counter.get(xs) + (lenses.counter.get(ys) || locals.length),
50
      {
51
        ...lenses.global.get(xs),
52
        ...lenses.global.get(ys),
53
        ...locals.reduce(
54 17
          (record: RelationshipsRecord, identifier: ResourceIdentifier): RelationshipsRecord => ({
55
            ...record,
56
            [ResourceIdentifier.iso.string.get(identifier)]: identifier
57
          }),
58
          {}
59
        )
60
      },
61
      {
62
        ...lenses.local.get(xs),
63
        ...lenses.local.get(ys)
64
      }
65
    ];
66
  }
67
};
68
69 1
export const RelationshipsCache = {
70
  fromRelationships: fromRelationships,
71
  emptyLocal: (cache: RelationshipsCache | RelationshipsRecord): RelationshipsCache =>
72 8
    lenses.local.set({})(fromRelationships(cache)),
73
  nestLocal: (cache: RelationshipsCache | RelationshipsRecord, key: string): RelationshipsCache =>
74 4
    ((cache: RelationshipsCache): RelationshipsCache =>
75 4
      lenses.local.set(
76
        RelationshipsRecord.nest(
77
          lenses.local.get(cache),
78
          key
79
        )
80
      )(cache))(fromRelationships(cache)),
81
  lens: lenses,
82
  monoid: {
83
    self: monoid
84
  }
85
};
86