Skip to content

Instantly share code, notes, and snippets.

@sergeytsivin
Created July 23, 2019 05:42
Show Gist options
  • Save sergeytsivin/33b9c7fbbe38d1560c0b30889e6db006 to your computer and use it in GitHub Desktop.
Save sergeytsivin/33b9c7fbbe38d1560c0b30889e6db006 to your computer and use it in GitHub Desktop.
typedef DataItemTransformer = Object Function(Map<String, dynamic> item);
class HasNext<T extends Object> {
const HasNext({
this.hasNext,
this.data,
});
HasNext.fromMap(
Map<String, dynamic> map, DataItemTransformer dataItemTransformer)
: hasNext = map['has_next'],
data = List.from(map['data'])
.fold<List<T>>(<T>[], _buildItemsFilter<T>(dataItemTransformer))
.cast<T>()
.toList();
final bool hasNext;
final List<T> data;
static List<T> Function(List<T> acc, Map<String, dynamic> item)
_buildItemsFilter<T extends Object>(
DataItemTransformer dataItemTransformer) =>
(List<T> acc, dynamic item) {
try {
acc.add(dataItemTransformer(item));
} catch (_) {}
return acc;
};
}
void main() {
const response = {
"has_next": false,
"data": [
{
"name": "Эксперт",
"periodicity": "weekly",
"is_collected": false,
"latest_issue": {
"timestamp": 1563148800,
"cover":
"https://lib.public.ru/media/v2/issues/14489/pages/1.jpg/resize/120x-?1563142993",
"id": 14489
},
"type": "magazine",
"id": 2
},
{
"name": "Forbes",
"periodicity": "monthly",
"is_collected": false,
"latest_issue": {
"timestamp": 1561939200,
"cover":
"https://lib.public.ru/media/v2/issues/14100/pages/1.jpg/resize/120x-?1562676207",
"id": 14100
},
"type": "magazine",
"id": 45
}
]
};
final h = HasNext.fromMap(response, (x) => x);
print(h);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment